ポッド内からの DNS 解決エラーのトラブルシューティングを行うが、ワーカー ノードからのトラブルシューティングは行わない
この記事では、Microsoft Azure Kubernetes Service (AKS) クラスターからの送信接続を確立しようとしたときに、ポッド内から発生するがワーカー ノードからは発生しないドメイン ネーム システム (DNS) 解決エラーのトラブルシューティング方法について説明します。
前提条件
Kubernetes kubectl ツール、またはクラスターに接続するための同様のツール。 Azure CLI を使用して kubectl をインストールするには、az aks install-cli コマンドを実行します。
パッケージを処理するための apt-get コマンド ライン ツール。
DNS 参照用の ホスト コマンド ライン ツール。
systemctl コマンド ライン ツール。
背景
DNS 解決のために、ポッドは名前空間の CoreDNS ポッドに要求を kube-system
送信します。
DNS クエリがサービス名などの内部コンポーネントに対する場合、CoreDNS ポッドはそれ自体で応答します。 ただし、要求が外部ドメインに対する場合、CoreDNS ポッドはアップストリーム DNS サーバーに要求を送信します。
アップストリーム DNS サーバーは、ポッドが実行されているワーカー ノードの resolv.conf ファイルに基づいて取得されます。 resolve.conf ファイル (/run/systemd/resolve/resolve.conf) は、ワーカー ノードが実行されている仮想ネットワークの DNS 設定に基づいて更新されます。
トラブルシューティング チェックリスト
ポッド内から DNS の問題をトラブルシューティングするには、次のセクションの手順を使用します。
手順 1: ポッド内からの DNS の問題のトラブルシューティング
次の手順に示すように、kubectl コマンドを使用してポッド内から DNS の問題をトラブルシューティングできます。
CoreDNS ポッドが実行されていることを確認します。
kubectl get pods -l k8s-app=kube-dns -n kube-system
CoreDNS ポッドが過剰に使用されているかどうかを確認します。
$ kubectl top pods -n kube-system -l k8s-app=kube-dns NAME CPU(cores) MEMORY(bytes) coredns-dc97c5f55-424f7 3m 23Mi coredns-dc97c5f55-wbh4q 3m 25Mi
CoreDNS ポッドをホストするノードが過度に使用されていないことを確認します。 また、CoreDNS ポッドをホストしているノードを取得します。
kubectl get pods -n kube-system -l k8s-app=kube-dns -o jsonpath='{.items[*].spec.nodeName}'
これらのノードの使用状況を確認します。
kubectl top nodes
CoreDNS ポッドのログを確認します。
kubectl logs -l k8s-app=kube-dns -n kube-system
注:
詳細なデバッグ情報を表示するには、CoreDNS で詳細ログを有効にします。 CoreDNS で詳細ログを有効にするには、「 AKS での CoreDNS カスタマイズのトラブルシューティング」を参照してください。
手順 2: コマンドを実行するテスト ポッドを作成する
DNS 解決が失敗した場合は、次の手順に従います。
クラスターでテスト ポッドを開始します。
kubectl run -it --rm aks-ssh --namespace <namespace> --image=debian:stable
テスト ポッドが実行されている場合は、ポッドにアクセスできます。
次のコマンドを実行して、必要なパッケージをインストールします。
apt-get update -y apt-get install dnsutils -y
resolv.conf ファイルに正しいエントリがあることを確認します。
cat /etc/resolv.conf search default.svc.cluster.local svc.cluster.local cluster.local 00idcnmrrm4edot5s2or1onxsc.bx.internal.cloudapp.net nameserver 10.0.0.10 options ndots:5
コマンドを
host
使用して、DNS 要求がアップストリーム サーバーにルーティングされているかどうかを判断します。$ host -a microsoft.com Trying "microsoft.com.default.svc.cluster.local" Trying "microsoft.com.svc.cluster.local" Trying "microsoft.com.cluster.local" Trying "microsoft.com.00idcnmrrm4edot5s2or1onxsc.bx.internal.cloudapp.net" Trying "microsoft.com" Trying "microsoft.com" ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62884 ;; flags: qr rd ra; QUERY: 1, ANSWER: 27, AUTHORITY: 0, ADDITIONAL: 5 ;; QUESTION SECTION: ;microsoft.com. IN ANY ;; ANSWER SECTION: microsoft.com. 30 IN NS ns1-39.azure-dns.com. ... ... ns4-39.azure-dns.info. 30 IN A 13.107.206.39 Received 2121 bytes from 10.0.0.10#53 in 232 ms
ポッドからのアップストリーム DNS サーバーを調べて、DNS 解決が正しく動作しているかどうかを確認します。 たとえば、Azure DNS の場合は、次の nslookup コマンドを 実行します。
$ nslookup microsoft.com 168.63.129.16 Server: 168.63.129.16 Address: 168.63.129.16#53 ... ... Address: 20.81.111.85
手順 3: アップストリーム DNS サーバーが明示的に指定されている場合に DNS 要求が機能するかどうかを確認する
アップストリーム DNS サーバーを明示的に指定するときにポッドからの DNS 要求が機能している場合は、次の条件を確認します。
CoreDNS 用のカスタム ConfigMap を確認します。
kubectl describe cm coredns-custom -n kube-system
カスタム ConfigMap が存在する場合は、構成が正しいことを確認します。 詳細については、「Azure Kubernetes Serviceを使用した CoreDNS のカスタマイズ」を参照してください。
ネットワーク ポリシーが、名前空間の CoreDNS ポッドへのユーザー データグラム プロトコル (UDP) ポート 53 のトラフィックを
kube-system
ブロックしているかどうかを確認します。CoreDNS ポッドが別のノード プール (システム ノード プール) 上にあるかどうかを確認します。 その場合は、ネットワーク セキュリティ グループ (NSG) が UDP ポート 53 のトラフィックをブロックしているシステム ノード プールに関連付けられているかどうかをチェックします。
新しい DNS サーバーを追加するために、仮想ネットワークが最近更新されたかどうかを確認します。
仮想ネットワークの更新が発生した場合は、次のいずれかのイベントも発生したかどうかをチェックします。
- ノードが再起動されました。
- ノード内のネットワーク サービスが再起動されました。
DNS 設定の更新を有効にするには、ノードと CoreDNS ポッドのネットワーク サービスを再起動する必要があります。 ネットワーク サービスまたはポッドを再起動するには、次のいずれかの方法を使用します。
ノードを再起動します。
新しいノードをスケーリングします。 (新しいノードの構成は更新されます)。
ノード内のネットワーク サービスを再起動し、CoreDNS ポッドを再起動します。 次の手順を実行します。
ノードへの Secure Shell (SSH) 接続を確立します。 詳細については、「メンテナンスまたはトラブルシューティングのためにAzure Kubernetes Service (AKS) クラスター ノードに接続する」を参照してください。
ノード内から、ネットワーク サービスを再起動します。
systemctl restart systemd-networkd
設定が更新されているかどうかを確認します。
cat /run/systemd/resolve/resolv.conf
ネットワーク サービスが再起動されたら、kubectl を使用して CoreDNS ポッドを再起動します。
kubectl delete pods -l k8s-app=kube-dns -n kube-system
仮想ネットワークの DNS 設定で複数の DNS サーバーが指定されているかどうかを確認します。
AKS 仮想ネットワークで複数の DNS サーバーが指定されている場合、次のいずれかのシーケンスが発生します。
AKS ノードは、一連の一部としてアップストリーム DNS サーバーに要求を送信します。 このシーケンスでは、要求は仮想ネットワークで構成されている最初の DNS サーバーに送信されます (DNS サーバーに到達可能で実行されている場合)。 最初の DNS サーバーに到達できないと応答していない場合、要求は次の DNS サーバーに送信されます。
AKS ノードでは 、リゾルバー コマンドを使用して DNS サーバーに要求を送信します。 このリゾルバーの構成ファイルは、AKS ノードの /run/systemd/resolve/resolve.conf にあります。
複数のサーバーはありますか? この場合、リゾルバー ライブラリは、一覧表示されている順序でクエリを実行します。 (使用される戦略は、まずネーム サーバーを試す方法です。クエリがタイムアウトした場合は、次のネーム サーバーを試し、ネーム サーバーの一覧が使い果たされるまで続行します。その後、再試行の最大数が行われるまで、クエリはネーム サーバーへの接続を試行し続けます)。
CoreDNS では 、転送 プラグインを使用してアップストリーム DNS サーバーに要求を送信します。 このプラグインでは、ランダム アルゴリズムを使用してアップストリーム DNS サーバーを選択します。 このシーケンスでは、要求は仮想ネットワークに記載されている任意の DNS サーバーに送信される可能性があります。 たとえば、次の出力が表示される場合があります。
$ kubectl describe cm coredns -n kube-system Name: coredns Namespace: kube-system Labels: addonmanager.kubernetes.io/mode=Reconcile k8s-app=kube-dns kubernetes.io/cluster-service=true Annotations: <none> Data ==== Corefile: ---- .:53 { errors ready health kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf # Here! cache 30 loop reload loadbalance import custom/*.override } import custom/*.server BinaryData ==== Events: <none>
CoreDNS
forward
プラグインで、policy
アップストリーム サーバーの選択に使用するポリシーを指定します。 ポリシーは次の表で定義されています。ポリシー名 説明 random
ランダムなアップストリーム選択を実装するポリシー。 このポリシーは既定のポリシーです。 round_robin
ラウンド ロビン順序に基づいてホストを選択するポリシー。 sequential
順次順序に基づいてホストを選択するポリシー。 AKS 仮想ネットワークに複数の DNS サーバーが含まれている場合、AKS ノードからの要求は最初の DNS サーバーに送信される可能性があります。 ただし、ポッドからの要求は、2 番目の DNS サーバーに送信される場合があります。
原因: DNS 要求の複数の宛先
2 つのカスタム DNS サーバーが指定され、3 つ目の DNS サーバーが Azure DNS (168.63.129.16) として指定されている場合、ノードは、実行されていて到達可能な場合、最初のカスタム DNS サーバーに要求を送信します。 このセットアップでは、ノードでカスタム ドメインを解決できます。 ただし、ポッドからの DNS 要求の一部が Azure DNS に送信される場合があります。 これは、CoreDNS がアップストリーム サーバーをランダムに選択できるためです。 このシナリオでは、カスタム ドメインを解決できません。 そのため、DNS 要求は失敗します。
解決策: 仮想ネットワーク設定から Azure DNS を削除する
仮想ネットワーク設定では、Azure DNS とカスタム DNS サーバーを組み合わせないようにすることをお勧めします。 カスタム DNS サーバーを使用する場合は、仮想ネットワーク設定にカスタム DNS サーバーのみを追加します。 次に、カスタム DNS サーバーのフォワーダー設定で Azure DNS を構成します。
詳細については、「独自の DNS サーバーを使用する名前解決」を参照してください。
サードパーティのお問い合わせ窓口に関する免責事項
Microsoft では、このトピックに関する追加情報を見つけるのに役立つサード パーティの連絡先情報を提供しています。 将来予告なしに変更されることがあります。 Microsoft は、第三者の連絡先情報の正確性を保証しません。
お問い合わせはこちらから
質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。