このページでは、Google Kubernetes Engine(GKE)で生じた Cloud DNS に関する問題を解決する方法について説明します。
Cloud DNS で生じた DNS に関する問題の原因を特定する
dial tcp: i/o timeout
、no such
host
、Could not resolve host
などのエラーは、多くの場合、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 カスタマーケアにお問い合わせください。