網(wǎng)絡(luò)診斷
容器服務(wù)平臺(tái)提供網(wǎng)絡(luò)診斷功能,幫助您診斷網(wǎng)絡(luò)常見(jiàn)問(wèn)題,例如Pod之間不通、集群到公網(wǎng)訪問(wèn)不通、公網(wǎng)到LoadBalancer不通。本文介紹網(wǎng)絡(luò)診斷的基本原理、使用方式、以及如何針對(duì)常見(jiàn)網(wǎng)絡(luò)不通的場(chǎng)景定位網(wǎng)絡(luò)問(wèn)題和使用網(wǎng)絡(luò)診斷。
使用故障診斷功能時(shí),系統(tǒng)將在您的集群節(jié)點(diǎn)上執(zhí)行數(shù)據(jù)采集程序并收集檢查結(jié)果。采集的信息包括系統(tǒng)版本、負(fù)載、Docker、Kubelet等運(yùn)行狀態(tài)及系統(tǒng)日志中關(guān)鍵錯(cuò)誤信息。數(shù)據(jù)采集程序不會(huì)采集您的業(yè)務(wù)信息及敏感數(shù)據(jù)。
前提條件
已創(chuàng)建ACK集群。具體操作,請(qǐng)參見(jiàn)創(chuàng)建Kubernetes托管版集群或創(chuàng)建Kubernetes專有版集群。
網(wǎng)絡(luò)診斷介紹
容器服務(wù)控制臺(tái)中提供了網(wǎng)絡(luò)診斷功能,通過(guò)輸入問(wèn)題鏈路的源地址和目的地址、目的端口和協(xié)議,即可快速診斷常見(jiàn)網(wǎng)絡(luò)問(wèn)題。您無(wú)需對(duì)復(fù)雜的容器網(wǎng)絡(luò)架構(gòu)和網(wǎng)絡(luò)插件原理進(jìn)行了解,也無(wú)需對(duì)系統(tǒng)內(nèi)核有豐富的運(yùn)維經(jīng)驗(yàn)。
網(wǎng)絡(luò)診斷功能基于開(kāi)源項(xiàng)目KubeSkoop。KubeSkoop針對(duì)不同的網(wǎng)絡(luò)插件和IaaS提供商,提供了常見(jiàn)Kubernetes集群網(wǎng)絡(luò)問(wèn)題的一鍵診斷,并結(jié)合eBPF對(duì)內(nèi)核關(guān)鍵路徑做深度監(jiān)控和分析。本文僅對(duì)網(wǎng)絡(luò)診斷部分進(jìn)行說(shuō)明,關(guān)于深度監(jiān)控和分析,請(qǐng)參見(jiàn)使用ACK Net Exporter定位網(wǎng)絡(luò)問(wèn)題。
工作原理
拓?fù)錁?gòu)建:在提供診斷信息后,網(wǎng)絡(luò)診斷會(huì)根據(jù)所提供的信息,以及集群中所收集到的資源信息(例如Pod、Node、Service、NetworkPolicy等),去構(gòu)建本次診斷的訪問(wèn)拓?fù)鋱D。
信息采集:網(wǎng)絡(luò)診斷采集運(yùn)行時(shí)信息、網(wǎng)絡(luò)協(xié)議棧信息以及網(wǎng)絡(luò)基礎(chǔ)設(shè)施的相關(guān)信息。采集不同的數(shù)據(jù)和信息,以便于排查故障和網(wǎng)絡(luò)分析。
鏈路模擬:網(wǎng)絡(luò)診斷通過(guò)在ECS上執(zhí)行命令或在集群中下發(fā)collector Pod的形式,收集網(wǎng)絡(luò)診斷所經(jīng)過(guò)的節(jié)點(diǎn)或容器內(nèi)的網(wǎng)絡(luò)棧信息,包括網(wǎng)絡(luò)設(shè)備、sysctl、iptables、IPVS等。除此之外,網(wǎng)絡(luò)診斷也會(huì)收集云上如路由表、安全組、NAT網(wǎng)關(guān)等信息。系統(tǒng)會(huì)將收集的這些信息與預(yù)期的網(wǎng)絡(luò)配置作對(duì)比,以發(fā)現(xiàn)配置不正確的情況,包括對(duì)iptables和路由的模擬、對(duì)設(shè)備狀態(tài)的判斷、對(duì)云上路由表和安全組規(guī)則的驗(yàn)證等。
獲取診斷結(jié)果:在實(shí)際配置與預(yù)期配置做比較后,最終將會(huì)輸出診斷的網(wǎng)絡(luò)拓?fù)?,并將異常?jié)點(diǎn)和異常問(wèn)題標(biāo)記出來(lái)。
使用網(wǎng)絡(luò)診斷
使用限制
待診斷的Pod需要為Running狀態(tài)。
目前公網(wǎng)到LoadBalancer Service僅支持4層CLB類型,且后端Pod數(shù)量不超過(guò)10個(gè)。
目前暫不支持ACK Serverless集群或VK虛擬節(jié)點(diǎn)的診斷。
操作步驟
登錄容器服務(wù)管理控制臺(tái),在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁(yè)面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇巡檢和診斷>故障診斷。
在故障診斷頁(yè)面,單擊網(wǎng)絡(luò)診斷。
在訪問(wèn)信息面板,輸入需診斷網(wǎng)絡(luò)的源地址、目的地址、端口,并選擇目標(biāo)協(xié)議,仔細(xì)閱讀注意事項(xiàng)后,選中我已知曉并同意,然后單擊發(fā)起診斷。
關(guān)于此處診斷參數(shù)的填寫,請(qǐng)參見(jiàn)常見(jiàn)網(wǎng)絡(luò)不通的診斷參數(shù)。
在診斷結(jié)果頁(yè)面,能夠查看網(wǎng)絡(luò)診斷結(jié)果,并且在訪問(wèn)全圖區(qū)域,會(huì)呈現(xiàn)出本次診斷訪問(wèn)鏈路的全景圖。
異常節(jié)點(diǎn)會(huì)使用不同于正常節(jié)點(diǎn)的顏色標(biāo)出。關(guān)于常見(jiàn)診斷結(jié)果,請(qǐng)參見(jiàn)常見(jiàn)診斷結(jié)果及解決方案。
常見(jiàn)網(wǎng)絡(luò)不通的診斷參數(shù)
場(chǎng)景一:診斷Pod、Node間網(wǎng)絡(luò)
若出現(xiàn)Pod與Pod、Pod與Node連接不通的情況,您可以使用網(wǎng)絡(luò)診斷功能對(duì)Pod、Node間的網(wǎng)絡(luò)進(jìn)行診斷。診斷參數(shù)如下:
參數(shù) | 說(shuō)明 |
源地址 | Pod或Node地址 |
目標(biāo)地址 | Pod或Node地址 |
端口 | 需要診斷的端口 |
協(xié)議 | 需要診斷的協(xié)議 |
場(chǎng)景二:診斷Pod、Node到Service的網(wǎng)絡(luò)
網(wǎng)絡(luò)診斷可以以Service的集群IP進(jìn)行診斷,診斷Pod、Node到Service的每一個(gè)端點(diǎn)的鏈路,以及與Service相關(guān)的網(wǎng)絡(luò)配置。診斷參數(shù)如下:
參數(shù) | 說(shuō)明 |
源地址 | Pod、Node地址 |
目標(biāo)地址 | Service的集群IP |
端口 | 需要診斷的端口 |
協(xié)議 | 需要診斷的協(xié)議 |
場(chǎng)景三:診斷DNS鏈路的網(wǎng)絡(luò)
當(dāng)訪問(wèn)目標(biāo)為域名時(shí),除源地址到目標(biāo)域名IP的鏈路外,可能還需要檢查集群內(nèi)的DNS是否工作正常。您可以使用網(wǎng)絡(luò)診斷功能診斷Pod到集群內(nèi)DNS服務(wù)(kube-system命名空間下的kube-dns)的連通性,來(lái)判斷是否存在DNS解析問(wèn)題。
執(zhí)行以下命令,獲得集群中kube-system命名空間下的kube-dns Service的集群IP。
kubectl get svc -n kube-system kube-dns
預(yù)期輸出:
kube-dns ClusterIP 172.16.XX.XX <none> 53/UDP,53/TCP,9153/TCP 6d
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
輸出結(jié)果中,172.16.XX.XX即為kube-dns的集群IP。使用kube-dns的集群IP作為目標(biāo)地址,診斷參數(shù)如下:
參數(shù) | 說(shuō)明 |
源地址 | Pod或Node地址 |
目標(biāo)地址 | kube-dns Service的集群IP |
端口 | 53 |
協(xié)議 | udp |
場(chǎng)景四:診斷Pod、Node到公網(wǎng)的網(wǎng)絡(luò)
您可以使用網(wǎng)絡(luò)診斷對(duì)Pod、Node到公網(wǎng)IP地址進(jìn)行網(wǎng)絡(luò)診斷。若公網(wǎng)為域名,您需要先將其手動(dòng)解析為公網(wǎng)IP。診斷參數(shù)如下:
參數(shù) | 說(shuō)明 |
源地址 | Pod、Node地址 |
目標(biāo)地址 | 公網(wǎng)IP |
端口 | 需要診斷的端口 |
協(xié)議 | 需要診斷的協(xié)議 |
場(chǎng)景五:診斷公網(wǎng)到LoadBalancer Service的網(wǎng)絡(luò)
若出現(xiàn)公網(wǎng)訪問(wèn)集群內(nèi)LoadBalancer Service不通的情況,您可以以公網(wǎng)地址為源地址、目標(biāo)地址為L(zhǎng)oadBalanacer的外部IP進(jìn)行診斷。診斷參數(shù)如下:
參數(shù) | 說(shuō)明 |
源地址 | 公網(wǎng)地址 |
目標(biāo)地址 | LoadBalancer的外部IP |
端口 | 需要診斷的端口 |
協(xié)議 | 需要診斷的協(xié)議 |
常見(jiàn)診斷結(jié)果及解決方案
診斷結(jié)果 | 說(shuō)明 | 解決方案 |
pod container ... is not ready | Pod中容器未就緒。 | 查看對(duì)應(yīng)Pod健康狀態(tài),進(jìn)行修復(fù)。 |
network policy ... deny the packet from ... | NetworkPolicy阻攔了包。 | 修改對(duì)應(yīng)的NetworkPolicy規(guī)則。 |
no process listening on ... | 容器或節(jié)點(diǎn)上沒(méi)有以該協(xié)議監(jiān)聽(tīng)該端口的進(jìn)程。 | 確認(rèn)對(duì)應(yīng)進(jìn)程是否異常,檢查診斷參數(shù)(端口、協(xié)議)。 |
no route to host .../invalid route ... for packet ... | 沒(méi)有找到路由或路由指向錯(cuò)誤。 | 檢查網(wǎng)絡(luò)插件工作是否正常。 |
... do not have same security roup | 兩臺(tái)ECS間不存在相交的安全組規(guī)則,可能會(huì)導(dǎo)致包被丟棄。 | 使ECS使用同一安全組。 |
security group ... not allow packet ... | ECS上安全組不允許包通過(guò)。 | 檢查安全組規(guī)則,放行對(duì)應(yīng)地址。 |
| 云路由表中不存在到目標(biāo)IP的路由。 | 檢查云上路由表配置,若目的地址為公網(wǎng),檢查公網(wǎng)NAT網(wǎng)關(guān)配置。 |
| 云路由表中的路由指向與預(yù)期不符。 | 檢查云上路由表配置,若目的地址為公網(wǎng),檢查公網(wǎng)NAT網(wǎng)管配置。 |
no snat entry on nat gateway ... | 公網(wǎng)NAT網(wǎng)關(guān)上未找到對(duì)應(yīng)的SNAT規(guī)則。 | 檢查公網(wǎng)NAT網(wǎng)關(guān)中的SNAT規(guī)則配置。 |
backend ... health status for port ..., not "normal" | CLB上存在健康檢查失敗的后端。 | 檢查CLB上掛載端點(diǎn)是否符合預(yù)期,以及檢查CLB上掛載的端點(diǎn)對(duì)應(yīng)的服務(wù)是否健康。 |
cannot find listener port ... for slb ... | CLB上不存在該端口。 | 檢查L(zhǎng)oadBalancer Service配置,以及檢查診斷參數(shù)(端口、協(xié)議)是否正確。 |
status of loadbalancer for ... port ... not "running" | CLB上監(jiān)聽(tīng)狀態(tài)不為Running。 | 檢查CLB上監(jiān)聽(tīng)端口是否存在異常。 |
service ... has no valid endpoint | Service上沒(méi)有端點(diǎn)。 | 檢查Service標(biāo)簽選擇器是否符合預(yù)期,以及檢查Service所對(duì)應(yīng)的端點(diǎn)是否存在且健康。 關(guān)于集群內(nèi)訪問(wèn)LoadBalancer Service IP的情況,請(qǐng)參見(jiàn)集群外無(wú)法訪問(wèn)SLB。 |