配置 Kube-OVN 网络以支持 Pod 多网卡(Alpha)

通过使用 Multus CNI,您可以为 Pod 添加多个不同网络的网络接口。利用 Kube-OVN 网络的 Subnet 和 IP CRD 进行高级 IP 管理,实现子网管理、IP 预留、随机分配、固定分配等功能。

目录

安装 Multus CNI

部署 Multus CNI 插件

  1. 进入 管理员

  2. 在左侧导航栏点击 Marketplace > Cluster Plugins

  3. 在搜索框输入 “multus” 查找 Multus CNI 插件。

  4. 在列表中找到 "Alauda Container Platform Networking for Multus" 插件。

  5. 点击插件条目旁的三点(⋮),选择 安装

  6. 插件将部署到您的集群中,您可以在 状态 列监控安装进度。

NOTE

Multus CNI 插件作为其他 CNI 插件与 Kubernetes 之间的中间件,使 Pod 支持多个网络接口。

创建子网

根据以下示例创建 attachnet 子网:network-attachment-definition.yml

NOTE

config 中的 provider 格式为 <NAME>.<NAMESPACE>.ovn,其中 <NAME><NAMESPACE> 分别是该 NetworkAttachmentDefinition CR 的名称和命名空间。

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"
    }'

创建后,应用该资源:

kubectl apply -f network-attachment-definition.yml

使用以下示例创建第二个网络接口的 Kube-OVN 子网:subnet.yml

NOTE
  • spec.provider 必须与 NetworkAttachmentDefinition 中的 provider 保持一致。
  • 若需使用 Underlay 子网,设置子网的 spec.vlan 为您想使用的 VLAN CR 名称。其他子网参数根据需要配置。
apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
  name: subnet1
spec:
  cidrBlock: 172.170.0.0/16
  provider: attachnet.default.ovn

创建后,应用该资源:

kubectl apply -f subnet.yml

创建多网卡 Pod

按照以下示例创建 Pod。

NOTE
  • metadata.annotations 中必须包含键值对 k8s.v1.cni.cncf.io/networks=default/attachnet,其中值的格式为 <NAMESPACE>/<NAME><NAMESPACE><NAME> 分别是 NetworkAttachmentDefinition CR 的命名空间和名称。
  • 若 Pod 需要三个网络接口,配置 k8s.v1.cni.cncf.io/networks 的值为 default/attachnet,default/attachnet2
apiVersion: v1
kind: Pod
metadata:
  name: pod1
  annotations:
    k8s.v1.cni.cncf.io/networks: default/attachnet
spec:
  containers:
  - name: web
    image: nginx:latest
    ports:
    - containerPort: 80

Pod 创建成功后,使用命令 kubectl exec pod1 -- ip a 查看 Pod 的 IP 地址。

验证双网卡创建

使用以下命令验证双网卡是否创建成功:

kubectl exec pod1 -- ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
151: eth0@if152: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1400 qdisc noqueue state UP
    link/ether a6:3c:d8:ae:83:06 brd ff:ff:ff:ff:ff:ff
    inet 10.3.0.8/16 brd 10.3.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a43c:d8ff:feae:8306/64 scope link
       valid_lft forever preferred_lft forever
153: net1@if154: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1400 qdisc noqueue state UP
    link/ether 0a:36:08:01:dc:df brd ff:ff:ff:ff:ff:ff
    inet 172.170.0.3/16 brd 172.170.255.255 scope global net1
       valid_lft forever preferred_lft forever
    inet6 fe80::836:8ff:fe01:dcdf/64 scope link
       valid_lft forever preferred_lft forever

其他功能

固定 IP

  • 主网卡(第一个接口):若需固定主网卡 IP,方法与单网卡固定 IP 相同,在 Pod 上添加注解 ovn.kubernetes.io/ip_address=<IP>

  • 次网卡(第二个或其他接口):基本方法与主网卡类似,区别是注解键中的 ovn 替换为对应 NetworkAttachmentDefinition 的 provider。例如:attachnet.default.ovn.kubernetes.io/ip_address=172.170.0.101

额外路由

从版本 1.8.0 起,Kube-OVN 支持为次网卡配置额外路由。使用该功能时,在 NetworkAttachmentDefinition 的 config 中添加 routes 字段,填写需要配置的路由。例如:

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",
      "routes": [
        {
          "dst": "19.10.0.0/16"
        },
        {
          "dst": "19.20.0.0/16",
          "gw": "19.10.0.1"
        }
      ]
    }'