AKS クラスター全体の DNS エラーをリアルタイムでトラブルシューティングする

Kubernetes 内のドメイン ネーム システム (DNS) の問題により、ポッド、サービス、および外部リソース間の通信が中断され、アプリケーションの障害とパフォーマンスの低下が発生する可能性があります。 この記事では、Azure Kubernetes Service (AKS) クラスター全体の DNS エラーをリアルタイムでトラブルシューティングする方法について説明します。

現象

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

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

前提条件

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

$ 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 クエリが遅くなる原因を次に示します。

手順 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 サーバー。

IDRCODE、および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 パケットのみが含まれます。

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