次の方法で共有


AKS での DNS 解決エラーをトラブルシューティングするためのリアルタイム DNS トラフィック分析

この記事では、Azure Kubernetes Service (AKS) クラスター全体で発生したドメイン ネーム システム (DNS) のエラーをリアルタイムでトラブルシューティングする方法について説明します。

症状

次の表は、AKS クラスターで観察される可能性がある一般的な症状の概要を示しています。

症状 説明
エラー率が高い DNS クエリは失敗するか、予期しない結果を返します。これは、それらに依存するアプリケーションのパフォーマンスと信頼性に影響を与える可能性があります。
応答しないサービス DNS クエリの解決に通常よりも時間がかかるため、それらに依存するアプリケーションで遅延やタイムアウトが発生する可能性があります。
サービス検出が影響を受けます DNS の問題により、アプリケーションはクラスター内の他のアプリケーションを見つけられないため、サービスの中断や障害につながる可能性があります。
外部通信が影響を受けます DNS の問題が原因で、アプリケーションがクラスター外の外部リソースまたはエンドポイントにアクセスできないと、エラーが発生したり、パフォーマンスが低下したりする可能性があります。

[前提条件]

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μs20ms1sなど、目的の値に変更できます。

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

RCODELATENCYの値を使用して、アップストリーム 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_ANSWERSADDRESSESの値を使用して、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 フィードバック コミュニティに製品フィードバックを送信することもできます。