配置 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"
    }]
  }'