Container Service平台提供網路診斷功能,協助您診斷網路常見問題,例如Pod之間不通、叢集到公網訪問不通、公網到LoadBalancer不通。本文介紹網路診斷的基本原理、使用方式、以及如何針對常見網路不通的情境定位網路問題和使用網路診斷。
使用故障診斷功能時,系統將在您的叢集節點上執行資料擷取程式並收集檢查結果。採集的資訊包括系統版本、負載、Docker、Kubelet等運行狀態及系統日誌中嚴重錯誤資訊。資料擷取程式不會採集您的商務資訊及敏感性資料。
前提條件
已建立ACK叢集。具體操作,請參見建立Kubernetes託管版叢集或建立Kubernetes專有版叢集。
網路診斷介紹
Container Service控制台中提供了網路診斷功能,通過輸入問題鏈路的源地址和目的地址、目的連接埠和協議,即可快速診斷常見網路問題。您無需對複雜的容器網路架構和網路外掛程式原理進行瞭解,也無需對系統核心有豐富的營運經驗。
網路診斷功能基於開源專案KubeSkoop。KubeSkoop針對不同的網路外掛程式和IaaS供應商,提供了常見Kubernetes叢集網路問題的一鍵診斷,並結合eBPF對核心關鍵路徑做深度監控和分析。本文僅對網路診斷部分進行說明,關於深度監控和分析,請參見使用ACK Net Exporter定位網路問題。
工作原理
拓撲構建:在提供診斷資訊後,網路診斷會根據所提供的資訊,以及叢集中所收集到的資源資訊(例如Pod、Node、Service、NetworkPolicy等),去構建本次診斷的訪問拓撲圖。
資訊採集:網路診斷採集運行時資訊、網路通訊協定棧資訊以及網路基礎設施的相關資訊。採集不同的資料和資訊,以便於排查故障和網路分析。
鏈路類比:網路診斷通過在ECS上執行命令或在叢集中下發collector Pod的形式,收集網路診斷所經過的節點或容器內的網路棧資訊,包括網路裝置、sysctl、iptables、IPVS等。除此之外,網路診斷也會收集雲上如路由表、安全性群組、NAT Gateway等資訊。系統會將收集的這些資訊與預期的網路設定作對比,以發現配置不正確的情況,包括對iptables和路由的類比、對裝置狀態的判斷、對雲上路由表和安全性群組規則的驗證等。
擷取診斷結果:在實際配置與預期配置做比較後,最終將會輸出診斷的網路拓撲,並將異常節點和異常問題標記出來。
使用網路診斷
使用限制
待診斷的Pod需要為Running狀態。
目前公網到LoadBalancer Service僅支援4層CLB類型,且後端Pod數量不超過10個。
目前暫不支援ACK Serverless叢集或VK虛擬節點的診斷。
操作步驟
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇巡檢和診斷>故障診斷。
在故障診斷頁面,單擊網路診斷。
在訪問資訊面板,輸入需診斷網路的源地址、目的地址、連接埠,並選擇目標協議,仔細閱讀注意事項後,選中我已知曉並同意,然後單擊發起診斷。
關於此處診斷參數的填寫,請參見常見網路不通的診斷參數。
在診斷結果頁面,能夠查看網路診斷結果,並且在訪問全圖地區,會呈現出本次診斷訪問鏈路的全景。
異常節點會使用不同於正常節點的顏色標出。關於常見診斷結果,請參見常見診斷結果及解決方案。
常見網路不通的診斷參數
情境一:診斷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上安全性群組不允許包通過。 | 檢查安全性群組規則,允許存取對應地址。 |
| 雲路由表中不存在到目標IP的路由。 | 檢查雲上路由表配置,若目的地址為公網,檢查公網NAT Gateway配置。 |
| 雲路由表中的路由指向與預期不符。 | 檢查雲上路由表配置,若目的地址為公網,檢查公網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。 |