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