首页
k8s安装部署(三)网络插件-多网卡multus

Kubernetes设计之初,一直遵循One Pod One IP的策略,即一个Pod分配一个网卡,一个IP地址。但是在对网络要求比较高的场景,这种模式显然不满足要求,所以有了一系列的插件来支持多网络平面,我们主要介绍使用multus-cni插件。

一、multus cni 介绍

  • Kubernetes 缺乏支持VNF中多个网络接口的所需功能。传统上,网络功能使用多个网络接口分离控制,管理和控制用户/数据的网络平面。他们还用于支持不同的协议,满足不同的调整和配置要求。
  • 为了解决这个需求,英特尔实现了MULTUSCNI插件,其中提供了将多个接口添加到Pod的功能。这允许POD通过不同的接口连接到多个网络,并且每个接口都将使用其自己的CNI插件。
  • 有了MULTUS我们可以实现kubernetes高性能网络,例如sr-iov dpdk的方案。但这需要硬件网卡的支持。我们可以用multusmacvlan的方案实现pod多网卡的功能;
  • macvlanlinux内核实现的功能,实现通用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网络配置,需要预先创建 ProviderNetworkVlan, 之后在上面子网中增加配置,指定 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

NOTEhttp://v1.multus-cni.io/default-network 这个 annotation 默认的 namespacekube-system,所以 attachnet116 需要表示成 default/attachnet116,否则创建 Pod 时会报错,无法找到网络。