Kubernetes における DNS 解決失敗は、解決パイプラインが CoreDNS、kube-proxy、コンテナネットワークインターフェース (CNI)、および上流 DNS サーバなど複数のコンポーネントにまたがるため、診断が困難です。本ガイドでは、根本原因を特定し、適切な修正を適用するための体系的な手順を説明します。
DNS 障害の再発リスクを低減するため、診断を開始する前に DNS サービスのベストプラクティスをご参照ください。
基本概念
| 用語 | 定義 |
|---|---|
| 内部ドメイン名 | CoreDNS のローカルキャッシュから解決されるドメイン名。常に .cluster.local で終わる。 |
| 外部ドメイン名 | 上流 DNS サーバ(Alibaba Cloud DNS、Alibaba Cloud DNS PrivateZone、またはサードパーティプロバイダー)によって解決されるドメイン名。CoreDNS はこれらのクエリを転送するのみである。 |
| アプリケーションポッド | Kubernetes クラスター内のシステムコンポーネントポッドでない任意のポッド。 |
| NodeLocal DNSCache | CoreDNS に到達する前にポッドの DNS クエリをインターセプトするローカル DNS キャッシュ。NodeLocal DNSCache で解決できないクエリは kube-dns Service に転送される。 |
エラーの特定
一般的なエラーメッセージ
ご使用のエラーメッセージと照合して、障害カテゴリを特定します:
| クライアント | エラーメッセージ | 障害カテゴリ |
|---|---|---|
ping | ping: xxx.yyy.zzz: Name or service not known | ドメインが見つからない、または DNS サーバに到達不能(遅延 > 5 秒の場合は到達不能と判断) |
curl | curl: (6) Could not resolve host: xxx.yyy.zzz | ドメインが見つからない、または DNS サーバに到達不能 |
| PHP HTTP クライアント | php_network_getaddresses: getaddrinfo failed: Name or service not known in xxx.php on line yyy | ドメインが見つからない、または DNS サーバに到達不能 |
| Go HTTP クライアント | dial tcp: lookup xxx.yyy.zzz on 100.100.2.136:53: no such host | ドメインが存在しない |
dig | ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: xxxxx | ドメインが存在しない |
| Go HTTP クライアント | dial tcp: lookup xxx.yyy.zzz on 100.100.2.139:53: read udp 192.168.0.100:42922->100.100.2.139:53: i/o timeout | DNS サーバに到達不能 |
dig | ;; connection timed out; no servers could be reached | DNS サーバに到達不能 |
デバッグ用ポッドのセットアップ
診断コマンドを実行する前に、クリーンな観測環境を構築してください。これにより、アプリケーションのバグと DNS のバグとの混同を回避できます。
kubectl run -it --rm debug --image=nicolaka/netshoot -- dig以下のコマンドも実行できます:
nslookup <ドメイン名>診断手順
以下の図は、CoreDNS および NodeLocal DNSCache の障害に対する包括的なトラブルシューティングフローを示しています。

ステップ 1:アプリケーションポッドの DNS 構成を確認
# Pod の YAML を取得し、dnsPolicy フィールドを確認
kubectl get pod <pod-name> -o yaml
# dnsPolicy が適切に設定されている場合、コンテナ内 DNS 構成を確認
kubectl exec -it <pod-name> -- cat /etc/resolv.confnameserver が CoreDNS または NodeLocal DNSCache を指しているかを確認します:
CoreDNS(kube-dns Service IP、例:
172.21.0.10)の場合:「ステップ 2」に進みます。NodeLocal DNSCache(
169.254.20.10)の場合:「NodeLocal DNSCache の問題」をご参照ください。いずれでもない(クラスタ DNS が未設定)場合:ポッドが過負荷状態のノード上で実行されているか、conntrack テーブルが満杯になっている可能性があります。「クライアントの過負荷」および「conntrack テーブルが満杯」をご参照ください。
DNS ポリシーのリファレンス
以下の表では、利用可能な dnsPolicy 値とその使用タイミングについて説明します。
dnsPolicy 値 | 動作 |
|---|---|
ClusterFirst(デフォルト) | kube-dns Service IP を DNS サーバとして使用。ホストネットワークポッドの場合は、Default と同じ動作となる。 |
Default | ECS インスタンスの /etc/resolv.conf に記載された DNS サーバを使用。ポッドがクラスタ内サービス検出を必要としない場合にのみ使用してください。 |
ClusterFirstWithHostNet | ClusterFirst と同様だが、ホストネットワークポッド向けに設計されている。 |
None | dnsConfig を使用してカスタム DNS サーバおよびオプションを指定可能。NodeLocal DNSCache が自動的に構成を挿入する場合に使用。 |
NodeLocal DNSCache を使用するように構成されたポッドの例を以下に示します:
apiVersion: v1
kind: Pod
metadata:
name: <pod-name>
namespace: <pod-namespace>
spec:
containers:
- image: <container-image>
name: <container-name>
dnsPolicy: None
dnsConfig:
nameservers:
- 169.254.20.10
- 172.21.0.10
options:
- name: ndots
value: "3"
- name: timeout
value: "1"
- name: attempts
value: "2"
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.localステップ 2:CoreDNS ポッドのステータスを確認
kubectl -n kube-system get pod -o wide -l k8s-app=kube-dns期待される出力(すべてのポッドが Running 状態):
NAME READY STATUS RESTARTS AGE IP NODE
coredns-xxxxxxxxx-xxxxx 1/1 Running 0 25h 172.20.6.53 cn-hangzhou.192.168.0.198リソース使用量を確認します:
kubectl -n kube-system top pod -l k8s-app=kube-dns期待される出力:
NAME CPU(cores) MEMORY(bytes)
coredns-xxxxxxxxx-xxxxx 3m 18Miポッドが Running 状態でない場合は、原因を特定するために詳細情報を表示します:
kubectl -n kube-system describe pod <coredns-pod-name>一般的なエラーログおよび修正方法については、「CoreDNS ポッドが予期通りに実行されていない」をご参照ください。
ステップ 3:CoreDNS の運用ログを確認
kubectl -n kube-system logs -f --tail=500 --timestamps <coredns-pod-name>| フラグ | 効果 |
|---|---|
-f | リアルタイムでログ出力をストリーム表示 |
--tail=500 | 直近 500 行を表示 |
--timestamps | 各ログ行にタイムスタンプを追加 |
ログ内で NXDOMAIN、SERVFAIL、または REFUSED 応答を探します。これらの応答が外部ドメイン名に対して表示される場合、上流 DNS サーバがエラーを返しています。「外部ドメイン名が解決できない」をご参照ください。
ステップ 4:問題が再現可能かどうかを確認
常に失敗する場合:「DNS クエリログの診断」および「アプリケーションポッドと CoreDNS 間のネットワーク接続性の診断」に進みます。
不定期に発生する場合:「パケットキャプチャ」で説明されている手順に従ってパケットを収集します。
DNS クエリログの診断
CoreDNS は、log プラグインが有効化されている場合にのみ、各 DNS 要求に対してクエリログエントリを生成します。有効化方法については、「CoreDNS の構成」をご参照ください。
DNS クエリログを表示するには、運用ログの確認に使用したのと同じコマンドを実行します。詳細については、「ステップ 3:CoreDNS の運用ログを確認」をご参照ください。
保存後、CoreDNS は自動的に再読み込みされます。再読み込みが完了したことを確認するには、ログに reload が表示されているかを確認してください。
DNS クエリログの形式
[INFO] 172.20.2.25:44525 - 36259 "A IN redis-master.default.svc.cluster.local. udp 56 false 512" NOERROR qr,aa,rd 110 0.000116946sDNS 応答コード
仕様の詳細については、「RFC 1035」をご参照ください。
| 応答コード | 意味 | 一般的な原因 |
|---|---|---|
NOERROR | 正常に解決された | — |
NXDOMAIN | 上流 DNS サーバにドメインが存在しない | ポッドの要求が検索ドメイン接尾辞を付加するため、存在しない接尾辞付きの名前がこのコードをトリガーする |
SERVFAIL | 上流 DNS サーバでエラーが発生 | 上流 DNS サーバに到達不能または誤った構成が行われている |
REFUSED | 上流 DNS サーバによってクエリが拒否された | 上流 DNS サーバ(CoreDNS の構成またはノードの /etc/resolv.conf 内)がドメインを解決できない |
ログに外部ドメイン名に対する NXDOMAIN、SERVFAIL、または REFUSED が表示される場合、上流 DNS サーバが根本原因となります。デフォルトでは、CoreDNS は VPC DNS サーバ 100.100.2.136 および 100.100.2.138 を上流リゾルバーとして使用します。「チケットを送信」より ECS チームへチケットを送信し、以下の情報を含めてください:
| フィールド | 説明 | 例 |
|---|---|---|
| ドメイン名 | ログから取得した外部ドメイン名 | www.aliyun.com |
| DNS 応答コード | ログ内の応答コード | NXDOMAIN |
| 時間 | ログエントリのタイムスタンプ(秒単位の精度) | 2022-12-22 20:00:03 |
| ECS インスタンス ID | CoreDNS ポッドを実行している ECS インスタンスの ID | i-xxxxx i-yyyyy |
CoreDNS ポッドのネットワーク接続性の診断
ACK コンソールまたは CLI のいずれかを使用します。
ACK コンソール
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、クラスター名をクリックします。左側のナビゲーションウィンドウで、[検査および診断] > [診断] を選択します。
[診断] ページで、[ネットワーク診断] をクリックします。
[ネットワーク] パネルで、以下のパラメーターを構成します:警告を読み、[了解しました。同意します。] を選択し、[診断の作成] をクリックします。
[送信元アドレス]:CoreDNS ポッドの IP アドレス
[宛先アドレス]:上流 DNS サーバの IP アドレス(
100.100.2.136または100.100.2.138)[宛先ポート]:
53[プロトコル]:
udp
[診断結果] ページの [パケットパス] セクションには、診断対象となったすべてのノードが表示されます。

CLI
CoreDNS ポッドを実行しているノードにログインします。
CoreDNS プロセス ID を取得します:
ps aux | grep corednsCoreDNS のネットワーク名前空間に入ります:
nsenter -t <pid> -n -- <関連コマンド><pid>は、前のステップで取得したプロセス ID に置き換えてください。接続性をテストします:
# Kubernetes API サーバへの接続性をテスト telnet <apiserver_clusterip> 6443 # 上流 DNS サーバへの接続性をテスト dig <ドメイン> @100.100.2.136 dig <ドメイン> @100.100.2.138
| 問題 | 原因 | 対応 |
|---|---|---|
| CoreDNS が Kubernetes API サーバに接続できない | API サーバのエラー、ノードの過負荷、または kube-proxy の問題 | チケットを送信 |
| CoreDNS が上流 DNS サーバに接続できない | ノードの過負荷、誤った CoreDNS 構成、または Express Connect のルーティングの問題 | チケットを送信 |
アプリケーションポッドと CoreDNS 間のネットワーク接続性の診断
ACK コンソール
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、クラスター名をクリックします。左側のナビゲーションウィンドウで、[検査と診断] > [診断] を選択します。
[診断] ページで、[ネットワーク診断] をクリックします。
[ネットワーク] パネルで、以下のパラメーターを構成します:警告を読み、[了解しました。同意します。] を選択し、[診断の作成] をクリックします。
[送信元アドレス]:アプリケーションポッドの IP アドレス
[宛先アドレス]:CoreDNS ポッドまたはクラスターの IP アドレス
[宛先ポート]:
53プロトコル:
udp
[診断結果] ページの [パケットパス] セクションには、診断対象となったすべてのノードが表示されます。

CLI
以下のいずれかの方法を使用して、アプリケーションポッドのネットワーク名前空間に接続します:
方法 1 —
kubectl exec:kubectl exec -it <pod-name> -- bash方法 2 —
nsenter(kubectl execが使用できない場合):ps aux | grep <application-process-name> nsenter -t <pid> -n bash方法 3 — 再起動頻度が高いポッドの場合:
-nと<netns-path>の間にスペースを追加しないでください。docker ps -a | grep <application-container-name> docker inspect <sandboxed-container-id> | grep netns nsenter -n<netns-path> -n bash
ポッドのネットワーク名前空間内から、接続性をテストします:
# kube-dns Service への接続性をテスト
dig <ドメイン> @<kube_dns_svc_ip>
# CoreDNS ポッドへの ICMP 到達性をテスト
ping <coredns_pod_ip>
# CoreDNS ポッドを直接経由した DNS 解決をテスト
dig <ドメイン> @<coredns_pod_ip>| 問題 | 原因 | 対応 |
|---|---|---|
| kube-dns Service に接続できない | ノードの過負荷、kube-proxy の問題、または UDP ポート 53 がブロックされている | セキュリティグループルールが UDP ポート 53 を許可しているかを確認してください。許可されている場合は、「チケットを送信」してください。 |
| CoreDNS ポッドに PING できない | コンテナネットワークのエラー、またはセキュリティグループルールで ICMP がブロックされている | ICMP が許可されているかを確認してください。許可されている場合は、「チケットを送信」してください。 |
dig による CoreDNS ポッドへのクエリが失敗する | ノードの過負荷、またはセキュリティグループルールで UDP ポート 53 がブロックされている | セキュリティグループルールが UDP ポート 53 を許可しているかを確認してください。許可されている場合は、「チケットを送信」してください。 |
パケットキャプチャ
ログおよび接続性テストを通じて問題を特定できない場合は、パケットをキャプチャして、パケットが破棄される箇所を特定します。
アプリケーションポッドおよび CoreDNS ポッドを実行しているノードにログインします。
各 ECS インスタンスでパケットをキャプチャします:
パケットキャプチャはサービスを中断しませんが、CPU 使用率およびディスク I/O がわずかに増加します。このコマンドはファイルをローテーションし、最大 200 個の
.pcapファイル(各ファイル最大 20 MB)を生成します。tcpdump -i any port 53 -C 20 -W 200 -w /tmp/client_dns.pcapエラーが発生した期間のキャプチャ済みパケットを分析します。
DNS 解決パイプラインのその他のコンポーネント
CoreDNS および NodeLocal DNSCache に加えて、以下のコンポーネントも DNS 解決失敗の原因となる可能性があります。
| コンポーネント | 障害の原因 |
|---|---|
| DNS リゾルバ(Go、glibc、musl) | 言語レベルまたはライブラリレベルの DNS 実装のバグが、稀に障害を引き起こす可能性がある |
/etc/resolv.conf | コンテナ内の DNS サーバ IP アドレスまたは検索ドメインの誤った構成 |
| kube-proxy | CoreDNS の更新後に kube-proxy ルールが更新されないと、CoreDNS に到達できなくなる |
| 上流 DNS サーバ | CoreDNS は外部ドメインのクエリを上流サーバ(例:VPC Private DNS)に転送します。上流サーバの誤った構成により、転送されたクエリが失敗する。 |
よくある質問
外部ドメイン名が解決できない場合の対処方法
内部ドメイン名は正常に解決されますが、外部ドメイン名の解決に失敗します。
失敗したドメイン名について、CoreDNS のクエリログに NXDOMAIN、SERVFAIL、または REFUSED が表示されているかを確認します。これらのコードは、上流 DNS サーバ(デフォルトでは 100.100.2.136 および 100.100.2.138)がエラーを返していることを示します。「チケットを送信」より ECS チームへ、ドメイン名、応答コード、タイムスタンプ、および CoreDNS を実行しているノードの ECS インスタンス ID を含めてチケットを送信してください。
ヘッドレス Service ドメイン名が解決できない場合の対処方法
CoreDNS がヘッドレス Service のドメイン名を解決できません。
これは、通常、Kubernetes API サーバのネットワークジッター時に予期せず終了する可能性のある CoreDNS 1.7.0 より前のバージョンで発生します。これにより、ヘッドレス Service の DNS レコードが古くなってしまいます。CoreDNS を 1.7.0 以降に更新してください。「[コンポーネントの更新] CoreDNS の更新」をご参照ください。
dig の応答に tc フラグが表示される場合、ヘッドレス Service のバックエンド IP アドレスが多すぎて、DNS 応答が UDP パケットサイズ制限を超えています。クライアントを構成して、DNS クエリを TCP 経由で送信できるようにします:
glibc ベースのリゾルバの場合、
use-vcをdnsConfigに追加します:dnsConfig: options: - name: use-vcこれは
optionsディレクティブに相当し、/etc/resolv.confにマップされます。詳細については、「resolv.conf の Linux マニュアルページ」をご参照ください。Go アプリケーションの場合、リゾルバを TCP を使用するように構成します:
package main import ( "fmt" "net" "context" ) func main() { resolver := &net.Resolver{ PreferGo: true, Dial: func(ctx context.Context, network, address string) (net.Conn, error) { return net.Dial("tcp", address) }, } addrs, err := resolver.LookupHost(context.TODO(), "example.com") if err != nil { fmt.Println("Error:", err) return } fmt.Println("Addresses:", addrs) }
CoreDNS を更新後にヘッドレス Service ドメイン名が解決できない場合の対処方法
Kubernetes 1.20 以降および CoreDNS 1.8.4 以降にアップグレードした後、etcd、Nacos、Kafka などのオープンソースコンポーネントがサービス検出に失敗します。
CoreDNS 1.8.4 では EndpointSlice API に切り替わりました。一部のオープンソースコンポーネントは、初期化時に準備ができていないサービスを公開するために、古い Endpoint API の service.alpha.kubernetes.io/tolerate-unready-endpoints アノテーションに依存しています。このアノテーションは EndpointSlice ではサポートされておらず、publishNotReadyAddresses に置き換えられました。
影響を受けるコンポーネントの YAML または Helm チャートで service.alpha.kubernetes.io/tolerate-unready-endpoints が使用されているかを確認してください。使用されている場合は、コンポーネントをアップグレードするか、コンポーネントのコミュニティに相談してください。
StatefulSet ポッドのドメイン名が解決できない場合の対処方法
StatefulSet ポッドのドメイン名(例:pod.headless-svc.ns.svc.cluster.local)が解決できないが、ヘッドレス Service 自体のドメイン名は正常に解決される。
StatefulSet ポッドの YAML テンプレートで serviceName が誤った値に設定されているか、空欄のままになっています。serviceName を、StatefulSet を公開するヘッドレス Service の正確な名前に設定してください。
セキュリティグループルールが DNS クエリをブロックしている場合の対処方法
DNS 解決が一部またはすべてのノードで継続的に失敗する。
ECS インスタンスのセキュリティグループルールまたはネットワークアクセスコントロールリスト(ACL)が UDP ポート 53 をブロックしています。UDP ポート 53 を許可するようにセキュリティグループルールまたはネットワーク ACL を変更してください。
コンテナネットワーク接続エラーが発生した場合の対処方法
DNS 解決が一部またはすべてのノードで継続的に失敗する。
コンテナネットワーク接続エラーまたはその他の問題が UDP ポート 53 をブロックしています。「ネットワーク診断」機能を使用して、アプリケーションポッドと CoreDNS ポッド間のネットワーク接続性を診断してください。問題が継続する場合は、「チケットを送信」してください。
CoreDNS ポッドが過負荷状態の場合の対処方法
DNS 解決の遅延が大きい、または継続的または不定期に失敗が発生する。CoreDNS ポッドの CPU 使用率またはメモリ使用率が上限に近い。
DNS クエリのボリュームを処理するのに十分な CoreDNS レプリカ数が少ないためです。以下のいずれか、または両方の対策を実施してください:
CoreDNS の負荷を軽減するために NodeLocal DNSCache を有効化します。「NodeLocal DNSCache の構成」をご参照ください。
CoreDNS ポッドをスケールアウトし、各ポッドのピーク CPU 使用率がノードの利用可能な CPU 余剰分を下回るようにします。
DNS クエリ負荷が不均衡な場合の対処方法
DNS 解決の遅延が大きい、または一部(すべてではない)のノードで不定期に失敗が発生する。CoreDNS ポッドの CPU 使用率がポッド間で大きく異なる。2 つ未満の CoreDNS レプリカが実行中である、または複数のポッドが同じノードにスケジュールされている。
ポッドのスケジューリングの不均衡または kube-dns Service の SessionAffinity 設定により、DNS クエリが不均等に分散されています。これを修正するには:
CoreDNS ポッドをスケールアウトし、別々のノードにスケジュールします。
kube-dns Service の
SessionAffinity設定を削除します。「ACK による CoreDNS の自動更新の構成」をご参照ください。
CoreDNS ポッドが予期通りに実行されていない場合の対処方法
DNS 解決の遅延が大きい、一部のノードで失敗が発生する、CoreDNS ポッドが Running 状態でない、再起動回数が増加し続ける、または CoreDNS のログにエラーが表示される。
誤った YAML 構成または誤った CoreDNS ConfigMap がポッドの実行を妨げています。ポッドのステータスおよびログを確認してください。
一般的なエラーメッセージ:
| エラー | 原因 | 修正 |
|---|---|---|
/etc/coredns/Corefile:4 - Error during parsing: Unknown directive 'ready' | Corefile の ready プラグインが現在の CoreDNS バージョンでサポートされていない | ready(またはサポートされていないプラグイン)を kube-system |
Failed to watch *v1.Pod: Get "https://192.168.0.1:443/api/v1/": dial tcp 192.168.0.1:443: connect: connection refused | ログ記録時の API サーバ接続が中断された | この期間中に DNS 解決が影響を受けなかった場合、これは根本原因ではありません。それ以外の場合は、CoreDNS のネットワーク接続性を診断してください。 |
[ERROR] plugin/errors: 2 www.aliyun.com. A: read udp 172.20.6.53:58814->100.100.2.136:53: i/o timeout | ログ記録時の上流 DNS サーバに到達不能 | 上流 DNS サーバへの CoreDNS のネットワーク接続性を確認 |
クライアントの過負荷により DNS が失敗する場合の対処方法
DNS エラーが不定期またはピーク時に発生する。ECS インスタンスの監視で異常な NIC 再送率または高い CPU 使用率が確認される。
DNS クエリを送信するポッドをホストする ECS インスタンスが完全に過負荷状態であり、UDP パケット損失が発生しています。「チケットを送信」してください。並行して、NodeLocal DNSCache を有効化してノード単位の DNS 負荷を軽減します。「NodeLocal DNSCache の構成」をご参照ください。
conntrack テーブルが満杯の場合の対処方法
DNS 解決がピーク時に一部またはすべてのノードで頻繁に失敗するが、非ピーク時には正常に動作する。インスタンスで dmesg -H を実行すると、障害発生期間中に conntrack full がログに表示される。
Linux カーネルの conntrack テーブルが満杯のため、UDP および TCP パケットを処理できません。conntrack テーブルの最大エントリ数を増加させます。「Linux カーネルの conntrack テーブルにおけるトラッキング接続数の最大値を増やすには?」をご参照ください。
autopath プラグインが期待通りに動作しない場合の対処方法
外部ドメイン名が偶発的に解決できない、または誤った IP アドレスに解決される。一方、内部ドメイン名は正常に解決される。クラスタがコンテナを高速で作成する場合、内部ドメイン名が誤った IP アドレスに解決されることがある。
CoreDNS の autopath プラグインには既知の欠陥があります。無効化してください:
CoreDNS ConfigMap を編集します:
kubectl -n kube-system edit configmap corednsautopath @kubernetes行を削除し、ファイルを保存して終了します。CoreDNS が新しい構成を読み込んだことを、ログに
reloadキーワードが表示されているかで確認します。
同時 A および AAAA レコードクエリにより DNS が失敗する場合の対処方法
CoreDNS の DNS 解決が不定期に失敗する。パケットキャプチャまたは DNS クエリログで、同一送信元ポートを介して同時に送信された A レコードおよび AAAA レコードのクエリが確認される。
同時 A および AAAA レコードクエリにより conntrack テーブルのエラーが発生し、UDP パケット損失につながります。ARM マシンでは、libc のバージョン 2.33 より前のものでこの問題が発生します(GLIBC#26600 を参照)。
ご使用の環境に応じて、以下のいずれか、または複数の修正を適用してください:
NodeLocal DNSCache:パケット損失の影響を軽減します。「NodeLocal DNSCache の構成」をご参照ください。
libc を使用する CentOS または Ubuntu:libc を 2.33 以降に更新するか、リゾルバオプションを追加します:
options timeout:2 attempts:3 rotate single-request-reopen。PHP cURL: ドメイン名の解決を IPv4 アドレスのみに指定するには、
CURL_IPRESOLVE_V4を追加します。詳細については、curl_setopt を参照してください。Alpine Linux:Alpine 以外のベースイメージに置き換えます。「Alpine Linux の注意事項」をご参照ください。
IPVS エラーにより DNS が失敗する場合の対処方法
ノードがクラスタに追加または削除されたとき、ノードがシャットダウンしたとき、または CoreDNS がスケールインされたときに、DNS 解決が不定期に失敗する。障害は通常約 5 分間続く。
kube-proxy が IPVS モードで実行されています。カーネルバージョンが 4.19.91-25.1.al7.x86_64 より前の CentOS または Alibaba Cloud Linux 2 ノードで UDP バックエンドポッドが削除されると、送信元ポートの競合により UDP パケットが破棄されます。
これを修正するには:
IPVS をバイパスするために NodeLocal DNSCache を有効化します。「NodeLocal DNSCache の構成」をご参照ください。
IPVS モードでの UDP セッションタイムアウトを短縮します。「IPVS モードでの UDP タイムアウト期間の変更」をご参照ください。
NodeLocal DNSCache の問題
NodeLocal DNSCache が機能していない場合の対処方法
すべての DNS クエリが CoreDNS に到達しており、NodeLocal DNSCache には到達していない。
以下のいずれかが発生しています:
DNSConfig の挿入が構成されていないため、ポッドは依然として kube-dns Service IP を使用している。
ポッドが Alpine Linux ベースのイメージを使用しており、DNS クエリをすべて構成済みのネームサーバ(NodeLocal DNSCache および CoreDNS の両方を含む)に同時に送信している。
最初の原因を修正するには、自動 DNSConfig 挿入を構成します。2 番目の原因を修正するには、Alpine ベースのイメージを Alpine 以外のイメージに置き換えます。「NodeLocal DNSCache の構成」および「Alpine Linux の注意事項」をご参照ください。
Alibaba Cloud DNS PrivateZone のドメイン名が解決できない場合の対処方法
NodeLocal DNSCache を使用している場合、Alibaba Cloud DNS PrivateZone に追加されたドメイン名が解決できない、vpc-proxy を含む Alibaba Cloud サービス API エンドポイントが解決できない、またはドメイン名が誤った IP アドレスに解決される。
Alibaba Cloud DNS PrivateZone は TCP をサポートしていません。NodeLocal DNSCache はこれらのクエリを UDP 経由で転送する必要があります。CoreDNS 構成に prefer_udp 設定を追加します。「CoreDNS の構成」をご参照ください。
上記のいずれの手順でも問題が解決しない場合は、「チケットを送信」してください。