即時針對 AKS 叢集的 DNS 失敗進行疑難解答
Kubernetes 內的功能變數名稱系統 (DNS) 問題可能會中斷 Pod、服務和外部資源之間的通訊,這會導致應用程式失敗和效能降低。 本文討論如何即時針對 Azure Kubernetes Service (AKS) 叢集的 DNS 失敗進行疑難解答。
注意
本文補充 Pod 指南中的針對 DNS 解析失敗進行疑難解答。
徵兆
下表概述您可能會在 AKS 叢集中觀察到的常見徵兆:
徵兆 | 描述 |
---|---|
高錯誤率 | DNS 查詢失敗或傳回非預期的結果,可能會影響相依應用程式的效能和可靠性。 |
沒有回應的服務 | DNS 查詢需要比平常更長的時間才能解析,這可能會導致依賴這些查詢的應用程式中延遲或逾時。 |
服務探索受到影響 | 應用程式因為 DNS 問題而找不到叢集中的其他應用程式,這可能會導致服務中斷或失敗。 |
外部通訊受到影響 | 由於 DNS 問題,應用程式無法存取叢集外部資源或端點,這可能會導致錯誤或效能降低。 |
必要條件
Azure CLI。
若要安裝 Azure CLI,請參閱 如何安裝 Azure CLI。
聯機到叢集的工具,例如 Kubernetes 命令行工具 kubectl。
若要使用 Azure CLI 安裝 kubectl,請執行 az aks install-cli 命令。
-
此工具用於本文涵蓋的大部分疑難解答步驟中,因此請務必在叢集上安裝此工具。 若要在 AKS 叢集上安裝它,請參閱 如何在 AKS 叢集中安裝 Inspektor 小工具。
-
它用於下列所有疑難解答步驟。
若要針對 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μ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
:顯示所有命名空間中 Pod 的數據。--output columns=k8s,name,rcode,latency
:只顯示 Kubernetes 資訊、DNS 名稱、DNS 回應結果和回應延遲。--filter 'latency:>5ms'
:比對至少延遲為5 ms
的 DNS 回應。
以下是 DNS 查詢緩慢的一些原因:
- 上游 DNS 名稱伺服器遇到問題。
- 叢集中的網路問題。
- CoreDNS Pod 無法使用。 若要確認 Pod 正常執行,請遵循針對 Pod 內的 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 伺服器。
您可以使用 ID
、 RCODE
和 LATENCY
值來判斷上游 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 封包。
您可以使用 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
協力廠商資訊免責聲明
本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。
與我們連絡,以取得說明
如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。