Kubernetes设计之初,一直遵循One Pod One IP
的策略,即一个Pod分配一个网卡,一个IP地址。但是在对网络要求比较高的场景,这种模式显然不满足要求,所以有了一系列的插件来支持多网络平面,我们主要介绍使用multus-cni
插件。
一、multus cni 介绍
Kubernetes
缺乏支持VNF
中多个网络接口的所需功能。传统上,网络功能使用多个网络接口分离控制,管理和控制用户/数据的网络平面。他们还用于支持不同的协议,满足不同的调整和配置要求。- 为了解决这个需求,英特尔实现了
MULTUS
的CNI
插件,其中提供了将多个接口添加到Pod
的功能。这允许POD
通过不同的接口连接到多个网络,并且每个接口都将使用其自己的CNI
插件。 - 有了
MULTUS
我们可以实现kubernetes
高性能网络,例如sr-iov dpdk
的方案。但这需要硬件网卡的支持。我们可以用multus
和macvlan
的方案实现pod
多网卡的功能; macvlan
是linux
内核实现的功能,实现通用pod
多网卡解决方案。
二、安装
参考官网说明进行安装:安装multus
下载镜像
ctr -n k8s.io i pull ghcr.dockerproxy.com/k8snetworkplumbingwg/multus-cni:stable
安装插件
curl -kLO https://raw.githubusercontent.com/k8snetworkplumbingwg/multus-cni/master/deployments/multus-daemonset.yml
kubectl apply -f multus-daemonset.yml
内核开启macvlan
macvlan
需要内核模块支持:
# 查看内核受否加载了 macvlan 模块
lsmod | grep macvlan
# 加载 macvlan
modprobe macvlan
三、配置
3.1 基于 Kube-OVN-cni 配置
3.1.1 创建NetworkAttachmentDefinition
cat <<EOF | kubectl create -f -
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: attachnet
namespace: default
spec:
config: '{
"cniVersion": "0.3.0",
"type": "kube-ovn",
"server_socket": "/run/openvswitch/kube-ovn-daemon.sock",
"provider": "attachnet.default.ovn"
}'
EOF
spec.config.type
: 设置为kube-ovn
来触发 CNI 插件使用 Kube-OVN 子网。server_socket
: Kube-OVN 通信使用的 socket 文件。 默认位置为/run/openvswitch/kube-ovn-daemon.sock
。provider
: 当前 NetworkAttachmentDefinition 的<name>.<namespace>.ovn
, Kube-OVN 将会使用这些信息找到对应的 Subnet 资源,注意后缀需要设置为 ovn。
3.1.2 创建 Kube-OVN Subnet:
Overlay 类型的子网
以 Kube-OVN 作为附加网卡,则 provider
应该设置为对应的 NetworkAttachmentDefinition 的 <name>.<namespace>.ovn
,并要以 ovn
作为后缀结束。 用 Kube-OVN 提供附加网卡,创建 Subnet 示例如下:
cat <<EOF | kubectl create -f -
apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
name: attachnet
spec:
protocol: IPv4
provider: attachnet116.default.ovn
cidrBlock: 192.168.116.0/24
gateway: 192.168.116.1
excludeIps:
- 192.168.116.0..192.168.116.10
EOF
Underlay 类型的子网
参考之前Kube-OVN的Underlay网络配置,需要预先创建 ProviderNetwork
与 Vlan
, 之后在上面子网中增加配置,指定 vlan
属性即可。例如:
cat <<EOF | kubectl create -f -
apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
name: attachnet
spec:
protocol: IPv4
provider: attachnet116.default.ovn
cidrBlock: 192.168.116.0/24
gateway: 192.168.116.1
vlan: vlan116
excludeIps:
- 192.168.116.0..192.168.116.10
EOF
3.2 基于 Calico-cni 配置
这里只需要定义 NetworkAttachmentDefinition
就够了。
cat <<EOF | kubectl create -f -
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: macvlan-222
spec:
config: '{
"cniVersion": "0.3.0",
"type": "macvlan",
"master": "eth1",
"mode": "bridge",
"ipam": {
"type": "host-local",
"subnet": "192.168.222.0/24"
}
}'
EOF
四、使用
4.1 创建一个多网络的 Pod
使用新的网络配置创建一个pod,查看pod中的网卡
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: multus-demo-1
annotations:
k8s.v1.cni.cncf.io/networks: default/attachnet
spec:
containers:
- name: samplepod
image: rancherlabs/swiss-army-knife
command:
- sleep
- "infinity"
securityContext:
capabilities:
add:
- NET_ADMIN
drop:
- KILL
EOF
4.2 通过 multus 指定默认网卡的网络
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: multus-demo-7
annotations:
v1.multus-cni.io/default-network: default/attachnet116
spec:
containers:
- name: samplepod
image: rancherlabs/swiss-army-knife
command:
- sleep
- "infinity"
securityContext:
capabilities:
add:
- NET_ADMIN
drop:
- KILL
EOF
NOTE:http://v1.multus-cni.io/default-network
这个 annotation
默认的 namespace
是 kube-system
,所以 attachnet116
需要表示成 default/attachnet116
,否则创建 Pod
时会报错,无法找到网络。