![6c9bb41b85ef4a4202d9cc9ea977025c.png](https://img-blog.csdnimg.cn/img_convert/6c9bb41b85ef4a4202d9cc9ea977025c.png)
这是一篇关于CNI项目和kubelet实现CNI插件的源码分析的文章。这篇文章在春节前就已经写好大部分,春节两周多的时间,一笔没写,为啥上学时候曾经大年初二参加英语考试的自己,春节却再没Good Good Study,Day Day Up。明年春节再见,好怀念春节的日子。~(文章有不足和错误的地方,望指出)
CNI项目
CNI是CNCF的项目,它定义了容器网络接口和库文件,并且包括一些支持的容器网络插件;代码分别在:
https://github.com/containernetworking/cni
https://github.com/containernetworking/plugins
使用CNI插件创建Docker容器
在CNI项目的README中,有如何使用CNI插件创建Docker容器的例子:
创建/etc/cni/net.d下创建networkconfig文件
$ mkdir -p /etc/cni/net.d
$ cat >/etc/cni/net.d/10-mynet.conf <<EOF
{
"cniVersion": "0.2.0",
"name": "mynet",
"type": "bridge",
"bridge": "cni0",
"isGateway": true,
"ipMasq": true,
"ipam": {
"type": "host-local",
"subnet": "10.22.0.0/16",
"routes": [
{ "dst": "0.0.0.0/0" }
]
}
}
EOF
$ cat >/etc/cni/net.d/99-loopback.conf <<EOF
{
"cniVersion": "0.2.0",
"type": "loopback"
}
EOF
networkconfig配置信息,最主要包括type和IPAM;如上以bridge的CNI插件为例;
编译CNI插件二进制可执行文件
$ cd $GOPATH/src/github.com/containernetworking/plugins
$ ./build.sh
Building plugins
flannel
portmap
tuning
bridge
host-device
ipvlan
loopback
macvlan
ptp
vlan
dhcp
host-local
sample
创建netns、bridge及veth
$ CNI_PATH=$GOPATH/src/github.com/containernetworking/plugins/bin
$ cd $GOPATH/src/github.com/containernetworking/cni/scripts
$ sudo CNI_PATH=$CNI_PATH ./priv-net-run.sh ifconfig
使用CNI插件创建Docker容器
CNI插件(type:bridge)负责将veth对的一端网络接口插入容器网络命名空间,将veth的另一端连接到网桥;然后,将IP分配给接口,并通过调用适当的IPAM插件来设置与“IP地址管理”一致的路由;