Pod がサービスに接続できず、Google Kubernetes Engine(GKE)クラスタが DNS プロバイダとして Cloud DNS を使用している場合は、dial tcp: i/o timeout や no such host などのエラーが発生することがあります。これらのエラーは、限定公開ゾーンの構成ミスや Cloud DNS スコープの誤りなど、Cloud DNS の構成に関する問題を示していることがよくあります。
このページでは、GKE でマネージド Cloud DNS サービスを使用する際によく発生する問題を診断して解決し、ワークロードの信頼性の高い DNS 解決が確実に行われるようにします。
この情報は、GKE と Cloud DNS 間の統合を構成して管理するプラットフォーム管理者、運用担当者、ネットワーキング スペシャリストにとって重要です。また、アプリケーションでサービス ディスカバリの問題が発生しているアプリケーション デベロッパーにも役立ちます。 Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE ユーザーのロールとタスクをご覧ください。
Cloud DNS で生じた DNS に関する問題の原因を特定する
以降のセクションでは、Cloud DNS でクエリの解決が困難な理由を診断する方法について説明します。
基本設定を確認する
Pod が DNS ルックアップを解決できない場合は、Cloud DNS が適切に構成されていることを確認します。このセクションでは、Cloud DNS を使用しているかどうかを確認します。また、GKE クラスタ用の限定公開 DNS ゾーンが存在することと、ターゲット サービスの DNS レコードが正しいことを確認します。
これらの設定を確認するには、次のコマンドを実行します。
- 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 が適切に有効化されたことを確認してください。 
- マネージド ゾーンが存在することを確認します。 - 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フィールドの値から、- gke-CLUSTER_NAME-aa94c1f9-dnsという名前のゾーンが作成されたことがわかります。- マネージド ゾーンが表示されない場合は、クラスタ用の限定公開ゾーンが作成されていないか、認証が正しく完了していない可能性があります。トラブルシューティングを行うには、Cloud DNS のドキュメントで限定公開ゾーンをご覧ください。 
- 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 ドキュメントでリソース レコードセットにパッチを適用するを参照して更新します。 
レスポンス ポリシーを確認する
レスポンス ポリシーが存在し、正しい名前が設定されていることを確認します。
- すべてのレスポンス ポリシーのリストを表示します。 - 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は、- gke-CLUSTER_NAME-aa94c1f9-rpという名前の限定公開ゾーンが作成されたことを示しています。Google Cloud で作成されたレスポンス ポリシーには接頭辞- gke-が付いています。
- 特定の限定公開ゾーンのレスポンス ポリシーを表示します。 - 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 で Cloud Logging を有効にします。 
- DNS クエリのグラフを表示し、限定公開ゾーンのエラー率、QPS、99 パーセンタイル レイテンシに関するデータを表示するには、Cloud DNS モニタリング ダッシュボードを使用します。 
- DNS クエリのレイテンシと成功率を可視化するには、Metrics Explorer で - query/latenciesと- query/response_countの指標を使用します。
新しいレコードを確認する
マネージド Cloud DNS 限定公開ゾーンで新しいレコードが作成されたかどうかをログで確認します。これは、クラスタで突然に DNS 解決が失敗しはじめた場合に役立ちます。
新しいレコードを確認する手順は次のとおりです。
- Google Cloud コンソールで [ログ エクスプローラ] ページに移動します。 
- クエリペインに次のクエリを入力します。 - resource.type="dns_managed_zone" protoPayload.request.change.additions.name="headless-svc-stateful.default.svc.cluster.local." protoPayload.methodName="dns.changes.create"
- [クエリを実行] をクリックします。 
- 出力を確認します。エラーが最初に発生したときに対応する変更が見つかった場合は、その変更を元に戻すことを検討してください。 
カスタムのスタブドメインとネームサーバーを確認する
GKE Standard クラスタでカスタムのスタブドメインやアップストリーム ネームサーバーを使用している場合は、値が正しいことを ConfigMap で確認します。
Cloud DNS では、stubDomains と upstreamNameservers の値が 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 スコープを確認する手順は次のとおりです。
- Google Cloud コンソールで [Kubernetes クラスタ] ページに移動します。 
- DNS に関する問題が生じているクラスタの名前をクリックします。 
- クラスタの詳細ページの [クラスタ ネットワーキング] セクションで、[DNS プロバイダ] 行の情報を確認します。 
- [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 を有効にすると、Pod とノードの DNS リクエストを Cloud DNS が区別できないため、カスタム構成がクラスタ内のノードと Pod の両方に適用されます。カスタムのアップストリーム サーバーがクエリを解決できない場合、ノードでの DNS ルックアップが失敗する可能性があります。
問題: Cloud DNS の追加の VPC スコープが有効なクラスタを更新または作成できない
正しいバージョンを使用していることを確認してください。Cloud DNS の追加の VPC スコープには、GKE バージョン 1.28 以降が必要です。
エラー: Cloud DNS API Disabled
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 を有効にします。
エラー: Failed to send requests to Cloud DNS: API rate limit exceeded.
プロジェクトが 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 コンソールを使用して割り当てを増やすことができます。
エラー: Failed to send to requests to Cloud DNS due to a previous error
エラーが原因でカスケード障害が発生すると、次のイベントが発生します。
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 の割り当てに関するエラーのガイダンスに従ってください。
エラー: Failed to bind response policy
レスポンス ポリシーがクラスタのネットワークにバインドされているときに GKE 向け Cloud DNS がレスポンス ポリシーを同じネットワークにバインドしようとすると、次のイベントが発生します。
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.
この問題を解決するには、次の操作を行います。
- ネットワークにバインドされているレスポンス ポリシーを取得します。 - 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" } ]
- IAM Policy Analyzer を使用して、 - dns.networks.bindDNSResponsePolicy権限を持つプロジェクトのリストを取得します。
- 各プロジェクトに、ネットワークにバインドされているレスポンス ポリシーがあるかどうかを確認します。 - gcloud dns response-policies list --filter='networks.networkUrl:NETWORK_URL' \ --project=PROJECT_NAME
エラー: Invalid configuration specified in kube-dns
GKE 向け Cloud DNS に対して有効でないカスタム 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 アドレスではありません。
次のステップ
- Kubernetes での DNS に関する問題の診断に関する一般的な情報については、DNS 解決のデバッグをご覧ください。 
- Cloud DNS のトラブルシューティングをご覧ください。 
- このドキュメントに問題のソリューションが見当たらない場合は、サポートを受けるで、次のトピックに関するアドバイスなど、詳細なヘルプをご覧ください。 - Cloud カスタマーケアに問い合わせて、サポートケースを登録する。
- StackOverflow で質問する、google-kubernetes-engineタグを使用して類似の問題を検索するなどして、コミュニティからサポートを受ける。#kubernetes-engineSlack チャネルに参加して、コミュニティ サポートを利用することもできます。
- 公開バグトラッカーを使用して、バグの報告や機能リクエストの登録を行う。