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

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

NOTE

从 ACP 4.5 开始,Alauda Container Platform Networking for Multus 更名为 Alauda Container Platform Multi-Network。从 Customer Portal 下载插件时,请搜索 Alauda Container Platform Multi-Network。更名前发布的插件包上传后,在平台中仍显示为 Alauda Container Platform Networking for Multus。

安装 Multus CNI

部署 Multus CNI 插件

  1. 前往 管理员。

  2. 在左侧导航栏中,点击 Marketplace > 集群插件。

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

  4. 在列表中找到 “Alauda Container Platform Multi-Network” 插件(更名前发布的插件包显示为 “Alauda Container Platform Networking for Multus”)。

  5. 点击插件条目旁的三点图标 (⋮),然后选择 安装。

  6. 插件将部署到集群。你可以在 状态 列中查看安装状态。

NOTE

Multus CNI 插件充当其他 CNI 插件与 Kubernetes 之间的中间件,使 Pod 能够拥有多个网络接口。

创建子网

按照以下示例创建 attachnet 子网:network-attachment-definition.yml。

NOTE

配置中的 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>。

  • 次要网络接口(第二个或其他接口):基本方法与主网络接口类似,不同之处在于,Annotation Key 中的 ovn 要替换为相应的 NetworkAttachmentDefinition provider。例如:attachnet.default.ovn.kubernetes.io/ip_address=172.170.0.101。

其他路由

从 1.8.0 版本开始,Kube-OVN 支持为次要网络接口配置其他路由。使用此功能时,请将 routers 字段添加到 NetworkAttachmentDefinition 中的配置,并填入需要配置的路由。例如:

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