AKS クラスター全体の DNS エラーをリアルタイムでトラブルシューティングする
Kubernetes 内のドメイン ネーム システム (DNS) の問題により、ポッド、サービス、および外部リソース間の通信が中断され、アプリケーションの障害とパフォーマンスの低下が発生する可能性があります。 この記事では、Azure Kubernetes Service (AKS) クラスター全体の DNS エラーをリアルタイムでトラブルシューティングする方法について説明します。
Note
この記事では、 ポッド内からの DNS 解決エラーのトラブルシューティングガイド 補足します。
現象
次の表は、AKS クラスターで観察される可能性がある一般的な症状の概要を示しています。
現象 | 説明 |
---|---|
エラー率が高い | DNS クエリは失敗するか、予期しない結果を返します。これは、それらに依存するアプリケーションのパフォーマンスと信頼性に影響を与える可能性があります。 |
応答しないサービス | DNS クエリの解決に通常よりも時間がかかるため、それらに依存するアプリケーションで遅延やタイムアウトが発生する可能性があります。 |
サービス検出が影響を受けます | DNS の問題により、アプリケーションはクラスター内の他のアプリケーションを見つけられないため、サービスの中断や障害につながる可能性があります。 |
外部通信が影響を受けます | DNS の問題が原因で、アプリケーションがクラスター外の外部リソースまたはエンドポイントにアクセスできないと、エラーが発生したり、パフォーマンスが低下したりする可能性があります。 |
前提条件
Azure CLI。
Azure CLI をインストールするには、「 Azure CLI のインストール方法を参照してください。
Kubernetes コマンド ライン ツール kubectl など、クラスターに接続するためのツール。
Azure CLI を使用して kubectl をインストールするには、az aks install-cli コマンドを実行します。
-
このツールは、この記事で説明するほとんどのトラブルシューティング手順で使用されるため、クラスターにインストールしてください。 AKS クラスターにインストールするには、「 AKS クラスターに Inspektor Gadget をインストールする方法を参照してください。
gadgetsに関する知識。
-
これは、次のすべてのトラブルシューティング手順で使用されます。
AKS クラスター全体の DNS エラーのトラブルシューティングを行うには、次のセクションの手順に従います。
手順 1: クラスター全体で問題のある DNS 応答を特定する
DNS ガジェットを使用して、クラスター全体で失敗したすべての DNS 応答を識別できます。 このチェックを実行するには、次のコマンドを使用して、すべてのノードで DNS パケットをトレースし、失敗した応答をフィルター処理します。
$ kubectl gadget trace dns --all-namespaces --output columns=k8s,name,qtype,rcode --filter qr:R --filter qtype:A --filter 'rcode:!No Error'
K8S.NODE K8S.NAMESPACE K8S.POD K8S.CONTAINER NAME QTYPE RCODE
aks-agen... default test-pod nginx myaks-troubleshoot. A Non-Existent Domain
aks-agen... default test-pod nginx myaks-troubleshoot. A Non-Existent Domain
コマンド パラメーターの説明を次に示します。
--all-namespaces
: すべての名前空間のポッドからのデータを表示します。-output columns=k8s,name,qtype,rcode
: Kubernetes 情報、DNS 名、クエリの種類、DNS クエリの結果のみが表示されます。--filter qr:R
: DNS 応答のみに一致します。--filter qtype:A
: IPv4 ホスト アドレスにのみ一致します。--filter 'rcode:!No Error'
:No Error
を含まない DNS 応答と一致します。 詳細については、rcode の可能な値のgopacket
またはリレーショナル RFC を参照してください。
DNS 応答が失敗した原因を次に示します。
- 解決される DNS 名に入力ミスがあります。
- アップストリーム DNS ネームサーバーで問題が発生します。
- 展開後に DNS 名が無効になります。 ポッドの
/etc/resolv.conf
を使用して DNS クエリを拡張する方法については、「 Services の名前空間を参照してください。
手順 2: クラスター全体で処理に時間がかかる DNS クエリを特定する
DNS ガジェットを使用して、クラスター全体のすべての低速 DNS クエリを識別できます。 このチェックを実行するには、すべてのノードで DNS パケットをトレースし、低速応答をフィルター処理します。
次の例では、遅延パケットを定義するために 5ms
の待機時間の値を使用しています。 5μs
、20ms
、1s
など、目的の値に変更できます。
$ kubectl gadget trace dns --all-namespaces --output columns=k8s,name,rcode,latency --filter 'latency:>5ms'
K8S.NODE K8S.NAMESPACE K8S.POD K8S.CONTAINER NAME RCODE LATENCY
aks-agen... kube-system coredn... coredns global.prod.micro... No Error 5.373123ms
aks-agen... kube-system coredn... coredns global.prod.micro... No Error 5.373123ms
コマンド パラメーターの説明を次に示します。
--all-namespaces
: すべての名前空間のポッドからのデータを表示します。--output columns=k8s,name,rcode,latency
: Kubernetes 情報、DNS 名、DNS 応答の結果、応答の待機時間のみが表示されます。--filter 'latency:>5ms'
: 少なくとも5 ms
の待機時間を持つ DNS 応答のみを照合します。
DNS クエリが遅くなる原因を次に示します。
- アップストリーム DNS ネームサーバーで問題が発生します。
- クラスターでのネットワークの問題。
- CoreDNS ポッドは使用できません。 ポッドが正常に実行されていることを確認するには、「 ポッド内から DNS 解決エラーをトラブルシューティングするに従ってください。
手順 3: アップストリーム DNS サーバーの正常性を検証する
DNS ガジェットを使用して、CoreDNS によって使用されるアップストリーム DNS サーバーの正常性を確認できます。 アプリケーションが外部ドメインに到達しようとすると、クエリは CoreDNS 経由でアップストリーム DNS サーバーに転送されます。 これらのクエリの正常性を理解するには、CoreDNS ポッドから出る DNS パケットをトレースし、ネームサーバーでフィルター処理します。
次の例では、 既定の Azure DNS サーバー (IP アドレス 168.63.129.16) がアップストリーム ネーム サーバーとして使用されます。 カスタム DNS サーバーを使用している場合は、カスタム DNS サーバーの IP アドレスをアップストリーム ネーム サーバーとして使用できます。 IP アドレスを取得するには、ノードで /etc/resolv.conf を調べます。
$ kubectl gadget trace dns -n kube-system -l k8s-app=kube-dns -o columns=k8s,id,qr,name,rcode,nameserver,latency -F nameserver:168.63.129.16
K8S.NODE K8S.NAMESPACE K8S.POD K8S.CONTAINER ID QR NAME RCODE NAMESERVER LATENCY
aks-agen... kube-system coredns-6d5bb68c46-ntz2q coredns b256 Q microsoft.com. 168.63.129.16
aks-agen... kube-system coredns-6d5bb68c46-ntz2q coredns b256 R microsoft.com. No Error 168.63.129.16 500.821223ms
コマンド パラメーターの説明を次に示します。
-n kube-system
:kube-system
名前空間からのデータのみを表示します。-l k8s-app=kube-dns
: ラベルがk8s-app=kube-dns
(CoreDNS ポッド) のポッドとの間のデータのみを表示します。-o columns=k8s,id,name,rcode,nameserver,latency
: Kubernetes 情報、DNS クエリ ID、クエリ/応答、DNS 名、DNS 応答の結果、ネーム サーバー、応答の待機時間のみを表示します。-F nameserver:168.63.129.16
: イベントのフィルター処理に使用されるアップストリーム DNS サーバー。
ID
、RCODE
、およびLATENCY
の値を使用して、アップストリーム DNS サーバーの正常性を判断できます。 たとえば、異常なアップストリーム サーバーがある場合、次の出力が表示されます。
ID
(たとえば、b256
) を持つ DNS クエリ (QR=Q
) には、一致する応答がありません。- DNS 応答 (
QR=R
) は、LATENCY
列 (たとえば、500.821223ms
) の下に高い値を持ちます。 - DNS 応答 (
QR=R
) には、No Error
以外のRCODE
があります (例: "サーバーの失敗"、"クエリが拒否されました")。詳細については、rcode の可能な値のgopacket
を参照してください。
手順 4: DNS クエリが適切なタイミングで応答を得ることを検証する
DNS ガジェットを使用して、特定の DNS クエリがタイムリーに応答を取得することを確認できます。 このチェックを実行するには、DNS 名でイベントをフィルター処理し、クエリ/応答 ID と一致させます。
$ kubectl gadget trace dns -l app=test-pod --output columns=k8s,id,qtype,qr,name,rcode,latency --filter name:microsoft.com.
K8S.NODE K8S.NAMESPACE K8S.POD K8S.CONTAINER ID QTYPE QR NAME RCODE LATENCY
aks-agen... default test-pod nginx 97b3 A Q microsoft.com.
aks-agen... default test-pod nginx 97b3 A R microsoft.com. No Error 1.954413ms
aks-agen... default test-pod nginx 97b3 A R microsoft.com. No Error
aks-agen... default test-pod nginx c6c5 AAAA Q microsoft.com.
aks-agen... default test-pod nginx c6c5 AAAA R microsoft.com. No Error 1.885412ms
aks-agen... default test-pod nginx c6c5 AAAA R microsoft.com. No Error
コマンド パラメーターの説明を次に示します。
-l app=test-pod
: ラベルがapp=test-pod
されたポッドとの間のデータのみを表示します。--output columns=k8s,id,qtype,qr,name,rcode,latency
: Kubernetes 情報、DNS クエリ ID、クエリの種類、クエリ/応答、DNS 名、DNS 応答の結果、応答の待機時間のみを表示します。--filter name:microsoft.com.
: DNS 名を持つ DNS パケットのみを照合microsoft.com.
フィルター値が完全修飾ドメイン名 (FQDN) であることを確認するには、名前の末尾にドット (.
) を追加します。
ID
値 (たとえば、97b3
) を使用して、クエリを応答と関連付けることができます。 また、 LATENCY
値を使用して、タイムリーに応答を取得することを検証することもできます。
手順 5: DNS 応答に含まれている IP アドレスが想定内のものであることを検証する
DNS ガジェットを使用して、特定の DNS クエリが予想される応答を取得することを確認できます。 たとえば、 ヘッドレス サービス ( myheadless という名前) の場合、応答にはすべてのポッドの IP アドレスが含まれていると想定されます。
$ kubectl gadget trace dns -l app=test-pod -o columns=k8s,id,qtype,qr,name,rcode,numAnswers,addresses -F name:~myheadless
K8S.NODE K8S.NAMESPACE K8S.POD K8S.CONTAINER ID QTYPE QR NAME RCODE NUMANSWERS ADDRESSES
aks-agen... default test-pod nginx f930 A R myheadless.defau... No Error 2 10.244.2.18,10.244.2.19
aks-agen... default test-pod nginx f930 A R myheadless.defau... No Error 2 10.244.2.18,10.244.2.19
aks-agen... default test-pod nginx f930 A Q myheadless.defau... 0
コマンド パラメーターの説明を次に示します。
-l app=test-pod
: ラベルがapp=test-pod
されたポッドとの間のデータのみを表示します。-o columns=k8s,id,qtype,qr,name,rcode,numAnswers,addresses
: Kubernetes 情報、DNS クエリ ID、クエリの種類、クエリ/応答、DNS 名、DNS 応答の結果、回答の数、応答の IP アドレスのみが表示されます。-F name:~myheadless
:~myheadless
正規表現チェックに合格した DNS パケットのみが含まれます。
NUMANSWERS
とADDRESSES
の値を使用して、kubectl get ep myheadless
から取得した値と一致させることができます。
$ kubectl get ep myheadless
NAME ENDPOINTS AGE
myheadless 10.244.2.18:8080,10.244.2.19:8080 10d
サードパーティの情報に関する免責事項
この資料に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。 明示的か黙示的かにかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。
お問い合わせはこちらから
質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。