23.11. 使用 DPDK 和 RDMA
OpenShift Container Platform 支持容器化 Data Plane Development Kit (DPDK) 应用程序。您可以使用单一根 I/O 虚拟化(SR-IOV)网络硬件和 Data Plane Development Kit (DPDK) 以及远程直接内存访问 (RDMA) 。
有关支持的设备的详情,请参考支持的设备。
23.11.1. 在 DPDK 模式中使用 Intel NIC 的虚拟功能
先决条件
-
安装 OpenShift CLI(
oc
)。 - 安装 SR-IOV Network Operator。
-
以具有
cluster-admin
特权的用户身份登录。
流程
创建以下
SriovNetworkNodePolicy
对象,然后在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
。
注意如需了解
inSriovNetworkNodePolicy
的每个选项的详情,请参阅Configuring SR-IOV network devices
部分。当应用由
SriovNetworkNodePolicy
对象中指定的配置时,SR-IOV Operator 可能会排空节点,并在某些情况下会重启节点。它可能需要几分钟时间来应用配置更改。确保集群中有足够的可用节点,用以预先处理被驱除的工作负载。应用配置更新后,
openshift-sriov-network-operator
命名空间中的所有 pod 将变为Running
状态。运行以下命令来创建
SriovNetworkNodePolicy
对象:$ oc create -f intel-dpdk-node-policy.yaml
创建以下
SriovNetwork
对象,然后在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 插件指定一个配置对象做为一个 YAML 块 scalar。该插件管理附加定义的 IP 地址分配。
注意如需
SriovNetwork
中的每个选项的详细说明,请参阅"Configuring SR-IOV additional network" 部分。一个可选的库 app-netutil 提供了多种 API 方法来收集有关容器父 pod 的网络信息。
运行以下命令来创建
SriovNetwork
对象:$ oc create -f intel-dpdk-network.yaml
创建以下
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: runAsUser: 0 capabilities: add: ["IPC_LOCK","SYS_RESOURCE","NET_RAW"] 3 volumeMounts: - mountPath: /mnt/huge 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
对象intel-dpdk-network
创建于的命令空间相同。如果要在其他命名空间中创建 pod,在Pod
spec 和SriovNetwork
对象中更改target_namespace
。 - 2
- 指定包含应用程序和应用程序使用的 DPDK 库的 DPDK 镜像。
- 3
- 指定容器内的应用程序进行大页分配、系统资源分配和网络接口访问所需的额外功能。
- 4
- 在
/mnt/huge
下将巨页卷挂载到 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-1Gi
或hugepages-2Mi
以及分配给 DPDK pod 的巨页数量。单独配置2Mi
和1Gi
巨页。配置1Gi
巨页需要在节点中添加内核参数。例如:添加内核参数default_hugepagesz=1GB
,hugepagesz=1G
和hugepages=16
将在系统引导时分配16*1Gi
巨页。
运行以下命令来创建 DPDK pod:
$ oc create -f intel-dpdk-pod.yaml
23.11.2. 在带有 Mellanox NIC 的 DPDK 模式中使用虚拟功能
您可以创建一个网络节点策略,并在带有 Mellanox NIC 的 DPDK 模式中使用虚拟功能创建 Data Plane Development Kit (DPDK) pod。
先决条件
-
已安装 OpenShift CLI(
oc
)。 - 已安装 Single Root I/O Virtualization (SR-IOV) Network Operator。
-
您已以具有
cluster-admin
权限的用户身份登录。
流程
将以下
SriovNetworkNodePolicy
YAML 配置保存到mlx-dpdk-node-policy.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
注意如需了解
SriovNetworkNodePolicy
对象中的每个选项的详细说明,请参阅配置 SR-IOV 网络设备。当应用由
SriovNetworkNodePolicy
对象中指定的配置时,SR-IOV Operator 可能会排空节点,并在某些情况下会重启节点。它可能需要几分钟时间来应用配置更改。确保集群中有足够的可用节点,用以预先处理被驱除的工作负载。应用配置更新后,
openshift-sriov-network-operator
命名空间中的所有 pod 将变为Running
状态。运行以下命令来创建
SriovNetworkNodePolicy
对象:$ oc create -f mlx-dpdk-node-policy.yaml
将以下
SriovNetwork
YAML 配置保存到mlx-dpdk-network.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
- 为 IP 地址管理 (IPAM) Container Network Interface (CNI) 插件指定一个配置对象作为 YAML 块 scalar。该插件管理附加定义的 IP 地址分配。
注意如需了解
SriovNetwork
对象中的每个选项的详细说明,请参阅配置 SR-IOV 网络设备。app-netutil
选项库提供了几个 API 方法,用于收集有关容器父 pod 的网络信息。运行以下命令来创建
SriovNetwork
对象:$ oc create -f mlx-dpdk-network.yaml
将以下
Pod
YAML 配置保存到mlx-dpdk-pod.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: runAsUser: 0 capabilities: add: ["IPC_LOCK","SYS_RESOURCE","NET_RAW"] 3 volumeMounts: - mountPath: /mnt/huge 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
对象mlx-dpdk-network
创建于的命令空间相同。要在不同命名空间中创建 pod,在Pod
spec 和SriovNetwork
对象中更改target_namespace
。 - 2
- 指定包含应用程序和应用程序使用的 DPDK 库的 DPDK 镜像。
- 3
- 指定容器内的应用程序进行大页分配、系统资源分配和网络接口访问所需的额外功能。
- 4
- 将巨页卷挂载到
/mnt/huge
下的 DPDK pod 中。巨页卷由emptyDir
卷类型支持,介质是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
,并创建带有Guaranteed
服务质量 (QoS) 的 pod。 - 7
- 指定巨页大小
hugepages-1Gi
或hugepages-2Mi
以及分配给 DPDK pod 的巨页数量。单独配置2Mi
和1Gi
巨页。配置1Gi
巨页需要在节点中添加内核参数。
运行以下命令来创建 DPDK pod:
$ oc create -f mlx-dpdk-pod.yaml
23.11.3. 使用TAP CNI 运行具有内核访问权限的 rootless DPDK 工作负载
DPDK 应用程序可以使用 virtio-user
作为异常路径,将某些类型的数据包(如日志消息)注入内核进行处理。有关此功能的更多信息,请参阅 Virtio_user 作为例外路径。
在 OpenShift Container Platform 版本 4.14 及更高版本中,您可以使用非特权 pod 和 tap CNI 插件运行 DPDK 应用程序。要启用此功能,您需要在 SriovNetworkNodePolicy
对象中将 needVhostNet
参数设置为 true
来挂载 vhost-net
设备。
图 23.1. DPDK 和TAP 示例配置
先决条件
-
已安装 OpenShift CLI(
oc
)。 - 已安装 SR-IOV Network Operator。
-
您以具有
cluster-admin
权限的用户身份登录。 确保在所有节点上将
container_use_devices=on
设置为 root。注意使用 Machine Config Operator 设置此 SELinux 布尔值。
流程
创建一个文件,如
test-namespace.yaml
,其内容类似以下示例:apiVersion: v1 kind: Namespace metadata: name: test-namespace labels: pod-security.kubernetes.io/enforce: privileged pod-security.kubernetes.io/audit: privileged pod-security.kubernetes.io/warn: privileged security.openshift.io/scc.podSecurityLabelSync: "false"
运行以下命令来创建新的
Namespace
对象:$ oc apply -f test-namespace.yaml
创建一个文件,如
sriov-node-network-policy.yaml
,内容类似以下示例:apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: sriovnic namespace: openshift-sriov-network-operator spec: deviceType: netdevice 1 isRdma: true 2 needVhostNet: true 3 nicSelector: vendor: "15b3" 4 deviceID: "101b" 5 rootDevices: ["00:05.0"] numVfs: 10 priority: 99 resourceName: sriovnic nodeSelector: feature.node.kubernetes.io/network-sriov.capable: "true"
运行以下命令来创建
SriovNetworkNodePolicy
对象:$ oc create -f sriov-node-network-policy.yaml
创建以下
SriovNetwork
对象,然后在sriov-network-attachment.yaml
文件中保存 YAML:apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: sriov-network namespace: openshift-sriov-network-operator spec: networkNamespace: test-namespace resourceName: sriovnic spoofChk: "off" trust: "on"
注意如需
SriovNetwork
中的每个选项的详细说明,请参阅"Configuring SR-IOV additional network" 部分。一个可选的库
app-netutil
提供了多种 API 方法来收集有关容器父 pod 的网络信息。运行以下命令来创建
SriovNetwork
对象:$ oc create -f sriov-network-attachment.yaml
创建一个文件,如
tap-example.yaml
,该文件定义网络附加定义,其内容类似以下示例:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: tap-one namespace: test-namespace 1 spec: config: '{ "cniVersion": "0.4.0", "name": "tap", "plugins": [ { "type": "tap", "multiQueue": true, "selinuxcontext": "system_u:system_r:container_t:s0" }, { "type":"tuning", "capabilities":{ "mac":true } } ] }'
- 1
- 指定创建
SriovNetwork
对象的target_namespace
。
运行以下命令来创建
NetworkAttachmentDefinition
对象:$ oc apply -f tap-example.yaml
创建一个文件,如
dpdk-pod-rootless.yaml
,其内容类似以下示例:apiVersion: v1 kind: Pod metadata: name: dpdk-app namespace: test-namespace 1 annotations: k8s.v1.cni.cncf.io/networks: '[ {"name": "sriov-network", "namespace": "test-namespace"}, {"name": "tap-one", "interface": "ext0", "namespace": "test-namespace"}]' spec: nodeSelector: kubernetes.io/hostname: "worker-0" securityContext: fsGroup: 1001 2 runAsGroup: 1001 3 seccompProfile: type: RuntimeDefault containers: - name: testpmd image: <DPDK_image> 4 securityContext: capabilities: drop: ["ALL"] 5 add: 6 - IPC_LOCK - NET_RAW #for mlx only 7 runAsUser: 1001 8 privileged: false 9 allowPrivilegeEscalation: true 10 runAsNonRoot: true 11 volumeMounts: - mountPath: /mnt/huge 12 name: hugepages resources: limits: openshift.io/sriovnic: "1" 13 memory: "1Gi" cpu: "4" 14 hugepages-1Gi: "4Gi" 15 requests: openshift.io/sriovnic: "1" memory: "1Gi" cpu: "4" hugepages-1Gi: "4Gi" command: ["sleep", "infinity"] runtimeClassName: performance-cnf-performanceprofile 16 volumes: - name: hugepages emptyDir: medium: HugePages
- 1
- 指定
target_namespace
创建SriovNetwork
对象。如果要在其他命名空间中创建 pod,在Pod
spec 和SriovNetwork
对象中更改target_namespace
。 - 2
- 设置在这些卷中创建的卷挂载目录和文件的组所有权。
- 3
- 指定用于运行容器的主要组 ID。
- 4
- 指定包含应用程序和应用程序使用的 DPDK 库的 DPDK 镜像。
- 5
- 从容器的 securityContext 中删除所有功能 (
ALL
) 意味着容器在正常操作之外没有特殊的特权。 - 6
- 指定容器内的应用程序进行大页分配、系统资源分配和网络接口访问所需的额外功能。这些功能还必须使用
setcap
命令在二进制文件中设置。 - 7
- Mellanox 网络接口控制器(NIC)需要
NET_RAW
功能。 - 8
- 指定用于运行容器的用户 ID。
- 9
- 此设置表示 pod 中的容器或容器不应被授予对主机系统的特权访问权限。
- 10
- 此设置允许容器在可能已分配的初始非 root 特权外升级其特权。
- 11
- 此设置可确保容器以非 root 用户身份运行。这有助于强制实施最小特权的原则,限制对容器造成潜在的影响,并减少攻击面。
- 12
- 在
/mnt/huge
下将巨页卷挂载到 DPDK pod。巨页卷由 emptyDir 卷类型支持,medium 为Hugepages
。 - 13
- 可选:指定分配给 DPDK pod 的 DPDK 设备数。如果没有明确指定,则 SR-IOV 网络资源注入程序会自动添加此资源请求和限制。SR-IOV 网络资源注入程序是由 SR-IOV Operator 管理的准入控制器组件。它默认是启用的,可以通过把默认的
SriovOperatorConfig
CR 中的enableInjector
选项设置为false
来禁用它。 - 14
- 指定 CPU 数量。DPDK pod 通常需要从 kubelet 分配专用 CPU。这可以通过将 CPU Manager 策略设置为
static
,并创建带有有保障的
QoS 的 pod 来实现。 - 15
- 指定巨页大小
hugepages-1Gi
或hugepages-2Mi
以及分配给 DPDK pod 的巨页数量。单独配置2Mi
和1Gi
巨页。配置1Gi
巨页需要在节点中添加内核参数。例如:添加内核参数default_hugepagesz=1GB
,hugepagesz=1G
和hugepages=16
将在系统引导时分配16*1Gi
巨页。 - 16
- 如果您的性能配置集没有命名为
cnf-performance profile
,请将该字符串替换为正确的性能配置集名称。
运行以下命令来创建 DPDK pod:
$ oc create -f dpdk-pod-rootless.yaml
23.11.4. 实现特定 DPDK 行率概述
要实现特定的 Data Plane Development Kit (DPDK) 行率,部署 Node Tuning Operator 并配置单根 I/O 虚拟化 (SR-IOV)。您还必须为以下资源调整 DPDK 设置:
- 隔离的 CPU
- Hugepages
- 拓扑调度程序
在早期版本的 OpenShift Container Platform 中,Performance Addon Operator 用来实现自动性能优化,以便为 OpenShift Container Platform 应用程序实现低延迟性能。在 OpenShift Container Platform 4.11 及更新的版本中,这个功能是 Node Tuning Operator 的一部分。
DPDK 测试环境
下图显示了流量测试环境的组件:
- 流量生成器:可以生成高容量数据包流量的应用。
- SR-IOV 支持 NIC :与 SR-IOV 兼容的网络接口卡。该卡在物理接口上运行多个虚拟功能。
- 物理功能 (PF) :支持 SR-IOV 接口的网络适配器的 PCI Express (PCIe) 功能。
- 虚拟功能 (VF) :支持 SR-IOV 的网络适配器上的轻量级 PCIe 功能。VF 与网络适配器上的 PCIe PF 关联。VF 代表网络适配器的虚拟实例。
- 交换机 :网络交换机。节点也可以重新连接到回来。
-
testpmd
: DPDK 中包含的示例应用程序。testpmd
应用可用于在数据包转发模式下测试 DPDK。testpmd
应用程序也是如何使用 DPDK 软件开发套件 (SDK) 构建功能全面的应用程序的示例。 - worker 0 和 worker 1:OpenShift Container Platform 节点。
23.11.5. 使用 SR-IOV 和 Node Tuning Operator 实现 DPDK 行率
您可以使用 Node Tuning Operator 配置隔离的 CPU、巨页和拓扑调度程序。然后,您可以使用 Node Tuning Operator 和单根 I/O 虚拟化 (SR-IOV) 来实现特定的 Data Plane Development Kit (DPDK) 行率。
先决条件
-
已安装 OpenShift CLI(
oc
)。 - 已安装 SR-IOV Network Operator。
-
您已以具有
cluster-admin
权限的用户身份登录。 您已部署了独立的 Node Tuning Operator。
注意在以前版本的 OpenShift Container Platform 中,Performance Addon Operator 用来实现自动性能优化,以便为 OpenShift 应用程序实现低延迟性能。在 OpenShift Container Platform 4.11 及更新的版本中,这个功能是 Node Tuning Operator 的一部分。
流程
根据以下示例创建
PerformanceProfile
对象:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: globallyDisableIrqLoadBalancing: true cpu: isolated: 21-51,73-103 1 reserved: 0-20,52-72 2 hugepages: defaultHugepagesSize: 1G 3 pages: - count: 32 size: 1G net: userLevelNetworking: true numa: topologyPolicy: "single-numa-node" nodeSelector: node-role.kubernetes.io/worker-cnf: ""
- 1
- 如果系统上启用了超线程,请分配与
isolated
和reserved
CPU 组的相关符号链接。如果系统包含多个非统一内存访问节点 (NUMA),请将两个 NUMA 中的 CPU 分配给这两个组。您还可以将 Performance Profile Creator 用于此任务。如需更多信息,请参阅创建性能配置集。 - 2
- 您还可以指定将队列设置为保留 CPU 数的设备列表。如需更多信息,请参阅使用 Node Tuning Operator 缩减 NIC 队列。
- 3
- 分配所需的巨页的数量和大小。您可以为巨页指定 NUMA 配置。默认情况下,系统会为系统上的每个 NUMA 节点分配一个偶数数量。如果需要,您可以请求对节点使用实时内核。如需更多信息,请参阅置备具有实时功能的 worker。
-
将
yaml
文件保存为mlx-dpdk-perfprofile-policy.yaml
。 使用以下命令应用性能配置集:
$ oc create -f mlx-dpdk-perfprofile-policy.yaml
23.11.5.1. 用于虚拟功能的 SR-IOV Network Operator 示例
您可以使用单根 I/O 虚拟化 (SR-IOV) Network Operator 从节点上分配和配置虚拟功能 (VF) 的虚拟功能(VF)。
如需有关部署 Operator 的更多信息,请参阅安装 SR-IOV Network Operator。有关配置 SR-IOV 网络设备的更多信息,请参阅配置 SR-IOV 网络设备。
在 Intel VF 和 Mellanox VF 上运行 Data Plane Development Kit (DPDK) 工作负载之间存在一些区别。本节为这两个 VF 类型提供对象配置示例。以下是用于在 Intel NIC 上运行 DPDK 应用程序的 sriovNetworkNodePolicy
对象示例:
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: dpdk-nic-1 namespace: openshift-sriov-network-operator spec: deviceType: vfio-pci 1 needVhostNet: true 2 nicSelector: pfNames: ["ens3f0"] nodeSelector: node-role.kubernetes.io/worker-cnf: "" numVfs: 10 priority: 99 resourceName: dpdk_nic_1 --- apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: dpdk-nic-1 namespace: openshift-sriov-network-operator spec: deviceType: vfio-pci needVhostNet: true nicSelector: pfNames: ["ens3f1"] nodeSelector: node-role.kubernetes.io/worker-cnf: "" numVfs: 10 priority: 99 resourceName: dpdk_nic_2
以下是 Mellanox NIC 的 sriovNetworkNodePolicy
对象示例:
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: dpdk-nic-1 namespace: openshift-sriov-network-operator spec: deviceType: netdevice 1 isRdma: true 2 nicSelector: rootDevices: - "0000:5e:00.1" nodeSelector: node-role.kubernetes.io/worker-cnf: "" numVfs: 5 priority: 99 resourceName: dpdk_nic_1 --- apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: dpdk-nic-2 namespace: openshift-sriov-network-operator spec: deviceType: netdevice isRdma: true nicSelector: rootDevices: - "0000:5e:00.0" nodeSelector: node-role.kubernetes.io/worker-cnf: "" numVfs: 5 priority: 99 resourceName: dpdk_nic_2
23.11.5.2. SR-IOV 网络 Operator 示例
以下是 sriovNetwork
对象的示例定义。在这种情况下,Intel 和 Mellanox 配置是相同的:
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: dpdk-network-1 namespace: openshift-sriov-network-operator spec: ipam: '{"type": "host-local","ranges": [[{"subnet": "10.0.1.0/24"}]],"dataDir": "/run/my-orchestrator/container-ipam-state-1"}' 1 networkNamespace: dpdk-test 2 spoofChk: "off" trust: "on" resourceName: dpdk_nic_1 3 --- apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: dpdk-network-2 namespace: openshift-sriov-network-operator spec: ipam: '{"type": "host-local","ranges": [[{"subnet": "10.0.2.0/24"}]],"dataDir": "/run/my-orchestrator/container-ipam-state-1"}' networkNamespace: dpdk-test spoofChk: "off" trust: "on" resourceName: dpdk_nic_2
23.11.5.3. DPDK 基础工作负载示例
以下是数据平面开发套件 (DPDK) 容器的示例:
apiVersion: v1 kind: Namespace metadata: name: dpdk-test --- apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: '[ 1 { "name": "dpdk-network-1", "namespace": "dpdk-test" }, { "name": "dpdk-network-2", "namespace": "dpdk-test" } ]' irq-load-balancing.crio.io: "disable" 2 cpu-load-balancing.crio.io: "disable" cpu-quota.crio.io: "disable" labels: app: dpdk name: testpmd namespace: dpdk-test spec: runtimeClassName: performance-performance 3 containers: - command: - /bin/bash - -c - sleep INF image: registry.redhat.io/openshift4/dpdk-base-rhel8 imagePullPolicy: Always name: dpdk resources: 4 limits: cpu: "16" hugepages-1Gi: 8Gi memory: 2Gi requests: cpu: "16" hugepages-1Gi: 8Gi memory: 2Gi securityContext: capabilities: add: - IPC_LOCK - SYS_RESOURCE - NET_RAW - NET_ADMIN runAsUser: 0 volumeMounts: - mountPath: /mnt/huge name: hugepages terminationGracePeriodSeconds: 5 volumes: - emptyDir: medium: HugePages name: hugepages
不要使用 SLEEP
启动容器集,然后执行到容器集以启动 testpmd 或 DPDK 工作负载。这可添加额外的中断,因为 exec
进程没有固定到任何 CPU。
23.11.5.4. testpmd 脚本示例
以下是运行 testpmd
的示例脚本:
#!/bin/bash set -ex export CPU=$(cat /sys/fs/cgroup/cpuset/cpuset.cpus) echo ${CPU} dpdk-testpmd -l ${CPU} -a ${PCIDEVICE_OPENSHIFT_IO_DPDK_NIC_1} -a ${PCIDEVICE_OPENSHIFT_IO_DPDK_NIC_2} -n 4 -- -i --nb-cores=15 --rxd=4096 --txd=4096 --rxq=7 --txq=7 --forward-mode=mac --eth-peer=0,50:00:00:00:00:01 --eth-peer=1,50:00:00:00:00:02
这个示例使用两个不同的 sriovNetwork
CR。环境变量包含分配给 pod 的虚拟功能 (VF) PCI 地址。如果您在 pod 定义中使用相同的网络,您必须分割 pciAddress
。配置流量生成器的正确 MAC 地址非常重要。这个示例使用自定义 MAC 地址。
23.11.6. 在带有 Mellanox NIC 的 RDMA 模式中使用虚拟功能
RDMA over Converged Ethernet (RoCE) 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
在 OpenShift Container Platform 上使用 RDMA 时,RDMA over Converged Ethernet (RoCE) 是唯一支持的模式。
先决条件
-
安装 OpenShift CLI(
oc
)。 - 安装 SR-IOV Network Operator。
-
以具有
cluster-admin
特权的用户身份登录。
流程
创建以下
SriovNetworkNodePolicy
对象,然后在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
注意如需了解
inSriovNetworkNodePolicy
的每个选项的详情,请参阅Configuring SR-IOV network devices
部分。当应用由
SriovNetworkNodePolicy
对象中指定的配置时,SR-IOV Operator 可能会排空节点,并在某些情况下会重启节点。它可能需要几分钟时间来应用配置更改。确保集群中有足够的可用节点,用以预先处理被驱除的工作负载。应用配置更新后,
openshift-sriov-network-operator
命名空间中的所有 pod 将变为Running
状态。运行以下命令来创建
SriovNetworkNodePolicy
对象:$ oc create -f mlx-rdma-node-policy.yaml
创建以下
SriovNetwork
对象,然后在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 地址分配。
注意如需
SriovNetwork
中的每个选项的详细说明,请参阅"Configuring SR-IOV additional network" 部分。一个可选的库 app-netutil 提供了多种 API 方法来收集有关容器父 pod 的网络信息。
运行以下命令来创建
SriovNetworkNodePolicy
对象:$ oc create -f mlx-rdma-network.yaml
创建以下
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: runAsUser: 0 capabilities: add: ["IPC_LOCK","SYS_RESOURCE","NET_RAW"] 3 volumeMounts: - mountPath: /mnt/huge 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
对象mlx-rdma-network
创建于的命令空间相同。如果要在其他命名空间中创建 pod,在Pod
spec 和SriovNetwork
对象中更改target_namespace
。 - 2
- 指定包含应用程序和应用程序使用的 RDMA 库的 RDMA 镜像。
- 3
- 指定容器内的应用程序进行大页分配、系统资源分配和网络接口访问所需的额外功能。
- 4
- 在
/mnt/huge
下将巨页卷挂载到 RDMA pod。巨页卷由 emptyDir 卷类型支持,medium 为Hugepages
。 - 5
- 指定 CPU 数量。RDMA pod 通常需要从 kubelet 分配专用 CPU。这可以通过将 CPU Manager 策略设置为
static
,并创建带有有保障的
QoS 的 pod 来实现。 - 6
- 指定巨页大小
hugepages-1Gi
或hugepages-2Mi
以及分配给 RDMA pod 的巨页数量。单独配置2Mi
和1Gi
巨页。配置1Gi
巨页需要在节点中添加内核参数。
运行以下命令来创建 RDMA pod:
$ oc create -f mlx-rdma-pod.yaml
23.11.7. 在 OpenStack 上使用 OVS-DPDK 的集群测试 pod 模板
以下 testpmd
pod 演示了使用巨页、保留 CPU 和 SR-IOV 端口创建容器。
testpmd
pod 示例
apiVersion: v1 kind: Pod metadata: name: testpmd-dpdk 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/dpdk1: 1 1 limits: hugepages-1Gi: 1Gi cpu: '2' memory: 1000Mi openshift.io/dpdk1: 1 volumeMounts: - mountPath: /mnt/huge name: hugepage readOnly: False runtimeClassName: performance-cnf-performanceprofile 2 volumes: - name: hugepage emptyDir: medium: HugePages
23.11.8. 在 OpenStack 上使用 OVS 硬件卸载的集群测试 pod 模板
以下 testpmd
pod 在 Red Hat OpenStack Platform (RHOSP) 上演示了 Open vSwitch (OVS) 硬件卸载。
testpmd
pod 示例
apiVersion: v1
kind: Pod
metadata:
name: testpmd-sriov
namespace: mynamespace
annotations:
k8s.v1.cni.cncf.io/networks: hwoffload1
spec:
runtimeClassName: performance-cnf-performanceprofile 1
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'
limits:
hugepages-1Gi: 1Gi
cpu: '2'
memory: 1000Mi
volumeMounts:
- mountPath: /mnt/huge
name: hugepage
readOnly: False
volumes:
- name: hugepage
emptyDir:
medium: HugePages
- 1
- 如果您的性能配置集没有命名为
cnf-performance profile
,请将该字符串替换为正确的性能配置集名称。
23.11.9. 其他资源
- 创建性能配置集
- 使用性能配置集调整 NIC 队列
- 置备实时和低延迟工作负载
- 安装 SR-IOV Network Operator
- 配置 SR-IOV 网络设备
- 使用 Whereabouts 进行动态 IP 地址分配配置
- 禁用单个 pod 的中断处理
- 配置 SR-IOV 以太网网络附加
- app-netutil 库提供了几个 API 方法,用于收集容器父 pod 的网络信息。