此文已由作者黄扬授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
在早先的k8s版本中,kubelet代码里提供了networkPlugin,networkPlugin是一组接口,实现了pod的网络配置、解除、获取,当时kubelet的代码中有个一个docker_manager,负责容器的创建和销毁,亦会负责容器网络的操作。而如今我们可以看到基本上kubelet的启动参数中,networkPlugin的值都会设置为cni。
cni插件的使用方式
使用CNI插件时,需要做三个配置:
kubelet启动参数中networkPlugin设置为cni
在/etc/cni/net.d中增加cni的配置文件,配置文件中可以指定需要使用的cni组件及参数
将需要用到的cni组件(二进制可执行文件)放到/opt/cni/bin目录下
所有的cni组件都支持两个命令:add和del。即配置网络和解除网络配置。
cni插件的配置文件是一个json文件,不同版本的接口、以及不同的cni组件,有着不同的配置内容结构,目前比较通用的接口版本是0.3.1的版本。
在配置文件中我们可以填入多个cni组件,当这些cni组件的配置以数组形式记录时,kubelet会对所有的组件进行按序链式调用,所有组件调用成功后,视为网络配置完成,过程中任何一步出现error,都会进行回滚的del操作。以保证操作流上的原子性。
几种基本的cni插件
cni插件按照代码中的存放目录可以分为三种:ipam、main、meta。
ipam cni用于管理ip和相关网络数据,配置网卡、ip、路由等。
main cni用于进行网络配置,比如创建网桥,vethpair、macvlan等。
meta cni有的是用于和第三方CNI插件进行适配,如flannel,也有的用于配置内核参数,如tuning
由于官方提供的cni组件就有很多,这里我们详细介绍一些使用率较高的组件。
ipam类CNI
ipam类型的cni插件,在执行add命令时会分配一个IP给调用者。执行del命令时会将调用者指定的ip放回ip池。社区开源的ipam有host-local、dhcp。
host-local
我们可以通过host-local的配置文件的数据结构来搞懂这个组件是如何管理ip的。
type IPAMConfig struct { *Range Name string Type string `json:"type"` Routes []*types.Route `json:"routes"`//交付的ip对应的路由 DataDir string `json:"dataDir"`//本地ip池的数据库目录 ResolvConf string `json:"resolvConf"`//交付的ip对应的dns Ranges []RangeSet `json:"ranges"`//交付的ip所属的网段,网关信息 IPArgs []net.IP `json:"-"` // Requested IPs from CNI_ARGS and args } #配置文件范例: { "cniVersion": "0.3.1", "name": "mynet", "type": "ipvlan", "master": "foo0", "ipam": { "type": "host-local", "resolvConf": "/home/here.resolv", "dataDir": "/home/cni/network", "ranges": [ [ { "subnet": "10.1.2.0/24", "rangeStart": "10.1.2.9", "rangeEnd": "10.1.2.20", "gateway": "10.1.2.30" }, { "subnet": "10.1.4.0/24" } ], [{ "subnet": "11.1.2.0/24", "rangeStart": "11.1.2.9", "rangeEnd": "11.1.2.20", "gateway": "11.1.2.30" }] ] } }
从上面的配置我们可以清楚:
host-local组件通过在配