24.11. 使用 pod 级别绑定

在 pod 级别的绑定对于启用需要高可用性和更多吞吐量的 pod 内的工作负载至关重要。使用 pod 级别绑定,您可以在内核模式接口上从多个根 I/O 虚拟化(SR-IOV)虚拟功能接口创建绑定接口。SR-IOV 虚拟功能传递到 pod,并附加到内核驱动程序中。

需要 pod 级别绑定的一个场景是从不同物理功能的多个 SR-IOV 虚拟功能创建绑定接口。可以利用主机上的两个不同物理功能创建绑定接口,以便在 pod 级别上实现高可用性。

有关创建 SR-IOV 网络、网络策略、网络附加定义和 pod 等任务的指导,请参阅配置 SR-IOV 网络设备

24.11.1. 从两个 SR-IOV 接口配置绑定接口

绑定可让多个网络接口聚合到一个逻辑 "bonded" 接口。绑定 Container Network Interface (Bond-CNI) 将绑定功能引入容器中。

Bond-CNI 可使用单根 I/O 虚拟化 (SR-IOV) 虚拟功能创建,并将它们放在容器网络命名空间中。

OpenShift Container Platform 仅支持使用 SR-IOV 虚拟功能的 Bond-CNI。SR-IOV Network Operator 提供了管理虚拟功能所需的 SR-IOV CNI 插件。不支持其他 CNI 或接口类型。

先决条件

  • 必须安装 SR-IOV Network Operator,并配置为获取容器中的虚拟功能。
  • 要配置 SR-IOV 接口,必须为每个接口创建一个 SR-IOV 网络和策略。
  • SR-IOV Network Operator 根据定义的 SR-IOV 网络和策略,为每个 SR-IOV 接口创建一个网络附加定义。
  • linkState 设置为 SR-IOV 虚拟功能的默认值 auto

24.11.1.1. 创建绑定网络附加定义

现在,SR-IOV 虚拟功能可用,您可以创建一个绑定网络附加定义。

apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: bond-net1
      namespace: demo
    spec:
      config: '{
      "type": "bond", 1
      "cniVersion": "0.3.1",
      "name": "bond-net1",
      "mode": "active-backup", 2
      "failOverMac": 1, 3
      "linksInContainer": true, 4
      "miimon": "100",
      "mtu": 1500,
      "links": [ 5
            {"name": "net1"},
            {"name": "net2"}
        ],
      "ipam": {
            "type": "host-local",
            "subnet": "10.56.217.0/24",
            "routes": [{
            "dst": "0.0.0.0/0"
            }],
            "gateway": "10.56.217.1"
        }
      }'
1
cni-type 始终设置为 bond
2
mode 属性指定绑定模式。
注意

支持的绑定模式有:

  • balance-rr - 0
  • active-backup - 1
  • balance-xor - 2

对于 balance-rrbalance-xor 模式,您必须为 SR-IOV 虚拟功能将 trust 模式设置为 on

3
active-backup 模式的 failover 属性是必需的,必须设为 1。
4
linksInContainer=true 标志告知 Bond CNI 在容器内找到所需的接口。默认情况下,Bond CNI 会查找主机上的这些接口,该接口无法与 SRIOV 和 Multus 集成。
5
links 部分定义将用于创建绑定的接口。默认情况下,Multus 将附加的接口命名为 "net",再加上一个连续的数字。

24.11.1.2. 使用绑定接口创建 pod

  1. 使用名为 example podbonding.yaml 的 YAML 文件创建 pod 来测试设置,其内容类似以下示例:

    apiVersion: v1
        kind: Pod
        metadata:
          name: bondpod1
          namespace: demo
          annotations:
            k8s.v1.cni.cncf.io/networks: demo/sriovnet1, demo/sriovnet2, demo/bond-net1 1
        spec:
          containers:
          - name: podexample
            image: quay.io/openshift/origin-network-interface-bond-cni:4.11.0
            command: ["/bin/bash", "-c", "sleep INF"]
    1
    注意网络注解:它包含两个 SR-IOV 网络附加,以及一个绑定网络附加。绑定附加使用两个 SR-IOV 接口作为绑定的端口接口。
  2. 运行以下命令来应用 yaml:

    $ oc apply -f podbonding.yaml
  3. 使用以下命令检查 pod 接口:

    $ oc rsh -n demo bondpod1
    sh-4.4#
    sh-4.4# 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
    3: eth0@if150: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue state UP
    link/ether 62:b1:b5:c8:fb:7a brd ff:ff:ff:ff:ff:ff
    inet 10.244.1.122/24 brd 10.244.1.255 scope global eth0
    valid_lft forever preferred_lft forever
    4: net3: <BROADCAST,MULTICAST,UP,LOWER_UP400> mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 9e:23:69:42:fb:8a brd ff:ff:ff:ff:ff:ff 1
    inet 10.56.217.66/24 scope global bond0
    valid_lft forever preferred_lft forever
    43: net1: <BROADCAST,MULTICAST,UP,LOWER_UP800> mtu 1500 qdisc mq master bond0 state UP qlen 1000
    link/ether 9e:23:69:42:fb:8a brd ff:ff:ff:ff:ff:ff 2
    44: net2: <BROADCAST,MULTICAST,UP,LOWER_UP800> mtu 1500 qdisc mq master bond0 state UP qlen 1000
    link/ether 9e:23:69:42:fb:8a brd ff:ff:ff:ff:ff:ff 3
    1
    绑定接口自动命名为 net3。要设置特定的接口名称,请将 @name 后缀添加到 pod 的 k8s.v1.cni.cncf.io/networks 注解。
    2
    net1 接口基于 SR-IOV 虚拟功能。
    3
    net2 接口基于 SR-IOV 虚拟功能。
    注意

    如果在 pod 注解中没有配置接口名称,接口名称会自动分配为 net<n>,其中 <n>1 开始。

  4. 可选: 如果要为 example bond0 设置一个特定的接口名称,请编辑 k8s.v1.cni.cncf.io/networks 注解,并将 bond0 设为接口名称,如下所示:

    annotations:
            k8s.v1.cni.cncf.io/networks: demo/sriovnet1, demo/sriovnet2, demo/bond-net1@bond0