GKE での Cloud DNS のトラブルシューティング


このページでは、Google Kubernetes Engine(GKE)で Cloud DNS に関する問題を解決する方法について説明します。

Cloud DNS の DNS の問題の原因を特定する

dial tcp: i/o timeoutno such hostCould not resolve host などのエラーは、多くの場合、Cloud DNS がクエリを解決する機能に問題があることを示します。

上記のエラーが表示されたが原因がわからない場合は、次のセクションで原因を特定してください。各セクションは、最も役立つと思われる手順から順に並べられているため、各セクションを順番に試してください。

基本設定を確認する

Pod が DNS ルックアップを解決できない場合は、Cloud DNS が適切に構成されていることを確認します。このセクションでは、Cloud DNS を使用しているかどうかを確認します。また、GKE クラスタの限定公開 DNS ゾーンの存在を確認して、ターゲット サービスの DNS レコードの精度を確認します。

これらの設定を確認するには、次のコマンドを実行します。

  1. Pod が使用している DNS サーバーを確認します。

    kubectl exec -it POD_NAME -- cat /etc/resolv.conf | grep nameserver
    

    POD_NAME は、DNS 解決で問題が発生している Pod の名前に置き換えます。

    Cloud DNS を使用している場合、出力は次のようになります。

    nameserver 169.254.169.254
    

    他の値が表示されている場合は、Cloud DNS を使用していません。Cloud DNS が適切に有効になっていることを確認します。

  2. マネージド ゾーンが存在することを確認します。

    gcloud dns managed-zones list --format list
    

    出力は次のようになります。

    - creationTime: 2021-02-12T19:24:37.045Z
      description: Private zone for GKE cluster "" with cluster suffix "CLUSTER_DOMAIN" in project "PROJECT_ID"
      dnsName: CLUSTER_DOMAIN.
      id: 5887499284756055830
      kind: dns#managedZone
      name: gke-CLUSTER_NAME-aa94c1f9-dns
      nameServers: ['ns-gcp-private.googledomains.com.']
      privateVisibilityConfig: {'kind': 'dns#managedZonePrivateVisibilityConfig'}
      visibility: private
    

    この出力には次の値が含まれます。

    • CLUSTER_DOMAIN: クラスタに自動的に割り当てられた DNS ドメイン サフィックス。
    • PROJECT_ID: プロジェクト ID。
    • CLUSTER_NAME: 限定公開ゾーンを含むクラスタの名前。

    この出力では、name フィールドの値は、Google Cloud が gke-CLUSTER_NAME-aa94c1f9-dns という名前のゾーンを作成したことを示しています。

    マネージド ゾーンが表示されない場合は、クラスタに限定公開ゾーンが作成されていないか、正しく認証されていない可能性があります。トラブルシューティングを行うには、Cloud DNS のドキュメントの限定公開ゾーンをご覧ください。

  3. Service の DNS レコードを確認します。

    gcloud dns record-sets list --zone ZONE_NAME | grep SERVICE_NAME
    

    次のように置き換えます。

    • ZONE_NAME: 限定公開ゾーンの名前。
    • SERVICE_NAME: Service の名前。

    出力は次のようになります。

    dns-test.default.svc.cluster.local.                A     30     10.47.255.11
    

    この出力は、Cloud DNS にドメイン dns-test.default.svc.cluster.local. の A レコードが含まれていることと、クラスタの IP アドレスが 10.47.255.11 であることを示しています。

    レコードが正しくない場合は、Cloud DNS ドキュメントのリソース レコードセットにパッチを適用するを参照して更新します。

レスポンス ポリシーを確認する

レスポンス ポリシーが存在し、名前が正しいことを確認します。

  1. すべてのレスポンス ポリシーのリストを表示します。

    gcloud dns response-policies list --format="table(responsePolicyName, description)"
    

    出力は次のようになります。

    RESPONSE_POLICY_NAME          DESCRIPTION
    gke-CLUSTER_NAME-52c8f518-rp  Response Policy for GKE cluster "CLUSTER_NAME" with cluster suffix "cluster.local." in project "gke-dev" with scope "CLUSTER_SCOPE".
    

    この出力で、gke-CLUSTER_NAME-52c8f518-rp は Google Cloud が gke-CLUSTER_NAME-aa94c1f9-rp という名前の限定公開ゾーンを作成したことを示しています。Google Cloud が作成するレスポンス ポリシーには、gke- 接頭辞が付いています。

  2. 特定の限定公開ゾーンのレスポンス ポリシーを表示します。

    gcloud dns response-policies rules list ZONE_NAME \
        --format="table(localData.localDatas[0].name, localData.localDatas[0].rrdatas[0])"
    

    ZONE_NAME は、問題が発生している限定公開ゾーンの名前に置き換えます。

    出力は次のようになります。

    1.240.27.10.in-addr.arpa.    kubernetes.default.svc.cluster.local.
    52.252.27.10.in-addr.arpa.   default-http-backend.kube-system.svc.cluster.local.
    10.240.27.10.in-addr.arpa.   kube-dns.kube-system.svc.cluster.local.
    146.250.27.10.in-addr.arpa.  metrics-server.kube-system.svc.cluster.local.
    

    最初の列には、ルールが一致する IP アドレスまたはドメイン名のパターンが表示されます。2 番目の列は、IP アドレスに関連付けられているホスト名です。

これらのコマンドの出力に問題が見つかった場合は、Cloud DNS ドキュメントのレスポンス ポリシー ルールを更新するをご覧ください。

ログ、ダッシュボード、指標を使用して調査する

Cloud DNS には、DNS の問題を詳しく調査するのに役立つ複数のロギングとモニタリングのオプションが用意されています。

新しいレコードを確認する

ログを確認して、マネージド Cloud DNS 限定公開ゾーンに新しいレコードが作成されたかどうかを確認します。これは、クラスタで DNS 解決が突然失敗した場合に役立ちます。

新しいレコードを確認する手順は次のとおりです。

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. クエリペインに次のクエリを入力します。

    resource.type="dns_managed_zone"
    protoPayload.request.change.additions.name="headless-svc-stateful.default.svc.cluster.local."
    protoPayload.methodName="dns.changes.create"
    
  3. [クエリを実行] をクリックします。

  4. 出力を確認します。エラーが最初に発生したときに対応する変更が見つかった場合は、その変更を元に戻すことを検討してください。

カスタム スタブドメインとネームサーバーを検証する

カスタム スタブドメインまたはアップストリーム ネームサーバーを使用する GKE Standard クラスタを使用している場合は、ConfigMap を確認し、値が正しいことを確認します。

Cloud DNS は、stubDomainsupstreamNameservers の値を Cloud DNS 転送ゾーンに変換します。これらのリソースは Google が管理しているため、エラーが発生した場合は、Cloud カスタマーケアにお問い合わせください。

Cloud カスタマーケアへのお問い合わせ

上記のセクションの手順をすべて試しても問題の原因を特定できない場合は、Cloud カスタマーケアにお問い合わせください

特定のエラーを解決する

特定のエラーや問題が発生した場合は、次のセクションのアドバイスを使用してください。

問題: Compute Engine VM から GKE クラスタ Service を解決できない

Compute Engine VM から GKE クラスタ Service を解決できない場合は、クラスタの Cloud DNS スコープを確認します。

Cloud DNS で使用するスコープによって、解決できるリソースが決まります。

  • クラスタ スコープ: DNS 解決は、Kubernetes クラスタ内のリソース(Pod と Service)に制限されます。これはデフォルト設定であり、Kubernetes クラスタまたは GKE Virtual Private Cloud(VPC)の外部リソースを解決する必要がない場合に適しています。

  • VPC スコープ: DNS 解決は、Compute Engine VM などのリソースを含む VPC 全体に拡張されます。これにより、クラスタは GKE クラスタの外部(同じ VPC 内)のリソース(Google Cloud VM など)の内部 DNS レコードを解決できます。

クラスタの Cloud DNS スコープを確認する手順は次のとおりです。

  1. Google Cloud コンソールで、[Kubernetes クラスタ] ページに移動します。

    Kubernetes クラスタに移動

  2. DNS で問題が発生しているクラスタの名前をクリックします。

  3. クラスタの詳細ページの [クラスタ ネットワーキング] セクションで、[DNS プロバイダ] 行の情報を確認します。

  4. [Cloud DNS(クラスタ スコープ)] と表示されている場合は、クラスタ スコープを使用しています。DNS スコープを変更するには、適切な DNS スコープでクラスタを再作成します。

問題: Cloud DNS を有効にしても Pod が kube-dns を引き続き使用している

既存のクラスタで Cloud DNS が有効になっていても Pod が kube-dns を使用している場合は、クラスタで Cloud DNS を有効にした後にノードプールがアップグレードまたは再作成されていることを確認します。この手順が完了するまで、Pod は引き続き kube-dns を使用します。

問題: 既存のクラスタを更新できない、または Cloud DNS が有効なクラスタを作成できない

正しいバージョンを使用していることを確認してください。GKE 向け Cloud DNS では、VPC スコープを使用するクラスタの場合は GKE バージョン 1.19 以降、クラスタ スコープを使用するクラスタの場合は GKE バージョン 1.24.7-gke.800、1.25.3-gke.700 以降が必要です。

問題: クラスタで Cloud DNS を有効にした後、ノードでの DNS ルックアップが失敗する

カスタム スタブドメインまたはアップストリーム ネームサーバーを持つ GKE クラスタでクラスタ スコープ Cloud DNS を有効にすると、Cloud DNS は Pod とノードの DNS リクエストを区別できないため、カスタム構成がクラスタ内のノードと Pod の両方に適用されます。カスタム アップストリーム サーバーがクエリを解決できない場合、ノードの DNS ルックアップが失敗する可能性があります。

問題: Cloud DNS の追加の VPC スコープが有効なクラスタを更新または作成できない

正しいバージョンを使用していることを確認してください。Cloud DNS の追加の VPC スコープには、GKE バージョン 1.28 以降が必要です。

エラー: Cloud DNS が無効になっています

Cloud DNS API が無効になっていると、次のイベントが発生します。

Warning   FailedPrecondition        service/default-http-backend
Failed to send requests to Cloud DNS: Cloud DNS API Disabled. Please enable the Cloud DNS API in your project PROJECT_NAME: Cloud DNS API has not been used in project PROJECT_NUMBER before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/dns.googleapis.com/overview?project=PROJECT_NUMBER then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

このエラーは、Cloud DNS API がデフォルトで有効になっていないために発生します。Cloud DNS API は手動で有効にする必要があります。

この問題を解決するには、Cloud DNS API を有効にします

エラー: Cloud DNS にリクエストを送信できませんでした: API レート制限を超えています。

プロジェクトが Cloud DNS の割り当てまたは上限を超えると、次のイベントが発生します。

kube-system   27s         Warning   InsufficientQuota
managedzone/gke-cluster-quota-ee1bd2ca-dns     Failed to send requests to Cloud DNS: API rate limit exceeded. Contact Google Cloud support team to request a quota increase for your project PROJECT_NAME: Quota exceeded for quota metric 'Write requests' and limit 'Write limit for a minute for a region' of service 'dns.googleapis.com' for consumer 'project_number:PROJECT_NUMBER.

この問題を解決するには、Cloud DNS の割り当てCompute Engine の割り当てと上限を確認します。Google Cloud コンソールを使用して割り当てを増やすことができます。

エラー: 以前のエラーにより、Cloud DNS にリクエストを送信できませんでした

エラーが原因でカスケード障害が発生すると、次のイベントが発生します。

kube-system   27s         Warning   InsufficientQuota
managedzone/gke-cluster-quota-ee1bd2ca-dns     Failed to send requests to Cloud DNS: API rate limit exceeded. Contact Google Cloud support team to request a quota increase for your project PROJECT_NAME: Quota exceeded for quota metric 'Write requests' and limit 'Write limit for a minute for a region' of service 'dns.googleapis.com' for consumer 'project_number:PROJECT_NUMBER.
kube-system   27s         Warning   FailedPrecondition               service/default-http-backend                         Failed to send requests to Cloud DNS due to a previous error. Please check the cluster events.

この問題を解決するには、クラスタ イベントを確認して元のエラーの原因を特定し、手順に沿って根本的な問題を解決します。

上記の例では、マネージド ゾーンの InsufficientQuota エラーによってカスケード障害がトリガーされました。FailedPrecondition の 2 番目のエラーは、最初に発生した割り当て不足の問題を示しています。この例の問題を解決するには、Cloud DNS 割り当てエラーのガイダンスに従ってください。

エラー: レスポンス ポリシーをバインドできない

レスポンス ポリシーがクラスタのネットワークにバインドされ、Cloud DNS for GKE がレスポンス ポリシーをネットワークにバインドしようとすると、次のイベントが発生します。

kube-system   9s          Warning   FailedPrecondition               responsepolicy/gke-2949673445-rp
Failed to bind response policy gke-2949673445-rp to test. Please verify that another Response Policy is not already associated with the network: Network 'https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/global/networks/NETWORK_NAME' cannot be bound to this response policy because it is already bound to another response policy.
kube-system   9s          Warning   FailedPrecondition               service/kube-dns
Failed to send requests to Cloud DNS due to a previous error. Please check the cluster events.

この問題を解決するには、次の操作を行います。

  1. ネットワークにバインドされているレスポンス ポリシーを取得します。

    gcloud dns response-policies list --filter='networks.networkUrl: NETWORK_URL'
    

    NETWORK_URL は、エラーのネットワーク URL(https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME など)に置き換えます。

    出力が空の場合、レスポンス ポリシーが同じプロジェクトにない可能性があります。次のステップに進んでレスポンス ポリシーを検索します。

    出力が次のようになったら、ステップ 4 に進んでレスポンス ポリシーを削除します。

    [
       {
          "description": "Response Policy for GKE cluster \"CLUSTER_NAME\" with cluster suffix \"cluster.local.\" in project \"PROJECT_ID\" with scope \"CLUSTER_SCOPE\".",
          ...
          "kind": "dns#responsePolicy",
          "responsePolicyName": "gke-CLUSTER_NAME-POLICY_ID-rp"
       }
    ]
    
  2. IAM Policy Analyzer を使用して、dns.networks.bindDNSResponsePolicy 権限を持つプロジェクトのリストを取得します。

  3. 各プロジェクトに、ネットワークにバインドされているレスポンス ポリシーがあるかどうかを確認します。

    gcloud dns response-policies list --filter='networks.networkUrl:NETWORK_URL' \
        --project=PROJECT_NAME
    
  4. レスポンス ポリシーを削除します

エラー: kube-dns で指定された構成が無効です

Cloud DNS for GKE に有効でないカスタム kube-dns ConfigMap を適用すると、次のイベントが発生します。

kube-system   49s         Warning   FailedValidation                 configmap/kube-dns
Invalid configuration specified in kube-dns: error parsing stubDomains for ConfigMap kube-dns: dnsServer [8.8.8.256] validation: IP address "8.8.8.256" invalid

この問題を解決するには、ConfigMap で無効な部分に関するエラーの詳細を確認します。上記の例では、8.8.8.256 は有効な IP アドレスではありません。

次のステップ