某些场景下,我们需要多网络的支持,如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
而言,网络个数不能动态配置,依赖于整体方案。