8.8. 在 DPDK 和 RDMA 模式中使用虚拟功能(VF)的示例

您可以使用单一根 I/O 虚拟化(SR-IOV)网络硬件和 Data Plane Development Kit (DPDK) 以及远程直接内存访问 (RDMA) 。

8.8.1. 在 DPDK 和 RDMA 模式中使用虚拟功能(VF)的示例

重要

Data Plane Development Kit (DPDK) 只是一个技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/

重要

远程直接内存访问 (RDMA) 只是一个技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/

8.8.2. 先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。
  • 您必须已安装了 SR-IOV Network Operator。

8.8.3. 在 Intel NIC 的 DPDK 模式中使用虚拟功能 (VF) 示例

流程

  1. 创建以下 SriovNetworkNodePolicy CR,然后在 intel-dpdk-node-policy.yaml 文件中保存 YAML。

    apiVersion: sriovnetwork.openshift.io/v1
    kind: SriovNetworkNodePolicy
    metadata:
      name: intel-dpdk-node-policy
      namespace: openshift-sriov-network-operator
    spec:
      resourceName: intelnics
      nodeSelector:
        feature.node.kubernetes.io/network-sriov.capable: "true"
      priority: <priority>
      numVfs: <num>
      nicSelector:
        vendor: "8086"
        deviceID: "158b"
        pfNames: ["<pf_name>", ...]
        rootDevices: ["<pci_bus_id>", "..."]
      deviceType: vfio-pci 1
    1
    将虚拟功能(VF)的驱动器类型指定为 vfio-pci
    注意

    请参阅 Configuring SR-IOV network devices 一节以了解 SriovNetworkNodePolicy 中的每个选项的信息。

    当应用由 SriovNetworkNodePolicy CR 指定的配置时,SR-IOV Operator 可能会排空节点,并在某些情况下会重启节点。它可能需要几分钟时间来应用配置更改。确保集群中有足够的可用节点,用以预先处理被驱除的工作负载。

    应用配置更新后,openshift-sriov-network-operator 命名空间中的所有 Pod 将变为 Running 状态。

  2. 通过运行以下命令来创建 SriovNetworkNodePolicy CR:

    $ oc create -f intel-dpdk-node-policy.yaml
  3. 创建以下 SriovNetwork CR,然后在 intel-dpdk-network.yaml 文件中保存 YAML。

    apiVersion: sriovnetwork.openshift.io/v1
    kind: SriovNetwork
    metadata:
      name: intel-dpdk-network
      namespace: openshift-sriov-network-operator
    spec:
      networkNamespace: <target_namespace>
      ipam: "{}" 1
      vlan: <vlan>
      resourceName: intelnics
    1
    为 ipam CNI 插件指定一个空对象 "{}" 。DPDK 在用户空间模式下工作,不需要 IP 地址。
    注意

    请参阅 Configuring SR-IOV additional network 部分以了解 SriovNetwork 中的每个选项的信息。

  4. 通过运行以下命令来创建 SriovNetworkNodePolicy CR:

    $ oc create -f intel-dpdk-network.yaml
  5. 创建以下 Pod spec,然后在 intel-dpdk-pod.yaml 文件中保存 YAML。

    apiVersion: v1
    kind: Pod
    metadata:
      name: dpdk-app
      namespace: <target_namespace> 1
      annotations:
        k8s.v1.cni.cncf.io/networks: intel-dpdk-network
    spec:
      containers:
      - name: testpmd
        image: <DPDK_image> 2
        securityContext:
         capabilities:
            add: ["IPC_LOCK"] 3
        volumeMounts:
        - mountPath: /dev/hugepages 4
          name: hugepage
        resources:
          limits:
            openshift.io/intelnics: "1" 5
            memory: "1Gi"
            cpu: "4" 6
            hugepages-1Gi: "4Gi" 7
          requests:
            openshift.io/intelnics: "1"
            memory: "1Gi"
            cpu: "4"
            hugepages-1Gi: "4Gi"
        command: ["sleep", "infinity"]
      volumes:
      - name: hugepage
        emptyDir:
          medium: HugePages
    1
    指定 target_namespace,它与 SriovNetwork CR intel-dpdk-network 创建于的命令空间相同。如果要在其他命名空间中创建 Pod,请在 Pod spec 和 reverseovNetowrk CR 中更改 target_namespace
    2
    指定包含应用程序和应用程序使用的 DPDK 库的 DPDK 镜像。
    3
    指定应用程序在容器内分配巨页内存所需的 IPC_LOCK 功能。
    4
    /dev/hugepages下将巨页卷挂载到 DPDK Pod 中。巨页卷由 emptyDir 卷类型支持,medium 为Hugepages
    5
    可选:指定分配给 DPDK Pod 的 DPDK 设备数。如果未明确指定,则此资源请求和限制将被 SR-IOV 网络资源注入程序自动添加。SR-IOV 网络资源注入程序是由 SR-IOV Operator 管理的准入控制器组件。它默认是启用的,可以通过把默认的 SriovOperatorConfig CR 中的 enableInjector 选项设置为 false 来禁用它。
    6
    指定 CPU 数量。DPDK Pod 通常需要从 kubelet 分配专用 CPU。这可以通过将 CPU Manager 策略设置为 static,并创建带有有保障的 QoS 的 Pod 来实现。
    7
    指定巨页大小 hugepages-1Gihugepages-2Mi 以及分配给 DPDK Pod 的巨页数量。单独配置 2Mi1Gi 巨页。配置 1Gi 巨页需要在节点中添加内核参数。例如:添加内核参数 default_hugepagesz=1GBhugepagesz=1Ghugepages=16 将在系统引导时分配 16*1Gi 巨页。
  6. 运行以下命令来创建 DPDK Pod:

    $ oc create -f intel-dpdk-pod.yaml

8.8.4. 使用带有 Mellanox NIC 的 DPDK 模式的虚拟功能(VF)示例

流程

  1. 创建以下 SriovNetworkNodePolicy CR,然后在 mlx-dpdk-node-policy.yaml 文件中保存 YAML。

    apiVersion: sriovnetwork.openshift.io/v1
    kind: SriovNetworkNodePolicy
    metadata:
      name: mlx-dpdk-node-policy
      namespace: openshift-sriov-network-operator
    spec:
      resourceName: mlxnics
      nodeSelector:
        feature.node.kubernetes.io/network-sriov.capable: "true"
      priority: <priority>
      numVfs: <num>
      nicSelector:
        vendor: "15b3"
        deviceID: "1015" 1
        pfNames: ["<pf_name>", ...]
        rootDevices: ["<pci_bus_id>", "..."]
      deviceType: netdevice 2
      isRdma: true 3
    1
    指定 SR-IOV 网络设备的设备十六进制代码。Mellanox 卡允许的值是 10151017
    2
    指定到 netdevice 的虚拟功能(VF)的驱动器类型。Mellanox SR-IOV VF 可以在 DPDK 模式下工作,而无需使用 vfio-pci 设备类型。VF 设备作为容器内的内核网络接口出现。
    3
    启用 RDMA 模式。Mellanox 卡需要在 DPDK 模式下工作。
    注意

    请参阅 Configuring SR-IOV network devices 一节以了解 SriovNetworkNodePolicy 中的每个选项的信息。

    当应用由 SriovNetworkNodePolicy CR 指定的配置时,SR-IOV Operator 可能会排空节点,并在某些情况下会重启节点。它可能需要几分钟时间来应用配置更改。确保集群中有足够的可用节点,用以预先处理被驱除的工作负载。

    应用配置更新后,openshift-sriov-network-operator 命名空间中的所有 Pod 将变为 Running 状态。

  2. 通过运行以下命令来创建 SriovNetworkNodePolicy CR:

    $ oc create -f mlx-dpdk-node-policy.yaml
  3. 创建以下 SriovNetwork CR,然后在 mlx-dpdk-network.yaml 文件中保存 YAML。

    apiVersion: sriovnetwork.openshift.io/v1
    kind: SriovNetwork
    metadata:
      name: mlx-dpdk-network
      namespace: openshift-sriov-network-operator
    spec:
      networkNamespace: <target_namespace>
      ipam: |- 1
        ...
      vlan: <vlan>
      resourceName: mlxnics
    1
    为 ipam CNI 插件指定一个配置对象做为一个 YAML 块 scalar。该插件管理网络附加定义的 IP 地址分配。
    注意

    请参阅 Configuring SR-IOV additional network 部分以了解 SriovNetwork 中的每个选项的信息。

  4. 通过运行以下命令来创建 SriovNetworkNodePolicy CR:

    $ oc create -f mlx-dpdk-network.yaml
  5. 创建以下 Pod spec,然后在 mlx-dpdk-pod.yaml 文件中保存 YAML。

    apiVersion: v1
    kind: Pod
    metadata:
      name: dpdk-app
      namespace: <target_namespace> 1
      annotations:
        k8s.v1.cni.cncf.io/networks: mlx-dpdk-network
    spec:
      containers:
      - name: testpmd
        image: <DPDK_image> 2
        securityContext:
         capabilities:
            add: ["IPC_LOCK"] 3
        volumeMounts:
        - mountPath: /dev/hugepages 4
          name: hugepage
        resources:
          limits:
            openshift.io/mlxnics: "1" 5
            memory: "1Gi"
            cpu: "4" 6
            hugepages-1Gi: "4Gi" 7
          requests:
            openshift.io/mlxnics: "1"
            memory: "1Gi"
            cpu: "4"
            hugepages-1Gi: "4Gi"
        command: ["sleep", "infinity"]
      volumes:
      - name: hugepage
        emptyDir:
          medium: HugePages
    1
    指定 target_namespace,它与 SriovNetwork CR mlx-dpdk-network 创建于的命令空间相同。如果要在其他命名空间中创建 Pod,请在 Pod spec 和 SriovNetowrk CR 中更改 target_namespace
    2
    指定包含应用程序和应用程序使用的 DPDK 库的 DPDK 镜像。
    3
    指定应用程序在容器内分配巨页内存所需的 IPC_LOCK 功能。
    4
    /dev/hugepages下将巨页卷挂载到 DPDK Pod 中。巨页卷由 emptyDir 卷类型支持,medium 为Hugepages
    5
    可选:指定分配给 DPDK Pod 的 DPDK 设备数。如果未明确指定,则此资源请求和限制将被 SR-IOV 网络资源注入程序自动添加。SR-IOV 网络资源注入程序是由 SR-IOV Operator 管理的准入控制器组件。它默认是启用的,可以通过把默认的 SriovOperatorConfig CR 中的 enableInjector 选项设置为 false 来禁用它。
    6
    指定 CPU 数量。DPDK Pod 通常需要从 kubelet 分配专用 CPU。这可以通过将 CPU Manager 策略设置为 static,并创建带有有保障的 QoS 的 Pod 来实现。
    7
    指定巨页大小 hugepages-1Gihugepages-2Mi 以及分配给 DPDK Pod 的巨页数量。单独配置 2Mi1Gi 巨页。配置 1Gi 巨页需要在节点中添加内核参数。
  6. 运行以下命令来创建 DPDK Pod:

    $ oc create -f mlx-dpdk-pod.yaml

8.8.5. 带有 Mellanox NIC 的 RDMA 模式中的虚拟功能(VF)示例

在 OpenShift Container Platform 上使用 RDMA 时,RDMA over Converged Ethernet (RoCE) 是唯一支持的模式。

流程

  1. 创建以下 SriovNetworkNodePolicy CR,然后在 mlx-rdma-node-policy.yaml 文件中保存 YAML。

    apiVersion: sriovnetwork.openshift.io/v1
    kind: SriovNetworkNodePolicy
    metadata:
      name: mlx-rdma-node-policy
      namespace: openshift-sriov-network-operator
    spec:
      resourceName: mlxnics
      nodeSelector:
        feature.node.kubernetes.io/network-sriov.capable: "true"
      priority: <priority>
      numVfs: <num>
      nicSelector:
        vendor: "15b3"
        deviceID: "1015" 1
        pfNames: ["<pf_name>", ...]
        rootDevices: ["<pci_bus_id>", "..."]
      deviceType: netdevice 2
      isRdma: true 3
    1
    指定 SR-IOV 网络设备的设备十六进制代码。Mellanox 卡允许的值是 10151017
    2
    指定到 netdevice 的虚拟功能(VF)的驱动器类型。
    3
    启用 RDMA 模式。
    注意

    请参阅 Configuring SR-IOV network devices 一节以了解 SriovNetworkNodePolicy 中的每个选项的信息。

    当应用由 SriovNetworkNodePolicy CR 指定的配置时,SR-IOV Operator 可能会排空节点,并在某些情况下会重启节点。它可能需要几分钟时间来应用配置更改。确保集群中有足够的可用节点,用以预先处理被驱除的工作负载。

    应用配置更新后,openshift-sriov-network-operator 命名空间中的所有 Pod 将变为 Running 状态。

  2. 通过运行以下命令来创建 SriovNetworkNodePolicy CR:

    $ oc create -f mlx-rdma-node-policy.yaml
  3. 创建以下 SriovNetwork CR,然后在 mlx-rdma-network.yaml 文件中保存 YAML。

    apiVersion: sriovnetwork.openshift.io/v1
    kind: SriovNetwork
    metadata:
      name: mlx-rdma-network
      namespace: openshift-sriov-network-operator
    spec:
      networkNamespace: <target_namespace>
      ipam: |- 1
        ...
      vlan: <vlan>
      resourceName: mlxnics
    1
    为 ipam CNI 插件指定一个配置对象做为一个 YAML 块 scalar。该插件管理网络附加定义的 IP 地址分配。
    注意

    请参阅 Configuring SR-IOV additional network 部分以了解 SriovNetwork 中的每个选项的信息。

  4. 通过运行以下命令来创建 SriovNetworkNodePolicy CR:

    $ oc create -f mlx-rdma-network.yaml
  5. 创建以下 Pod spec,然后在 mlx-rdma-pod.yaml 文件中保存 YAML。

    apiVersion: v1
    kind: Pod
    metadata:
      name: rdma-app
      namespace: <target_namespace> 1
      annotations:
        k8s.v1.cni.cncf.io/networks: mlx-rdma-network
    spec:
      containers:
      - name: testpmd
        image: <RDMA_image> 2
        securityContext:
         capabilities:
            add: ["IPC_LOCK"] 3
        volumeMounts:
        - mountPath: /dev/hugepages 4
          name: hugepage
        resources:
          limits:
            memory: "1Gi"
            cpu: "4" 5
            hugepages-1Gi: "4Gi" 6
          requests:
            memory: "1Gi"
            cpu: "4"
            hugepages-1Gi: "4Gi"
        command: ["sleep", "infinity"]
      volumes:
      - name: hugepage
        emptyDir:
          medium: HugePages
    1
    指定 target_namespace,它与 SriovNetwork CR mlx-rdma-network 创建于的命令空间相同。如果要在其他命名空间中创建 Pod,请在 Pod spec 和 SriovNetowrk CR 中更改 target_namespace
    2
    指定包含应用程序和应用程序使用的 RDMA 库的 RDMA 镜像。
    3
    指定应用程序在容器内分配巨页内存所需的 IPC_LOCK 功能。
    4
    /dev/hugepages下将巨页卷挂载到 RDMA Pod。巨页卷由 emptyDir 卷类型支持,medium 为Hugepages
    5
    指定 CPU 数量。RDMA Pod 通常需要从 kubelet 分配专用 CPU。这可以通过将 CPU Manager 策略设置为 static,并创建带有有保障的 QoS 的 Pod 来实现。
    6
    指定巨页大小 hugepages-1Gihugepages-2Mi 以及分配给 RDMA Pod 的巨页数量。单独配置 2Mi1Gi 巨页。配置 1Gi 巨页需要在节点中添加内核参数。
  6. 运行以下命令来创建 RDMA Pod:

    $ oc create -f mlx-rdma-pod.yaml