このトピックでは、Container Service for Kubernetes (ACK) クラスターにおける DNS (Domain Name System) に関する一般的な質問に回答します。
CoreDNS Pod で exec が失敗する原因
症状
CoreDNS Pod に入るために、kubectl -n kube-system exec -it {coredns-pod-name} bash コマンドまたは類似のコマンドを使用できません。
原因
CoreDNS のコンテナイメージは Scratch 上に構築されており、シェル環境がありません。
解決策
nsenter を使用して、CoreDNS Pod のコンテナネットワーク環境にアクセスできます。詳細については、「CoreDNS Pod のネットワーク接続の確認」をご参照ください。CoreDNS ログを表示する必要がある場合は、CoreDNS のログ分析および監視機能を有効にできます。詳細については、「CoreDNS ログの分析と監視」をご参照ください。
CoreDNS が非推奨の API を使用する原因
症状
クラスター更新の事前チェック中に、ユーザーエージェント coredns を持つクライアントが非推奨の Kubernetes API discovery.k8s.io/v1beta1 にアクセスしていることが判明します。API パスは /apis/discovery.k8s.io/v1beta1 です。
原因
CoreDNS は discovery.k8s.io/v1beta1 API を使用して API サーバーに接続しますが、この API はご利用のクラスターバージョンで非推奨であるか、まもなく非推奨になります。この問題には、次の 2 つの原因が考えられます。
-
CoreDNS のバージョンが古すぎる: インストールされている CoreDNS のバージョンが
discovery.k8s.io/v1API をサポートしていないため、discovery.k8s.io/v1beta1API を使用しています。 -
CoreDNS が古い Kubernetes バージョンで起動された: CoreDNS が古い Kubernetes バージョン (例: v1.20) で起動され、起動時に
discovery.k8s.io/v1beta1API を選択しました。クラスターがアップグレードされ、この API が非推奨になった後も、CoreDNS は引き続きそれを使用しました。
解決策
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、クラスター名をクリックします。 左側のナビゲーションウィンドウで、アドオン管理 をクリックします。
-
[アドオン管理]ページで、CoreDNS コンポーネントをスペックアップします。
ページにアップグレードできないと表示される場合は、次のステップに進みます。それ以外の場合は、ステップ 3 に進みます。コンポーネントのアップグレード方法の詳細については、「コンポーネントの管理」をご参照ください。
-
次のコマンドを実行して CoreDNS を再起動します。
kubectl -n kube-system rollout restart deployment coredns重要再起動中に DNS 名前解決エラーが断続的に発生する場合があります。詳細については、「IPVS の不具合によって引き起こされる断続的な DNS タイムアウトの軽減」をご参照ください。
-
CoreDNS がアップグレードまたは再起動された後、次のコマンドを実行して CoreDNS Pod のステータスを確認します。
kubectl -n kube-system get pod -l k8s-app=kube-dnsCoreDNS Pod が新しく再作成され、実行中状態である場合は、クラスター更新の事前チェックページに表示される CoreDNS からの非推奨の API 呼び出しレコードを無視して、クラスターのアップグレードに進むことができます。
CoreDNS ログエラー:dns: buffer size too small
症状
kubectl -n kube-system logs {coredns pod} コマンドを実行して CoreDNS Pod のログを表示すると、エラーメッセージ dns: buffer size too small が表示されます。
原因
CoreDNS のデフォルトのバッファーサイズ (bufsize) は 1232 バイトです。これにより、Kubernetes Pod からの DNS クエリに対する UDP パケットの最大サイズが 1232 バイトに制限されます。DNS 応答がこの制限を超えると、名前解決が失敗します。これは、特に大きな応答を持つ Pod 内の DNS クエリに影響します。詳細については、こちらの GitHub issue をご参照ください。
解決策
CoreDNS を v1.7.1 以降にアップグレードします。v1.7.1 より前のバージョンの場合は、kubectl edit cm -n kube-system coredns コマンドを実行して bufsize を設定できます。値は [512, 4096] の範囲内である必要があります。詳細については、CoreDNS ドキュメントをご参照ください。
. {
bufsize 1220
log
}
サービス作成後にリクエストが NXDOMAIN および NOERR を返す
CoreDNS コンポーネントは複数の Pod インスタンスでデプロイされます。新しいサービスが作成された後、いずれかの Pod が API サーバーから最新情報を迅速に取得しない場合、複数のリクエストが一貫性のない結果を返す可能性があります。CoreDNS Pod が最新のサービス情報を取得した後、DNS リクエストの結果は一貫性のあるものになります。
Windows ノードでの DNS 名前解決
-
Windows ノードで実行されている Pod は
ClusterFirstWithHostNetをサポートしていません。Windows は、ピリオド (.) を含むすべての名前を完全修飾ドメイン名 (FQDN) として扱い、名前解決中に DNS 検索サフィックスを追加しません。 -
Windows は複数の DNS リゾルバーをサポートしており、それぞれにわずかな動作の違いがあります。Resolve-DnsName PowerShell コマンドレットを名前解決クエリに使用することを推奨します。
-
名前を解決するために DNS サフィックスのリストを検索できる Linux とは異なり、Windows は Pod の名前空間に関連付けられている単一の DNS サフィックスのみを使用します。たとえば、
default名前空間で作成された Pod は、DNS サフィックスdefault.svc.cluster.localを受け取ります。Windows ノード上の Pod では、kubernetes.default.svc.cluster.localとkubernetesは解決できますが、kubernetes.defaultやkubernetes.default.svcのような部分的に修飾された名前は解決できません。
詳細については、「サービスと Pod の DNS」をご参照ください。