Kubernetes 缺乏支持 VNF 中多个网络接口的所需功能。传统应用上,网络功能使用多个网络接口分离控制,管理和控制用户/数据的网络平面。他们还用于支持不同的协议,满足不同的调整和配置要求。

为了解决这个需求,英特尔实现了 MULTUS 的 CNI 插件,其中提供了将多个接口添加到 Pod 的功能。这允许 POD 通过不同的接口连接到多个网络,并且每个接口都将使用其自己的 CNI 插件。
工作原理
Kubernetes 当前没有提供为POD添加额外的接口选项的规定,或支持多个 CNI 插件同时工作的规定,但是它确实提供了一种由 API 服务器扩展受支持的API的机制。使用 "自定义资源定义" 可以做到这一点。MULTUS依赖于 "自定义资源定义" 来存储其他接口和CNI插件所需的信息。

MULTUS 成了节点的默认CNI, 被k8s 调用。 MULTUS 内部分两部分来配置网络
1)调用原来默认的CNI 来添加默认网络
2)检查POD的扩展网络配置,通过相应的CNI 插件配置所需的扩展网络。
Multus 以CNI的形式出现,它依赖其他CNI 插件去完成网络配置工作,所有它相当于代理CNI。通知这样一个方式,可以突破k8s 只配置一个默认网络的限制。
MULTUS 实战
1 . 安装MULTUS
下载multus daemonset配置文件
wget --no-check-certificate https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/deployments/multus-daemonset-thick-plugin.yml
kubectl apply -f multus-daemonset-thick-plugin.yml
这里一共 完成了3个事情:
1)安装 MULTUS 二进制
所有节点上 安装了multus 二进制插件,可以在节点上查看
ls /opt/cni/bin/multus
2) 配置 MULTUS
在所有节点上面 配置了multus 插件,配置有两部分:
1)在/etc/cni/net.d位置创建一个新的配置文件00-multus.conf 该配置基于集群中已经存在的默认网络配置。
ls /etc/cni/net.d/00-multus.conf
2)在/etc/cni/net.d/multus.d/ 生成了multus.kubeconfig ,用于访问APIServer来获取POD信息和自定义网络配置。
ls /etc/cni/net.d/multus.d/multus.kubeconfig
3) 创建CRD和角色
创建对象类型为 "NetworkAttachmentDefinition"的CRD,它的API资源名称为 network-attachment-definitions
同时还有创建ServerAccount和 MULTUS 的集群角色以及相应的绑定。这个新的集群角色将提供对随 CRD 添加的新 API 组以及默认 API 组中 Pod 资源的访问权限。
kubectl get crds | grep network-attachment-definitions
kubectl get sa -n kube-system | grep multus
2. 使用MULTUS
1)使用CRD 定义新的网络配置
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: macvlan-conf
spec:
config: '{
"cniVersion": "0.3.0",
"type": "macvlan",
"master": "eth0",
"mode": "bridge",
"ipam": {
"type": "host-local",
"subnet": "192.168.1.0/24",
"rangeStart": "192.168.1.200",
"rangeEnd": "192.168.1.216",
"routes": [
{ "dst": "0.0.0.0/0" }
],
"gateway": "192.168.1.1"
}
}'
这里 使用 macvlan 插件(每种插件的配置有差异) eth0 作为主,此参数应与集群中主机上的网卡接口名称匹配。
# kubectl apply -f mavclan.yaml
networkattachmentdefinition.k8s.cni.cncf.io/macvlan-conf created
# kubectl get network-attachment-definitions
NAME AGE
macvlan-conf 3s
2) POD 使用定义的网络配置
创建pod使用有一个名为k8s.v1.cni.cncf.io/networks的注释。该字段以逗号分隔的列表列出了 NetworkAttachmentDefinitions 的名称。
apiVersion: v1
kind: Pod
metadata:
name: samplepod
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
containers:
- name: samplepod
command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
image: alpine
kubectl apply -f samplepod.yaml
该POD 设置了注解 k8s.v1.cni.cncf.io/networks:macvlan-conf (macvlan-conf正是在创建网络配置时使用的名称。)
multus 插件读取到POD注解后,为POD创建macvlan-conf 中定义的网络接口。
查看POD 的网络接口信息:

查看POD 的annotations 中有两个网络状态:

3)设置多个扩展网络:
如果需要设置多个网络,可以在注解中使用 , 分隔多个网络配置定义。网络配置可以重复
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-conf,macvlan-conf
这样就可以为POD配置更多的网络接口。