最近在復習k8s網絡方面的知識,查看之前學習時整理的筆記和文檔還有過往自己總結的博客之后發現一個問題,就是在有關flannel和calico這兩個k8s網絡插件的文章和博客中,會涉及到cni0和docker0這兩個網橋設備,但是都沒有明確說明他們倆之間的關系,有的甚至將兩者混為一談,這也是我之前的學習當中所忽略掉的問題,這次發現之后我瘋狂查閱資料和認真思考后,對兩者有了如下的總結和淺析:
首先在Kubernetes的flannel網絡下,并不是用docker0來作為網橋,而是通過一個CNI接口來替代docker0,它在宿主機上的默認名字叫cni0。
以Flannel的vxlan模式為例,其在Kubernetes中的工作流程不變,只是其中的docker0網橋替換為cni0網橋了,其流程如下:
而在命令行中通過route -n可以看出cni0和docker0并不是一個設備:![image]
通過brcte show命令也可以查看該node節點下的網橋設備有哪些,對應的虛擬網卡都有哪些:
需要注意的是,CNI 網橋只是接管所有 CNI 插件負責的、即 Kubernetes 創建的容器(Pod)。而此時,如果你用 docker run 單獨啟動一個容器,那么 Docker 項目還是會把這個容器連接到 docker0 網橋上。所以這個容器的 IP 地址,一定是屬于 docker0 網橋的 172.17.0.0/16 網段。
而在k8s的calico網絡下并沒有使用cni網橋模式,因此無論是IPIP模式還是BGP模式都查不到對應的cni0網橋,只有docker0網橋設備,如下所示:
在IPIP模式下查看路由配置:
在BGP模式下查看路由配置:
由此可見,cni0和docker0都屬于網橋設備,但完全不是一個東西不是一回事,一個是基于docker的網橋設備,一個是基于k8s所創建的網橋設備,希望該篇文章能夠在k8s網絡的學習當中幫助到大家,如需轉載請標明出處,謝謝
文章轉載自:渡邊灬
原文鏈接:https://www.cnblogs.com/zhangpeiyao/p/18277218
體驗地址:引邁 - JNPF快速開發平臺_低代碼開發平臺_零代碼開發平臺_流程設計器_表單引擎_工作流引擎_軟件架構