この記事では、Azure Kubernetes Service (AKS) クラスター全体で発生したドメイン ネーム システム (DNS) のエラーをリアルタイムでトラブルシューティングする方法について説明します。
注
この記事は、 AKS ガイドの 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 をインストールする方法」を参照してください。
ガジェットに精通すること。
-
これは、次のすべてのトラブルシューティング手順で使用されます。
AKS クラスター全体の DNS エラーのトラブルシューティングを行うには、次のセクションの手順に従います。 開始する前に、ガジェットのバージョンを変数にエクスポートします。 この変数は、この記事のすべてのコマンドで使用されます。
GADGET_VERSION=$(kubectl gadget version | grep Server | awk '{print $3}')
別のバージョンをお選びください。 たとえば、 latest
または main
を使用して、ガジェットの最新の安定版または開発バージョンをそれぞれ取得できます。
手順 1: クラスター全体で失敗した DNS 応答を特定する
DNS ガジェットを使用して、クラスター全体で失敗したすべての DNS 応答を識別できます。 このチェックを実行するには、すべてのノードで DNS パケットをトレースし、失敗した応答をフィルター処理します。
kubectl gadget run trace_dns:$GADGET_VERSION \
--all-namespaces \
--fields k8s.node,src,dst,name,qtype,rcode \
--filter "qr==R,rcode!=Success"
コマンド パラメーターの説明を次に示します。
-
--all-namespaces
: すべての名前空間のポッドからのデータを表示します。 -
--fields k8s.node,src,dst,name,qtype,rcode
: Kubernetes 情報、DNS パケットの送信元と送信先、DNS 名、DNS クエリの種類、および DNS 応答コードのみを表示します。 -
--filter "qr==R,rcode!=Success"
:Success
以外の応答コードを持つ DNS 応答 (qr==R
) のみと一致します。
出力は次のようになります。
K8S.NODE SRC DST NAME QTYPE RCODE
aks-agentpool-…919-vmss000000 p/kube-system/coredns-57d886c994-r2ts… p/default/mypod:38480 myaks-troubleshoot. A NameError
aks-agentpool-…919-vmss000000 s/kube-system/kube-dns:53 p/default/mypod:38480 myaks-troubleshoot. A NameError
ここで、 RCODE
は DNS 応答コードであり、DNS エラーの種類を特定するのに役立ちます。
DNS 応答が失敗した原因を次に示します。
解決される DNS 名に入力ミスがあります。
アップストリーム DNS ネームサーバーで問題が発生します。
正しく構成されていないネットワーク構成 (NetworkPolicy (NetPol)、ファイアウォール、NSG 規則など) は、DNS トラフィックをブロックします。
展開後に DNS 名が無効になります。
ポッドの
/etc/resolv.conf
ファイルを使用して DNS クエリを拡張する方法については、「 サービスの名前空間」を参照してください。
手順 2: クラスター全体で低速 DNS クエリを特定する
DNS ガジェットを使用して、クラスター全体のすべての低速 DNS クエリを識別できます。 このチェックを実行するには、すべてのノードで DNS パケットをトレースし、低速応答をフィルター処理します。
次の例では、遅延パケットを定義するために 5ms
の待機時間の値を使用しています。
5μs
、20ms
、1s
など、目的の値に変更できます。
kubectl gadget run trace_dns:$GADGET_VERSION \
--all-namespaces \
--fields k8s.node,src,dst,name,qtype,rcode,latency_ns \
--filter "latency_ns_raw>5000000"
コマンド パラメーターの説明を次に示します。
-
--all-namespaces
: すべての名前空間のポッドからのデータを表示します。 -
--fields k8s.node,src,dst,name,qtype,rcode,latency_ns
: Kubernetes 情報、DNS パケットの送信元と送信先、DNS 名、DNS クエリの種類、DNS 応答コード、待機時間のみをナノ秒単位で表示します。 -
--filter "latency_ns_raw>5000000"
: 待機時間が5ms
(5000000
ナノ秒) を超える DNS 応答のみを照合します。
出力は次のようになります。
K8S.NODE SRC DST NAME QTYPE RCODE LATENCY_NS
aks-agentpool…9-vmss000001 168.63.129.16:53 p/kube-system/coredns-57d886c994… microsoft.com. A Success 14.02ms
aks-agentpool…9-vmss000000 s/kube-system/kube-dns:53 p/default/mypod:39168 microsoft.com. A Success 15.40ms
aks-agentpool…9-vmss000000 168.63.129.16:53 p/kube-system/coredns-57d886c994… microsoft.com. AAAA Success 5.90ms
aks-agentpool…9-vmss000000 s/kube-system/kube-dns:53 p/default/mypod:38953 microsoft.com. AAAA Success 6.41ms
DNS クエリが遅くなる原因を次に示します。
- アップストリーム 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 run trace_dns:$GADGET_VERSION \
--all-namespaces \
--fields src,dst,id,qr,name,nameserver,rcode,latency_ns \
--filter "nameserver.addr==168.63.129.16"
コマンド パラメーターの説明を次に示します。
-
--all-namespaces
: すべての名前空間のポッドからのデータを表示します。 -
--fields src,dst,id,qr,name,nameserver,rcode,latency_ns
: DNS パケットの送信元と宛先、DNS クエリ ID、クエリ/応答、DNS 名、ネームサーバー、DNS 応答の結果、待機時間のみをナノ秒単位で表示します。 -
--filter "nameserver.addr==168.63.129.16"
: ネームサーバーの IP アドレスが168.63.129.16
された DNS パケットのみを照合します。
出力は次のようになります。
SRC DST ID QR NAME NAMESERVER RCODE LATENCY_NS
p/kube-system/coredns-57d886c994-vsj7g:60… r/168.63.129.16:53 4828 Q qasim-cluster-dns-sqia0j5i.hc… 168.63.129.16 0ns
p/kube-system/coredns-57d886c994-pcv59:51… r/168.63.129.16:53 5015 Q qasim-cluster-dns-sqia0j5i.hc… 168.63.129.16 0ns
r/168.63.129.16:53 p/kube-system/coredns-57d886c994-pcv59:51… 5015 R qasim-cluster-dns-sqia0j5i.hc… 168.63.129.16 Success 5.06ms
r/168.63.129.16:53 p/kube-system/coredns-57d886c994-vsj7g:60… 4828 R qasim-cluster-dns-sqia0j5i.hc… 168.63.129.16 Success 23.01ms
RCODE
とLATENCY
の値を使用して、アップストリーム DNS サーバーの正常性を判断できます。 たとえば、異常なアップストリーム サーバーがある場合、次の出力が表示されます。
- ID (
4828
など) を持つ DNS クエリ (QR=Q
) には、一致する応答がありません。 - DNS 応答 (
QR=R
) は、LATENCY_NS
列 (たとえば、23.01ms
) の下に高い値を持ちます。 - DNS 応答 (
QR=R
) には、"ServerFailure" や "拒否" など、Success
以外のRCODE
があります。
手順 4: DNS クエリがタイムリーに応答を取得するを確認する
DNS ガジェットを使用して、特定の DNS クエリがタイムリーに応答を取得することを確認できます。 このチェックを実行するには、DNS 名でイベントをフィルター処理し、クエリ/応答 ID と一致させます。
kubectl gadget run trace_dns:$GADGET_VERSION \
-l app=test-pod \
--fields k8s.node,k8s.namespace,k8s.podname,id,qtype,qr,name,rcode,latency_ns \
--filter name==microsoft.com.
コマンド パラメーターの説明を次に示します。
-
-l app=test-pod
: 既定の名前空間にapp=test-pod
ラベルを持つポッドとの間のデータのみを表示します。 -
--fields k8s.node,k8s.namespace,k8s.podname,id,qtype,qr,name,rcode,latency_ns
: Kubernetes 情報、DNS クエリ ID、クエリの種類、クエリ/応答、DNS 名、DNS 応答の結果、待機時間のみをナノ秒単位で表示します。 -
--filter name==microsoft.com.
: DNS 名を持つ DNS パケットのみを照合microsoft.com.
名前の末尾にドット (.
) を追加して、フィルター値が完全修飾ドメイン名 (FQDN) であることを確認します。
出力は次のようになります。
K8S.NODE K8S.NAMESPACE K8S.PODNAME ID QTYPE QR NAME RCODE LATENCY_NS
aks-agentpoo…9-vmss000000 default mypod 102d A Q microsoft.com. 0ns
aks-agentpoo…9-vmss000000 default mypod 102d A R microsoft.com. Success 11.87ms
aks-agentpoo…9-vmss000000 default mypod d482 AAAA Q microsoft.com. 0ns
aks-agentpoo…9-vmss000000 default mypod d482 AAAA R microsoft.com. Success 9.27ms
ID
値 (たとえば、102d
) を使用して、クエリを応答と関連付けることができます。 また、 LATENCY_NS
値を使用して、タイムリーに応答を取得することを検証することもできます。
手順 5: DNS 応答に予想される IP アドレスが含まれていることを確認する
DNS ガジェットを使用して、特定の DNS クエリが予想される応答を取得することを確認できます。 たとえば、 ヘッドレス サービス ( myheadless という名前) の場合、応答にはすべてのポッドの IP アドレスが含まれていることが想定されます。
kubectl gadget run trace_dns:$GADGET_VERSION \
--fields k8s.podname,id,qtype,qr,name,rcode,num_answers,addresses \
--filter name~myheadless
コマンド パラメーターの説明を次に示します。
-
--fields k8s.podname,id,qtype,qr,name,rcode,num_answers,addresses
: Kubernetes 情報、DNS クエリ ID、クエリの種類、クエリ/応答、DNS 名、DNS 応答の結果、回答の数、応答の IP アドレスのみが表示されます。 -
--filter name~myheadless
:myheadless
を含む DNS 名を持つ DNS パケットのみを照合します。~
演算子は、正規表現との照合に使用されます。
出力は次のようになります。
K8S.PODNAME ID QTYPE QR NAME RCODE NUM_ANSWERS ADDRESSES
mypod f8b0 A Q myheadless.default.svc.cluster.loca… 0
mypod f8b0 A R myheadless.default.svc.cluster.loca… Success 2 10.244.0.146,10.24…
mypod abcd AAAA Q myheadless.default.svc.cluster.loca… 0
mypod abcd AAAA R myheadless.default.svc.cluster.loca… Success 0
NUM_ANSWERS
とADDRESSES
の値を使用して、kubectl get ep myheadless
から取得した値と一致させることができます。
kubectl get ep myheadless
NAME ENDPOINTS AGE
myheadless 10.244.0.146:80,10.244.1.207:80 10d
サードパーティの情報に関する免責事項
この記事で説明するサード パーティ製品は、Microsoft に依存しない企業によって製造されています。 明示的か黙示的かにかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。
お問い合わせはこちらから
質問がある場合やヘルプが必要な場合は、 サポートリクエストを作成するか、 Azure コミュニティ サポートに問い合わせてください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。