本文踩坑之k8s網(wǎng)絡(luò)不通的問題排除
首先找出來保存很久的跨主機pod通信流程圖。
簡單解讀下:
- 數(shù)據(jù)從源容器中發(fā)出后,經(jīng)由所在主機的Docker0虛擬網(wǎng)卡轉(zhuǎn)發(fā)到flannel0虛擬網(wǎng)卡,這是個P2P的虛擬網(wǎng)卡,flanneld服務(wù)監(jiān)聽在網(wǎng)卡的另外一端。
- Flannel通過Etcd服務(wù)維護了一張節(jié)點間的路由。
- 源主機的flanneld服務(wù)將原本的數(shù)據(jù)內(nèi)容UDP封裝后根據(jù)自己的路由表投遞給目的節(jié)點的flanneld服務(wù),數(shù)據(jù)到達以后被解包,然后直 接進入目的節(jié)點的flannel0虛擬網(wǎng)卡,然后被轉(zhuǎn)發(fā)到目的主機的Docker0虛擬網(wǎng)卡,最后就像本機容器通信一下的有Docker0路由到達目標容 器。
這樣整個數(shù)據(jù)包的傳遞就完成了,
現(xiàn)象
kubernetes 網(wǎng)絡(luò)不可用,測試結(jié)果是只能訪問本機的podip、clusterip,訪問別的機器的都過不去。
排查
查看flannel的日志,發(fā)現(xiàn)寫入的規(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)段了。有問題。。。
緊接著查看下加載的配置文件的文件,發(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ò)正常了。