本文踩坑之k8s網(wǎng)絡(luò)不通的問(wèn)題排除
首先找出來(lái)保存很久的跨主機(jī)pod通信流程圖。
簡(jiǎn)單解讀下:
- 數(shù)據(jù)從源容器中發(fā)出后,經(jīng)由所在主機(jī)的Docker0虛擬網(wǎng)卡轉(zhuǎn)發(fā)到flannel0虛擬網(wǎng)卡,這是個(gè)P2P的虛擬網(wǎng)卡,flanneld服務(wù)監(jiān)聽(tīng)在網(wǎng)卡的另外一端。
- Flannel通過(guò)Etcd服務(wù)維護(hù)了一張節(jié)點(diǎn)間的路由。
- 源主機(jī)的flanneld服務(wù)將原本的數(shù)據(jù)內(nèi)容UDP封裝后根據(jù)自己的路由表投遞給目的節(jié)點(diǎn)的flanneld服務(wù),數(shù)據(jù)到達(dá)以后被解包,然后直 接進(jìn)入目的節(jié)點(diǎn)的flannel0虛擬網(wǎng)卡,然后被轉(zhuǎn)發(fā)到目的主機(jī)的Docker0虛擬網(wǎng)卡,最后就像本機(jī)容器通信一下的有Docker0路由到達(dá)目標(biāo)容 器。
這樣整個(gè)數(shù)據(jù)包的傳遞就完成了,
現(xiàn)象
kubernetes 網(wǎng)絡(luò)不可用,測(cè)試結(jié)果是只能訪問(wèn)本機(jī)的podip、clusterip,訪問(wèn)別的機(jī)器的都過(guò)不去。
排查
查看flannel的日志,發(fā)現(xiàn)寫(xiě)入的規(guī)則都是10.244/16網(wǎng)段的
而我設(shè)置的pod網(wǎng)段都是10.20/24網(wǎng)段中。很明顯這里的規(guī)則的意思是把10.244/16網(wǎng)段的流量轉(zhuǎn)發(fā)到10.20/24網(wǎng)段了。有問(wèn)題。。。
緊接著查看下加載的配置文件的文件,發(fā)現(xiàn)network網(wǎng)段在10.244.0.0/16網(wǎng)段,而子網(wǎng)在10.20.0.1/24網(wǎng)絡(luò),網(wǎng)絡(luò)網(wǎng)段不匹配
解決
- kubectl get cm -n kube-system kube-flannel-cfg -o yaml
- net-conf.json: |
- {
- "Network": "10.20.0.0/16",
- "Backend": {
- "Type": "vxlan"
- }
- }
修改這里的network網(wǎng)段的位置,然后清除iptables,發(fā)現(xiàn)網(wǎng)絡(luò)正常了。