修改docker服务文件的dockerd的启动参数,去掉那个环境变量,增加--bip=10.0.0.1/16,这个IP随便,主要是为了不占用etcd中要使用的地址段,因为最初它用就是etcd中分配的。
修改kubelet服务文件,增加3个参数--cni-bin-dir=http://www.likecs.com/opt/cni/bin --cni-conf-dir=http://www.likecs.com/opt/cni/net.d --network-plugin=cni,最后这个一定要写cni,不要写flannel,因为这里我们要用的就是cni,而至于cni会使用什么插件,这个在配置文件中写。因为在kubernetes中只有2类插件,一个是cni一个是kubenet,这里设置的是用哪一类插件。
然后启动之前停止的服务
10-flannel.conflist文件内容
{ "name": "cni0", "cniVersion": "0.4.0", "plugins": [ { "type": "flannel", "delegate": { "hairpinMode": true, "isDefaultGateway": true } }, { "type": "portmap", "capabilities": { "portMappings": true } } ] }还可以简化为这样
{ "name": "cni0", "type": "flannel", "subnetFile": "/run/flannel/subnet.env", "delegate": { "hairpinMode": true, "isDefaultGateway": true } }name: 网络名称而不是网桥的名字
cniVersion: 插件版本,可以不写。
subnetFile: 本机flanneld从etcd中申请的本机网段,这个信息存放在哪个文件中,默认就是/run/flannel/subnet.env,我没有改位置,所以可以省略。
plugins:表示使用什么插件
type: 插件类型,这里是flannel
delegate:这个CNI插件并不是自己完成,而是需要调用某中内置的CNI插件完成,对于flannel来说,就是调用bridge。flannel只是实现了网络方案,而网络方案对应的CNI插件是bridge,我们下载的插件里面就包括了bridge,所有flannel对应的CNI插件就已经被内置了,因为flannel方案本身就是使用网桥来做的。
执行过程如下:
kubelet调用CRI接口也就是dockershim,它调用CNI插件,也就是/opt/cni/bin中的flannel程序,这个程序需要2部分参数,一部分是dockershim的CNI环境变量也就是具体动作ADD或者DEL,如果是ADD则是把容器添加到CNI网络里,ADD会有一些参数;另外一部分就是dockershim加载的JSON文件,然后/opt/cni/bin/flannel程序会对2部分参数做整合以及填充其他信息比如ipam信息也就是具体的子网信息,ipMasp信息,mtu信息,这些都是从/run/flannel/subnet.env文件中读取的,然后flannel会调用CNI的birdge插件,也就是执行/opt/cni/bin/bridge这个命令,由它来完成将容器加入CNI网络的具体操作。