9.6. 将 pod 添加到额外网络

您可以将 pod 添加到现有的单根 I/O 虚拟化(SR-IOV)网络。

9.6.1. 网络附加的运行时配置

将 pod 附加到额外网络时,您可以指定运行时配置来为 pod 进行特定的自定义。例如,,您可以请求特定的 MAC 硬件地址。

您可以通过在 pod 规格中设置注解来指定运行时配置。注解键是 k8s.v1.cni.cncf.io/network,它接受一个 JSON 对象来描述运行时配置。

9.6.1.1. 基于以太网的 SR-IOV 附加的运行时配置

以下 JSON 描述了基于以太网的 SR-IOV 网络附加的运行时配置选项。

[
  {
    "name": "<name>", 1
    "mac": "<mac_address>", 2
    "ips": ["<cidr_range>"] 3
  }
]
1
SR-IOV 网络附加定义 CR 的名称。
2
可选:从 SR-IOV 网络附加定义 CR 中定义的资源类型分配的 SR-IOV 设备的 MAC 地址。要使用这个功能,还必须在 SriovNetwork 对象中指定 { "mac": true }
3
可选:从 SR-IOV 网络附加定义 CR 中定义的资源类型分配的 SR-IOV 设备的 IP 地址。支持 IPv4 和 IPv6 IP 地址。要使用这个功能,还必须在 SriovNetwork 对象中指定 { "ips": true }

运行时配置示例

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
  annotations:
    k8s.v1.cni.cncf.io/networks: |-
      [
        {
          "name": "net1",
          "mac": "20:04:0f:f1:88:01",
          "ips": ["192.168.10.1/24", "2001::1/64"]
        }
      ]
spec:
  containers:
  - name: sample-container
    image: <image>
    imagePullPolicy: IfNotPresent
    command: ["sleep", "infinity"]

9.6.2. 将 pod 添加到额外网络

您可以将 pod 添加到额外网络。pod 继续通过默认网络发送与集群相关的普通网络流量。

创建 pod 时会附加额外网络。但是,如果 pod 已存在,您无法为其附加额外网络。

pod 必须与额外网络处于相同的命名空间。

注意

如果网络附加由 SR-IOV Network Operator 管理,SR-IOV 网络资源注入器会自动将 resource 字段添加到 Pod 对象中。

重要

当为 Deployment 对象或 ReplicationController 对象指定 SR-IOV 硬件网络时,必须指定 NetworkAttachmentDefinition 对象的命名空间。如需更多信息,请参阅以下 bug: BZ#1846333BZ#1840962

先决条件

  • 安装 OpenShift CLI(oc)。
  • 登录到集群。
  • 安装 SR-IOV Operator。
  • 创建一个将 pod 附加到的 SriovNetwork 对象。

流程

  1. Pod 对象添加注解。只能使用以下注解格式之一:

    1. 要在没有自定义的情况下附加额外网络,请使用以下格式添加注解。将 <network> 替换为要与 pod 关联的额外网络的名称:

      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] 1
      1
      要指定多个额外网络,请使用逗号分隔各个网络。逗号之间不可包括空格。如果您多次指定同一额外网络,则该 pod 会将多个网络接口附加到该网络。
    2. 要通过自定义来附加额外网络,请添加具有以下格式的注解:

      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: |-
            [
              {
                "name": "<network>", 1
                "namespace": "<namespace>", 2
                "default-route": ["<default-route>"] 3
              }
            ]
      1
      指定 NetworkAttachmentDefinition 对象定义的额外网络的名称。
      2
      指定定义 NetworkAttachmentDefinition 对象的命名空间。
      3
      可选:为默认路由指定覆盖,如 192.168.17.1
  2. 运行以下命令来创建 pod。将 <name> 替换为 pod 的名称。

    $ oc create -f <name>.yaml
  3. 可选: 要确认 Pod CR 中是否存在注解,请输入以下命令将 <name> 替换为 pod 的名称。

    $ oc get pod <name> -o yaml

    在以下示例中,example-pod pod 附加到 net1 额外网络:

    $ oc get pod example-pod -o yaml
    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: macvlan-bridge
        k8s.v1.cni.cncf.io/networks-status: |- 1
          [{
              "name": "openshift-sdn",
              "interface": "eth0",
              "ips": [
                  "10.128.2.14"
              ],
              "default": true,
              "dns": {}
          },{
              "name": "macvlan-bridge",
              "interface": "net1",
              "ips": [
                  "20.2.2.100"
              ],
              "mac": "22:2f:60:a5:f8:00",
              "dns": {}
          }]
      name: example-pod
      namespace: default
    spec:
      ...
    status:
      ...
    1
    k8s.v1.cni.cncf.io/networks-status 参数是对象的 JSON 数组。每个对象描述附加到 pod 的额外网络的状态。注解值保存为纯文本值。

9.6.3. 创建与 SR-IOV pod 兼容的非统一内存访问 (NUMA)

您可以通过限制 SR-IOV 和从相同 NUMA 节点分配的 CPU 资源,使用 restrictedsingle-numa-node Topology Manager 来创建与 SR-IOV pod 兼容的 NUMA。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 启用 LatencySensitive 配置集,并将 CPU Manager 策略配置为 static

流程

  1. 创建以下 SR-IOV pod 规格,然后在 <name>-sriov-pod.yaml 文件中保存 YAML。将 <name> 替换为这个 pod 的名称。

    以下示例显示了 SR-IOV pod 规格:

    apiVersion: v1
    kind: Pod
    metadata:
      name: sample-pod
      annotations:
        k8s.v1.cni.cncf.io/networks: <name> 1
    spec:
      containers:
      - name: sample-container
        image: <image> 2
        command: ["sleep", "infinity"]
        resources:
          limits:
            memory: "1Gi" 3
            cpu: "2" 4
          requests:
            memory: "1Gi"
            cpu: "2"
    1
    <name> 替换为 SR-IOV 网络附加定义 CR 的名称。
    2
    <image> 替换为 sample-pod 镜像的名称。
    3
    要创建带有保证 QoS 的 SR-IOV pod,将 memory limits 设置为与 memory requests 相同的值。
    4
    要创建带有保证 QoS 的 SR-IOV pod,将 cpu limits 设置为与 cpu requests 相同。
  2. 运行以下命令来创建 SR-IOV pod 示例:

    $ oc create -f <filename> 1
    1
    <filename> 替换为您在上一步中创建的文件的名称。
  3. 确认 sample-pod 配置为带有保证 QoS。

    $ oc describe pod sample-pod
  4. 确认 sample-pod 被分配了独有的 CPU。

    $ oc exec sample-pod -- cat /sys/fs/cgroup/cpuset/cpuset.cpus
  5. 确认为 sample-pod 分配的 SR-IOV 设备和 CPU 位于相同的 NUMA 节点上。

    $ oc exec sample-pod -- cat /sys/fs/cgroup/cpuset/cpuset.cpus

9.6.4. 其他资源