×

网络附件的运行时配置

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

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

基于以太网的 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 地址。要使用此功能,还必须在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"]

基于 InfiniBand 的 SR-IOV 附件的运行时配置

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

[
  {
    "name": "<network_attachment>", (1)
    "infiniband-guid": "<guid>", (2)
    "ips": ["<cidr_range>"] (3)
  }
]
1 SR-IOV 网络附件定义 CR 的名称。
2 SR-IOV 设备的 InfiniBand GUID。要使用此功能,还必须在SriovIBNetwork对象中指定{ "infinibandGUID": true }
3 从 SR-IOV 网络附件定义 CR 中定义的资源类型分配的 SR-IOV 设备的 IP 地址。支持 IPv4 和 IPv6 地址。要使用此功能,还必须在SriovIBNetwork对象中指定{ "ips": true }
运行时配置示例
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
  annotations:
    k8s.v1.cni.cncf.io/networks: |-
      [
        {
          "name": "ib1",
          "infiniband-guid": "c2:11:22:33:44:55:66:77",
          "ips": ["192.168.10.1/24", "2001::1/64"]
        }
      ]
spec:
  containers:
  - name: sample-container
    image: <image>
    imagePullPolicy: IfNotPresent
    command: ["sleep", "infinity"]

将 Pod 添加到附加网络

您可以将 Pod 添加到附加网络。Pod 将继续通过默认网络发送正常的集群相关网络流量。

创建 Pod 时,会附加附加网络。但是,如果 Pod 已经存在,则无法向其附加附加网络。

Pod 必须与附加网络位于相同的命名空间。

SR-IOV 网络资源注入器会自动将resource字段添加到 Pod 中的第一个容器。

如果您在数据平面开发套件 (DPDK) 模式下使用英特尔网络接口控制器 (NIC),则仅配置 Pod 中的第一个容器才能访问 NIC。如果在SriovNetworkNodePolicy对象中将deviceType设置为vfio-pci,则您的 SR-IOV 附加网络将配置为 DPDK 模式。

您可以通过以下两种方法解决此问题:确保需要访问 NIC 的容器是Pod对象中定义的第一个容器,或者禁用网络资源注入器。有关更多信息,请参阅BZ#1990953

先决条件
  • 安装 OpenShift CLI (oc)。

  • 登录到集群。

  • 安装 SR-IOV 运算符。

  • 创建SriovNetwork对象或SriovIBNetwork对象以将 Pod 附加到其中。

步骤
  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. 可选:要确认PodCR 中存在注释,请输入以下命令,并将<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/network-status: |- (1)
          [{
              "name": "ovn-kubernetes",
              "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/network-status参数是对象的 JSON 数组。每个对象描述附加到 Pod 的附加网络的状态。注释值存储为纯文本值。

向 Pod 公开 vfio-pci SR-IOV 设备的 MTU

将 Pod 添加到附加网络后,您可以检查 SR-IOV 网络是否可用 MTU。

步骤
  1. 通过运行以下命令检查 Pod 注释是否包含 MTU

    $ oc describe pod example-pod

    以下示例显示示例输出

    "mac": "20:04:0f:f1:88:01",
           "mtu": 1500,
           "dns": {},
           "device-info": {
             "type": "pci",
             "version": "1.1.0",
             "pci": {
               "pci-address": "0000:86:01.3"
        }
      }
  2. 通过运行以下命令,验证 MTU 是否在 Pod 内的/etc/podnetinfo/中可用

    $ oc exec example-pod -n sriov-tests -- cat /etc/podnetinfo/annotations | grep mtu

    以下示例显示示例输出

    k8s.v1.cni.cncf.io/network-status="[{
        \"name\": \"ovn-kubernetes\",
        \"interface\": \"eth0\",
        \"ips\": [
            \"10.131.0.67\"
        ],
        \"mac\": \"0a:58:0a:83:00:43\",
        \"default\": true,
        \"dns\": {}
        },{
        \"name\": \"sriov-tests/sriov-nic-1\",
        \"interface\": \"net1\",
        \"ips\": [
            \"192.168.10.1\"
        ],
        \"mac\": \"20:04:0f:f1:88:01\",
        \"mtu\": 1500,
        \"dns\": {},
        \"device-info\": {
            \"type\": \"pci\",
            \"version\": \"1.1.0\",
            \"pci\": {
                \"pci-address\": \"0000:86:01.3\"
            }
        }
        }]"

创建非一致性内存访问 (NUMA) 对齐的 SR-IOV Pod

您可以通过使用restrictedsingle-numa-node拓扑管理器策略限制从同一 NUMA 节点分配的 SR-IOV 和 CPU 资源来创建 NUMA 对齐的 SR-IOV Pod。

先决条件
  • 您已安装 OpenShift CLI (oc)。

  • 您已将 CPU 管理器策略配置为static。有关 CPU 管理器的更多信息,请参阅“其他资源”部分。

  • 您已将拓扑管理器策略配置为single-numa-node

    single-numa-node无法满足请求时,您可以将拓扑管理器策略配置为restricted。有关更灵活的 SR-IOV 网络资源调度的信息,请参阅其他资源部分中的在 NUMA 感知调度期间排除 SR-IOV 网络拓扑

步骤
  1. 创建以下 SR-IOV Pod 规范,然后将 YAML 保存到<name>-sriov-pod.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,请将内存限制设置为等于内存请求
    4 要创建具有保证 QoS 的 SR-IOV Pod,请将cpu 限制设置为等于cpu 请求
  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

使用 OpenStack 上的 SR-IOV 的集群的测试 Pod 模板

以下testpmdPod 演示了使用巨页、保留的 CPU 和 SR-IOV 端口创建容器。

testpmdPod 示例
apiVersion: v1
kind: Pod
metadata:
  name: testpmd-sriov
  namespace: mynamespace
  annotations:
    cpu-load-balancing.crio.io: "disable"
    cpu-quota.crio.io: "disable"
# ...
spec:
  containers:
  - name: testpmd
    command: ["sleep", "99999"]
    image: registry.redhat.io/openshift4/dpdk-base-rhel8:v4.9
    securityContext:
      capabilities:
        add: ["IPC_LOCK","SYS_ADMIN"]
      privileged: true
      runAsUser: 0
    resources:
      requests:
        memory: 1000Mi
        hugepages-1Gi: 1Gi
        cpu: '2'
        openshift.io/sriov1: 1
      limits:
        hugepages-1Gi: 1Gi
        cpu: '2'
        memory: 1000Mi
        openshift.io/sriov1: 1
    volumeMounts:
      - mountPath: /dev/hugepages
        name: hugepage
        readOnly: False
  runtimeClassName: performance-cnf-performanceprofile (1)
  volumes:
  - name: hugepage
    emptyDir:
      medium: HugePages
1 此示例假设性能配置文件的名称为cnf-performance profile