浅谈 k8s 中 cni0 和 docker0 的关系和区别
最近在复习 k8s 网络方面的知识,查看之前学习时整理的笔记和文档还有过往自己总结的博客之后发现一个问题,就是在有关 flannel 和 calico 这两个 k8s 网络插件的文章和博客中,会涉及到 cni0 和 docker0 这两个网桥设备,但是都没有明确说明他们俩之间的关系,有的甚至将两者混为一谈,这也是我之前的学习当中所忽略掉的问题,这次发现之后我疯狂查阅资料和认真思考后,对两者有了如下的总结和浅析:
首先在 Kubernetes 的 flannel 网络下,并不是用 docker0 来作为网桥,而是通过一个 CNI 接口来替代 docker0,它在宿主机上的默认名字叫 cni0。
以 Flannel 的 vxlan 模式为例,其在 Kubernetes 中的工作流程不变,只是其中的 docker0 网桥替换为 cni0 网桥了,其流程如下:
![](https://static001.geekbang.org/infoq/00/00ff52d5e33973a7cc0ea650d583d4ab.png)
而在命令行中通过 route -n 可以看出 cni0 和 docker0 并不是一个设备:![image]
![](https://static001.geekbang.org/infoq/7b/7bce74ff313633c63a6d54f52c696608.png)
通过 brcte show 命令也可以查看该 node 节点下的网桥设备有哪些,对应的虚拟网卡都有哪些:
![](https://static001.geekbang.org/infoq/79/7985d242bb2bfb1f0b72f61dfaccbfa0.png)
需要注意的是,CNI 网桥只是接管所有 CNI 插件负责的、即 Kubernetes 创建的容器(Pod)。而此时,如果你用 docker run 单独启动一个容器,那么 Docker 项目还是会把这个容器连接到 docker0 网桥上。所以这个容器的 IP 地址,一定是属于 docker0 网桥的 172.17.0.0/16 网段。
而在 k8s 的 calico 网络下并没有使用 cni 网桥模式,因此无论是 IPIP 模式还是 BGP 模式都查不到对应的 cni0 网桥,只有 docker0 网桥设备,如下所示:
在 IPIP 模式下查看路由配置:
![](https://static001.geekbang.org/infoq/f1/f131d8c798b932f3a22ed435a4dcbeb9.png)
在 BGP 模式下查看路由配置:
![](https://static001.geekbang.org/infoq/d8/d8bcdee1035a6830c55bfb2899e1ba2b.png)
由此可见,cni0 和 docker0 都属于网桥设备,但完全不是一个东西不是一回事,一个是基于 docker 的网桥设备,一个是基于 k8s 所创建的网桥设备,希望该篇文章能够在 k8s 网络的学习当中帮助到大家,如需转载请标明出处,谢谢
文章转载自:渡边灬
评论