Container Network Interface - CNI
CNI
CNI 既 Container Network Interface 的简写.
CNI 是 Kubernetes 网络的一个标准
CNI提供POD的网络连接.CNI提供分配IP地址的能力, 为POD提供 ipv4 与 ipv6 的 DHCP 功能.CNI还提供了NetWrok Policy的能力, 定义POD与POD之间的网络规则.
CNI运行原理
根据
CNI标准, 网络组件需要在CNI下创建二进制执行文件, 用于配置网络环境.当
kubernetes创建/删除pod时, 调用二进制执行文件进行相应的网络配置.CNI下的二进制执行文件会包含如下参数Container ID容器ID号, 需要用于指定此容器配置网络, 也有一些CNI组件需要利用容器ID进行数据索引.Network namespace path当前container真正的network namespace路径 . 每个container都会拥有至少一个network namespace.namespace是通过Linux kernel操作的, 因此大部分CNI组件都会根据这个路径, 通过network namespace进行相关的网络配置.Network configuration用于定义CNI组件的相关配置. 包含两部分组成CNI标准 和 网络组件额外定义.Name of the interface inside the container在当前container中创建网卡名称, 如:eth0等.
network namespace
- 如上面所说每个
container都至少拥有一个network namespace, 但两个container可以共用一个相同的network namespace.
| |
| |
可以看到如上两个容器的网络都是同一个, 这里就可以想到
kubernetes的pod的网络.实际
pod中有更灵活的设置, 详见如下架构图

Network Configuration
Network Configuration就是一个json格式的配置文件. 如上我们讲过 这个配置文件包含两部分CNI标准的配置 - 根据官方CNI Spec包含如下配置项cniVersion定义CNI的版本,CNI组件必须相同, 否则报错.name唯一的名称标识.typeCNI组件定义的名称, 上层应用会根据这个名称去找对应的CNI组件. 然后调用CNI组件的二进制文件进行网络配置. 这个配置非常重要.args额外的配置, 主要用于上层应用调用CNI时的一些额外参数.ipMasq标注当前CNI组件是否支持SNAT. 只做标识, 实际SNAT是在CNI组件中实现.dnsCNI组件的 DNS 配置, 如:nameserver、search、domain、options等. 注: 在kubernetes中, 会忽略这里的 DNS 配置, 因为kubernetes会在自身设置 DNS 配置.ipam既IP Address Management Plugin, 负责IP地址的分配. 一般为host-local和dhcp.
一个配置文件
| |
Kubernetes CNI
Kubernetes目前网络有两种配置, 通过kubelet中的--network-plugin来指定选择哪一种配置.cni目前kubernetes部署方式基本都使用cni配置网络. 如上所述,cni包含两个部分cni组件的二进制文件--cni-bin-dir默认存放于/opt/cni/bin目录下.cni组件的 网络配置(Network Configuration) 或 网络配置列表(Network Configuration List)--cni-conf-dir默认存放于etc/cni/net.d/目录中.
| |
| |
| |
CNI工作流程
Client发送创建Pod的请求.Pod的创建中间流程忽略, 最后到kubelet.kubelet通过dockershim+docker-containerd的方式创建container.Pod创建完毕以后,kubelet通过CNI相关流程创建Pod网络.CNI组件搜索--cni-conf-dir目录下的配置文件, 按照数字顺序查找合法的网络配置.Flannel的配置文件为10-flannel.conflist- 读取配置文件, 通过
type或者cni组件. - 通过
type调用--cni-bin-dir目录下的cni组件的二进制文件. - 通过配置文件参数配置容器网络.
- 配置完网络以后, 调用
--cni-bin-dir目录下的portmap二进制文件, 将容器的IP和端口通过iptables映射到宿主机的端口上.
Kubenet工作流程
kubenet是个非常简单的L2 Bridge, 其实也是通过CNI建立一个简单的网络, 由kubenet配置的网络只能用于单节点的网络通讯. 所以kubenet是用于测试.