淺談k8s中cni0和docker0的關係和區別

渡边灬發表於2024-06-30

最近在複習k8s網路方面的知識,檢視之前學習時整理的筆記和文件還有過往自己總結的部落格之後發現一個問題,就是在有關flannel和calico這兩個k8s網路外掛的文章和部落格中,會涉及到cni0和docker0這兩個網橋裝置,但是都沒有明確說明他們倆之間的關係,有的甚至將兩者混為一談,這也是我之前的學習當中所忽略掉的問題,這次發現之後我瘋狂查閱資料和認真思考後,後對兩者有了如下的總結和淺析:


首先在Kubernetes的flannel網路下,並不是用docker0來作為網橋,而是透過一個CNI介面來替代docker0,它在宿主機上的預設名字叫cni0。

以Flannel的vxlan模式為例,其在Kubernetes中的工作流程不變,只是其中的docker0網橋替換為cni0網橋了,其流程如下:

image

而在命令列中透過route -n可以看出cni0和docker0並不是一個裝置:![image]image

透過brcte show命令也可以檢視該node節點下的網橋裝置有哪些,對應的虛擬網路卡都有哪些:image

需要注意的是,CNI 網橋只是接管所有 CNI 外掛負責的、即 Kubernetes 建立的容器(Pod)。而此時,如果你用 docker run 單獨啟動一個容器,那麼 Docker 專案還是會把這個容器連線到 docker0 網橋上。所以這個容器的 IP 地址,一定是屬於 docker0 網橋的 172.17.0.0/16 網段。


而在k8s的calico網路下並沒有使用cni網橋模式,因此無論是IPIP模式還是BGP模式都查不到對應的cni0網橋,只有docker0網橋裝置,如下所示:

在IPIP模式下檢視路由配置:

image

在BGP模式下檢視路由配置:

image

由此可見,cni0和docker0都屬於網橋裝置,但完全不是一個東西不是一回事,一個是基於docker的網橋裝置,一個是基於k8s所建立的網橋裝置,希望該篇文章能夠在k8s網路的學習當中幫助到大家,如需轉載請標明出處,謝謝

相關文章