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

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

注意:
CNI网桥只负责Kubernetes创建的Pod,如果你单独用docker run启动一个容器,其网桥依然是docker0。

Kubernetes中设计一个与docker0相同功能的CNI网桥,其主要原因有以下两点:

  1. Kubernetes没有Docker的网络模型,它并不希望也不具备配置docker0的能力;
  2. 与Kubernetes配置Infra容器的Network Namespace密切相关;

CNI的设计思想即为:Kubernetes在启动Infra容器之后,就可以直接调用CNI网络插件,为这个Infra容器的Network Namespace配置符合预期的网络栈。

CNI

CNI中有两个重要的概念:

  • 容器(Container):是拥有独立Linux网络命名空间的环境,例如使用Docker或rkt创建的容器。关键之处是容器需要拥有自己的Linux网络命名空间,这是加入网络的必要条件。
  • 网络(Network):表示可以互连的一组实体,这些实体拥有各自独立、唯一的IP地址,可以是容器、物理机或者其他网络设备(比如路由器)等。

对容器网络的设置和操作都通过插件(Plugin)进行具体实现,CNI插件包括两种类型:CNIPlugin和IPAM(IP Address Management)Plugin。CNI Plugin负责为容器配置网络资源,IPAM Plugin负责对容器的IP地址进行分配和管理。IPAM Plugin作为CNI Plugin的一部分,与CNI Plugin一起工作。