全部產品
Search
文件中心

Container Service for Kubernetes:網路診斷

更新時間:Jun 19, 2024

Container Service平台提供網路診斷功能,協助您診斷網路常見問題,例如Pod之間不通、叢集到公網訪問不通、公網到LoadBalancer不通。本文介紹網路診斷的基本原理、使用方式、以及如何針對常見網路不通的情境定位網路問題和使用網路診斷。

重要

使用故障診斷功能時,系統將在您的叢集節點上執行資料擷取程式並收集檢查結果。採集的資訊包括系統版本、負載、Docker、Kubelet等運行狀態及系統日誌中嚴重錯誤資訊。資料擷取程式不會採集您的商務資訊及敏感性資料。

前提條件

已建立ACK叢集。具體操作,請參見建立Kubernetes託管版叢集建立Kubernetes專有版叢集

網路診斷介紹

Container Service控制台中提供了網路診斷功能,通過輸入問題鏈路的源地址和目的地址、目的連接埠和協議,即可快速診斷常見網路問題。您無需對複雜的容器網路架構和網路外掛程式原理進行瞭解,也無需對系統核心有豐富的營運經驗。

網路診斷功能基於開源專案KubeSkoop。KubeSkoop針對不同的網路外掛程式和IaaS供應商,提供了常見Kubernetes叢集網路問題的一鍵診斷,並結合eBPF對核心關鍵路徑做深度監控和分析。本文僅對網路診斷部分進行說明,關於深度監控和分析,請參見使用ACK Net Exporter定位網路問題

工作原理

image.png

  1. 拓撲構建:在提供診斷資訊後,網路診斷會根據所提供的資訊,以及叢集中所收集到的資源資訊(例如Pod、Node、Service、NetworkPolicy等),去構建本次診斷的訪問拓撲圖。

  2. 資訊採集:網路診斷採集運行時資訊、網路通訊協定棧資訊以及網路基礎設施的相關資訊。採集不同的資料和資訊,以便於排查故障和網路分析。

  3. 鏈路類比:網路診斷通過在ECS上執行命令或在叢集中下發collector Pod的形式,收集網路診斷所經過的節點或容器內的網路棧資訊,包括網路裝置、sysctl、iptables、IPVS等。除此之外,網路診斷也會收集雲上如路由表、安全性群組、NAT Gateway等資訊。系統會將收集的這些資訊與預期的網路設定作對比,以發現配置不正確的情況,包括對iptables和路由的類比、對裝置狀態的判斷、對雲上路由表和安全性群組規則的驗證等。

  4. 擷取診斷結果:在實際配置與預期配置做比較後,最終將會輸出診斷的網路拓撲,並將異常節點和異常問題標記出來。

使用網路診斷

使用限制

  • 待診斷的Pod需要為Running狀態。

  • 目前公網到LoadBalancer Service僅支援4層CLB類型,且後端Pod數量不超過10個。

  • 目前暫不支援ACK Serverless叢集或VK虛擬節點的診斷。

操作步驟

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇巡檢和診斷>故障診斷

  3. 故障診斷頁面,單擊網路診斷

  4. 訪問資訊面板,輸入需診斷網路的源地址目的地址連接埠,並選擇目標協議,仔細閱讀注意事項後,選中我已知曉並同意,然後單擊發起診斷

    關於此處診斷參數的填寫,請參見常見網路不通的診斷參數

    image.png

  5. 診斷結果頁面,能夠查看網路診斷結果,並且在訪問全圖地區,會呈現出本次診斷訪問鏈路的全景。

    異常節點會使用不同於正常節點的顏色標出。關於常見診斷結果,請參見常見診斷結果及解決方案

    image.png

常見網路不通的診斷參數

情境一:診斷Pod、Node間網路

若出現Pod與Pod、Pod與Node串連不通的情況,您可以使用網路診斷功能對Pod、Node間的網路進行診斷。診斷參數如下:

參數

說明

源地址

Pod或Node地址

目標地址

Pod或Node地址

連接埠

需要診斷的連接埠

協議

需要診斷的協議

情境二:診斷Pod、Node到Service的網路

網路診斷可以以Service的叢集IP進行診斷,診斷Pod、Node到Service的每一個端點的鏈路,以及與Service相關的網路設定。診斷參數如下:

參數

說明

源地址

Pod、Node地址

目標地址

Service的叢集IP

連接埠

需要診斷的連接埠

協議

需要診斷的協議

情境三:診斷DNS鏈路的網路

當訪問目標為網域名稱時,除源地址到目標網域名稱IP的鏈路外,可能還需要檢查叢集內的DNS是否工作正常。您可以使用網路診斷功能診斷Pod到叢集內DNS服務(kube-system命名空間下的kube-dns)的連通性,來判斷是否存在DNS解析問題。

執行以下命令,獲得叢集中kube-system命名空間下的kube-dns Service的叢集IP。

kubectl get svc -n kube-system kube-dns

預期輸出:

kube-dns   ClusterIP   172.16.XX.XX   <none>        53/UDP,53/TCP,9153/TCP   6d
NAME       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                  AGE

輸出結果中,172.16.XX.XX即為kube-dns的叢集IP。使用kube-dns的叢集IP作為目標地址,診斷參數如下:

參數

說明

源地址

Pod或Node地址

目標地址

kube-dns Service的叢集IP

連接埠

53

協議

udp

情境四:診斷Pod、Node到公網的網路

您可以使用網路診斷對Pod、Node到公網IP地址進行網路診斷。若公網為網域名稱,您需要先將其手動解析為公網IP。診斷參數如下:

參數

說明

源地址

Pod、Node地址

目標地址

公網IP

連接埠

需要診斷的連接埠

協議

需要診斷的協議

情境五:診斷公網到LoadBalancer Service的網路

若出現公網訪問叢集內LoadBalancer Service不通的情況,您可以以公網地址為源地址、目標地址為LoadBalanacer的外部IP進行診斷。診斷參數如下:

參數

說明

源地址

公網地址

目標地址

LoadBalancer的外部IP

連接埠

需要診斷的連接埠

協議

需要診斷的協議

常見診斷結果及解決方案

診斷結果

說明

解決方案

pod container ... is not ready

Pod中容器未就緒。

查看對應Pod健康狀態,進行修複。

network policy ... deny the packet from ...

NetworkPolicy阻攔了包。

修改對應的NetworkPolicy規則。

no process listening on ...

容器或節點上沒有以該協議監聽該連接埠的進程。

確認對應進程是否異常,檢查診斷參數(連接埠、協議)。

no route to host .../invalid route ... for packet ...

沒有找到路由或路由指向錯誤。

檢查網路外掛程式工作是否正常。

... do not have same security roup

兩台ECS間不存在相交的安全性群組規則,可能會導致包被丟棄。

使ECS使用同一安全性群組。

security group ... not allow packet ...

ECS上安全性群組不允許包通過。

檢查安全性群組規則,允許存取對應地址。

  • no route entry for destination ip ...

  • no next hop for destination ip ...

雲路由表中不存在到目標IP的路由。

檢查雲上路由表配置,若目的地址為公網,檢查公網NAT Gateway配置。

  • error route next hop for destination ip ...

  • expect next hop for destination ip ...

雲路由表中的路由指向與預期不符。

檢查雲上路由表配置,若目的地址為公網,檢查公網NAT網管配置。

no snat entry on nat gateway ...

公網NAT Gateway上未找到對應的SNAT規則。

檢查公網NAT Gateway中的SNAT規則配置。

backend ... health status for port ..., not "normal"

CLB上存在健全狀態檢查失敗的後端。

檢查CLB上掛載端點是否符合預期,以及檢查CLB上掛載的端點對應的服務是否健康。

cannot find listener port ... for slb ...

CLB上不存在該連接埠。

檢查LoadBalancer Service配置,以及檢查診斷參數(連接埠、協議)是否正確。

status of loadbalancer for ... port ... not "running"

CLB上監聽狀態不為Running。

檢查CLB上監聽連接埠是否存在異常。

service ... has no valid endpoint

Service上沒有端點。

檢查Service標籤選取器是否符合預期,以及檢查Service所對應的端點是否存在且健康。

關於叢集內訪問LoadBalancer Service IP的情況,請參見叢集外無法訪問SLB