浅谈k8s中cni0和docker0的关系和区别

最近在复习k8s网络方面的知识,查看之前学习时整理的笔记和文档还有过往自己总结的博客之后发现一个问题,就是在有关flannel和calico这两个k8s网络插件的文章和博客中,会涉及到cni0和docker0这两个网桥设备,但是都没有明确说明他们俩之间的关系,有的甚至将两者混为一谈,这也是我之前的学习当中所忽略掉的问题,这次发现之后我疯狂查阅资料和认真思考后,后对两者有了如下的总结和浅析:


首先在Kubernetes的flannel网络下,并不是用docker0来作为网桥,而是通过一个CNI接口来替代docker0,它在宿主机上的默认名字叫cni0。

以Flannel的vxlan模式为例,其在Kubernetes中的工作流程不变,只是其中的docker0网桥替换为cni0网桥了,其流程如下:

而在命令行中通过route -n可以看出cni0和docker0并不是一个设备:

通过brcte show命令也可以查看该node节点下的网桥设备有哪些,对应的虚拟网卡都有哪些:


而在k8s的calico网络下并没有使用cni网桥模式,因此无论是IPIP模式还是BGP模式都查不到对应的cni0网桥,只有docker0网桥设备,如下所示:

在IPIP模式下查看路由配置:

在BGP模式下查看路由配置:

由此可见,cni0和docker0都属于网桥设备,但完全不是一个东西不是一回事,一个是基于docker的网桥设备,一个是基于k8s所创建的网桥设备,希望该篇文章能够在k8s网络的学习当中帮助到大家,如需转载请标明出处,谢谢