kubernetes之多网络支持

作者 YYGCui 日期 2017-05-14
kubernetes之多网络支持

某些场景下,我们需要多网络的支持,如eth0用于业务功能,eth1用于配置管理功能,那么kubernetes下该如何实现呢?

上一篇 我们着重分析了各层级之间网络通信的方式,以及内外网之间的网络通信,这些通信方式的探讨都是基于单一网络的。

kubernetes网络默认只支持单一网络,使用noop网络插件。kubernetes网络是以Plugin的方式实现的,它支持符合CNI规范的插件,通过--network-plugin=来指定,这就意味着我们可以定制网络方案。

关于kubernets网络插件,官方文档有详细的描述,这里简单介绍一下:

网络插件还处于alpha阶段,其内容会经常发生变化。目前支持两种网络插件

  • CNI plugin: 符合CNI规范的插件,其规范请参看官方文档
  • kubenet plugin:这个可看作是kubernentes官方提供的符合CNI规范的插件,基于cbr0,使用CNIbridgelocal-host插件。

那么,要实现定制化的网络,只需按CNI规范实现AddRemove接口即可。kubernetes多网络方案就是以CNI插件的方式实现的。以下操作基于Ubuntu 14.04,除etcd操作外,其他操作所有节点都要执行。

准备工作

  • 已部署多节点kubernetes集群,overlay网络使用flannel
  • 已安装golang编译环境
  • 部署节点上已安装bridge-utils, conntracknsenter
  • 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
cd ~/go/src/multus-cni/ && ./build.sh
cp ./bin/* /opt/cni/bin/
cd ~/go/src/sriov-cni/ && ./build.sh
cp ./bin/* /opt/cni/bin/
cd ~/go/src/cni/ && ./build.sh
cp ./bin/* /opt/cni/bin/

配置flannel网络

以下操作除步骤4只需要在master节点操作外,其他步骤各节点都需要执行。

  1. 创建该flannel网络使用的网桥,如kbr1
brctl addbr kbr1
  1. 创建存放flannel网络配置的目录
mkdir -p /run/flannel/networks
  1. 仿照/run/flannel/subnets.env文件,在/run/flannel/networks下创建配置文件,如subnets2.env,使用不同的网络段,如
cp /run/flannel/subnets.env /run/flannel/networks/subnets2.env
vim /run/flannel/networks/subnets2.env
#modify as follows
FLANNEL_NETWORK=173.17.0.0/16
FLANNEL_SUBNET=173.17.76.1/24
FLANNEL_MTU=1400
FLANNEL_IPMASQ=true
  1. 将该网络段注册到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 } }'
  1. 使用上述配置启动新的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 &
  1. 创建flannel数据存储目录,存储subnets2.env网络相关的数据
mkdir -p /var/lib/cni/flannel/2

配置multus-cni

cni-conf-dir(默认为/etc/cni/net.d/)下创建配置文件test.conf,其内容如下

{
"name": "multus-demo-network",
"type": "multus",
"delegates": [
{
"type": "flannel",
"name": "flannel.2",
"subnetFile": "/run/flannel/networks/subnets2.env",
"dataDir": "/var/lib/cni/flannel/2",
"delegate": {
"bridge": "kbr1"
}
},
{
"type": "flannel",
"name": "flannel.1",
"subnetFile": "/run/flannel/subnet.env",
"dataDir": "/var/lib/cni/flannel",
"masterplugin": true,
"delegate": {
"bridge": "docker0",
"isDefaultGateway": true
}
}
]
}

该文件的作用是,配置两个flannel网络,指定了各自的subnet配置文件,数据存储位置dataDir,使用的网桥。其中flannel.1masterplugin属性,其意为该网络会上报给kubelet

配置kubelet

kubelet的配置文件为/etc/default/kubelet, 在其行尾加上--network-plugin=cni。 如果上述的cni bincni conf不想放在默认目录下,这里可以使用--cni-bin-dir--cni-conf-dir指定目录。

然后重启kubelet进程

service kubelet restart
service kubelet status

Enjoy it

现在,启动的pod都具有两个网络eth0net0(multus-cni多网络是以net0, net1netn命名的)。每个网络使用不同的flannel网络,网络间是隔离的,vlan index不同。如果需要更多的网络,只需增加配置即可。

该方案的缺点是配置是固定的,不能动态增删,需要重启kubelet。对每个pod而言,网络个数不能动态配置,依赖于整体方案。