共用方式為


即時針對 AKS 叢集的 DNS 失敗進行疑難解答

Kubernetes 內的功能變數名稱系統 (DNS) 問題可能會中斷 Pod、服務和外部資源之間的通訊,這會導致應用程式失敗和效能降低。 本文討論如何即時針對 Azure Kubernetes Service (AKS) 叢集的 DNS 失敗進行疑難解答。

注意

本文補充 Pod 指南中的針對 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:顯示所有命名空間中 Pod 的數據。
  • -output columns=k8s,name,qtype,rcode:只顯示 Kubernetes 資訊、DNS 名稱、查詢類型和 DNS 查詢結果。
  • --filter qr:R:只比對 DNS 回應。
  • --filter qtype:A:僅符合 IPv4 主機位址。
  • --filter 'rcode:!No Error':符合不包含 No Error的 DNS 回應。 如需詳細資訊,請參閱 gopacket rcode 相關 RFC 的可能值。

以下是 DNS 回應失敗的一些原因:

  • 要解析的 DNS 名稱有錯字。
  • 上游 DNS 名稱伺服器遇到問題。
  • 擴充之後,DNS 名稱會變成無效。 若要瞭解如何使用Pod /etc/resolv.conf擴充 DNS 查詢,請參閱 服務命名空間。

步驟 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:顯示所有命名空間中 Pod 的數據。
  • --output columns=k8s,name,rcode,latency:只顯示 Kubernetes 資訊、DNS 名稱、DNS 回應結果和回應延遲。
  • --filter 'latency:>5ms':比對至少延遲為 5 ms的 DNS 回應。

以下是 DNS 查詢緩慢的一些原因:

步驟 3:驗證上游 DNS 伺服器的健康情況

您可以使用 DNS 小工具來驗證 CoreDNS 所使用的上游 DNS 伺服器健康情況。 如果應用程式嘗試連線到外部網域,查詢會透過CoreDNS轉送至上游 DNS 伺服器。 若要了解這些查詢的健康情況,請追蹤離開 CoreDNS Pod 的 DNS 封包,並依 nameserver 進行篩選。

在下列範例中,預設的 Azure DNS 伺服器 (IP 位址 168.63.129.16) 會作為上游名稱伺服器使用。 如果您使用自定義 DNS 伺服器,您可以使用自訂 DNS 伺服器的 IP 位址作為上游名稱伺服器。 您可以在節點上查閱 /etc/resolv.conf 來取得IP位址。

$ 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 的 Pod/從 Pod 的數據(CoreDNS Pod)。
  • -o columns=k8s,id,name,rcode,nameserver,latency:只顯示 Kubernetes 資訊、DNS 查詢標識碼、查詢/回應、DNS 名稱、DNS 回應結果、nameserver 和回應延遲。
  • -F nameserver:168.63.129.16:用來篩選事件的上游 DNS 伺服器。

您可以使用 IDRCODELATENCY 值來判斷上游 DNS 伺服器的健全狀況。 例如,如果有狀況不良的上游伺服器,您會看到下列輸出:

  • 具有 (QR=Q例如,b256) 的 ID DNS 查詢沒有相符的回應。
  • DNS 回應 (QR=R) 在資料列下 LATENCY 具有較高的值(例如 , 500.821223ms
  • DNS 回應 (QR=R) 除了 RCODE 以外No Error,例如「伺服器失敗」和「查詢已拒絕」。如需詳細資訊,請參閱 gopacket rcode 的可能值。

步驟 4:確認 DNS 查詢是否及時取得回應

您可以使用 DNS 小工具來確認特定 DNS 查詢會及時取得回應。 若要執行這項檢查,請使用 DNS 名稱篩選事件,並符合查詢/回應識別碼:

$ 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之 Pod 的來回數據。
  • --output columns=k8s,id,qtype,qr,name,rcode,latency:只顯示 Kubernetes 資訊、DNS 查詢標識碼、查詢類型、查詢/回應、DNS 名稱、DNS 回應結果和響應延遲。
  • --filter name:microsoft.com.:只比對 DNS 名稱 microsoft.com. 的 DNS 封包,以確保篩選值是完整功能變數名稱 (FQDN),將點 (.) 新增至名稱的結尾。

ID值 (例如, 97b3) 可用來將查詢與回應相互關聯。 您也可以使用 LATENCY 值來驗證您是否及時取得回應。

步驟 5:確認 DNS 回應是否包含預期的 IP 位址

您可以使用 DNS 小工具來確認特定 DNS 查詢取得預期的回應。 例如,針對 無前端服務 (名為 myheadless),您預期回應會包含所有 Pod 的 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之 Pod 的來回數據。
  • -o columns=k8s,id,qtype,qr,name,rcode,numAnswers,addresses:僅顯示 Kubernetes 資訊、DNS 查詢識別碼、查詢類型、查詢/回應、DNS 名稱、DNS 回應結果、回應中的答案數目和 IP 位址。
  • -F name:~myheadless:只包含傳遞 regex 檢查的 ~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 

協力廠商資訊免責聲明

本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。