某些场景下,我们需要多网络的支持,如eth0用于业务功能,eth1用于配置管理功能,那么kubernetes下该如何实现呢?
kubernetes网络默认只支持单一网络,使用noop网络插件。kubernetes网络是以Plugin的方式实现的,它支持符合CNI规范的插件,通过--network-plugin=来指定,这就意味着我们可以定制网络方案。
关于kubernets网络插件,官方文档有详细的描述,这里简单介绍一下:
网络插件还处于alpha阶段,其内容会经常发生变化。目前支持两种网络插件
- CNI plugin: 符合
CNI规范的插件,其规范请参看官方文档。 - kubenet plugin:这个可看作是
kubernentes官方提供的符合CNI规范的插件,基于cbr0,使用CNI的bridge和local-host插件。
那么,要实现定制化的网络,只需按CNI规范实现Add和Remove接口即可。kubernetes多网络方案就是以CNI插件的方式实现的。以下操作基于Ubuntu 14.04,除etcd操作外,其他操作所有节点都要执行。
准备工作
- 已部署多节点
kubernetes集群,overlay网络使用flannel - 已安装
golang编译环境 - 部署节点上已安装
bridge-utils,conntrack和nsenter - 从
github上下载multus-cni,该插件实现多网络功能,具体网络功能由以下插件实现 - [可选]从
github上下载sriov-cni,该插件实现SR-IOV功能 - 从
github上下载cni,基础插件库,包含bridge,flannel,ipam等
CNI插件
将multus-cni, sriov-cni, cni放在go编译目录下,如~/go/src/下,分别编译三个插件,在各自目录下执行./build.sh。编译成功后,生成的二进制文件位于./bin下。
创建目录/opt/cni/bin,将编译好的二进制文件拷贝到该目录下。
mkdir -p /opt/cni/bin |
配置flannel网络
以下操作除步骤4只需要在master节点操作外,其他步骤各节点都需要执行。
- 创建该
flannel网络使用的网桥,如kbr1
brctl addbr kbr1 |
- 创建存放flannel网络配置的目录
mkdir -p /run/flannel/networks |
- 仿照
/run/flannel/subnets.env文件,在/run/flannel/networks下创建配置文件,如subnets2.env,使用不同的网络段,如
cp /run/flannel/subnets.env /run/flannel/networks/subnets2.env |
- 将该网络段注册到
etcd,注意使用不同的前缀,如原网络使用的是/coreos.com/network/,这里使用/k8s/network2/。再者默认的vlan index是1,所以这里VNI为2
/opt/bin/etcdctl set /k8s/network2/config '{ "Network": "173.17.0.0/16", "Backend": { "Type": "vxlan", "VNI": 2 } }' |
- 使用上述配置启动新的
flannel daemon,参考文档,其中--etcd-endpoints=http://127.0.0.1:4001 --ip-masq --iface=172.16.1.171来自于/etc/default/flannel文件
/opt/bin/flanneld -subnet-file /run/flannel/networks/subnets2.env -etcd-prefix=/k8s/network2 --etcd-endpoints=http://127.0.0.1:4001 --ip-masq --iface=172.16.1.171 & |
- 创建
flannel数据存储目录,存储subnets2.env网络相关的数据
mkdir -p /var/lib/cni/flannel/2 |
配置multus-cni
在cni-conf-dir(默认为/etc/cni/net.d/)下创建配置文件test.conf,其内容如下
{ |
该文件的作用是,配置两个flannel网络,指定了各自的subnet配置文件,数据存储位置dataDir,使用的网桥。其中flannel.1有masterplugin属性,其意为该网络会上报给kubelet。
配置kubelet
kubelet的配置文件为/etc/default/kubelet, 在其行尾加上--network-plugin=cni。 如果上述的cni bin和cni conf不想放在默认目录下,这里可以使用--cni-bin-dir和--cni-conf-dir指定目录。
然后重启kubelet进程
service kubelet restart |
Enjoy it
现在,启动的pod都具有两个网络eth0和net0(multus-cni多网络是以net0, net1 … netn命名的)。每个网络使用不同的flannel网络,网络间是隔离的,vlan index不同。如果需要更多的网络,只需增加配置即可。
该方案的缺点是配置是固定的,不能动态增删,需要重启kubelet。对每个pod而言,网络个数不能动态配置,依赖于整体方案。