9.4. 使用TAP CNI 运行具有内核访问权限的 rootless DPDK 工作负载
DPDK 应用程序可以使用 virtio-user
作为异常路径,将某些类型的数据包(如日志消息)注入内核进行处理。有关此功能的更多信息,请参阅 Virtio_user 作为例外路径。
在 OpenShift Container Platform 版本 4.14 及更高版本中,您可以使用非特权 pod 和 tap CNI 插件运行 DPDK 应用程序。要启用此功能,您需要在 SriovNetworkNodePolicy
对象中将 needVhostNet
参数设置为 true
来挂载 vhost-net
设备。
图 9.1. DPDK 和TAP 示例配置
先决条件
-
已安装 OpenShift CLI(
oc
)。 - 已安装 SR-IOV Network Operator。
-
您以具有
cluster-admin
权限的用户身份登录。 确保在所有节点上将
container_use_devices=on
设置为 root。注意使用 Machine Config Operator 设置此 SELinux 布尔值。
流程
创建一个文件,如
test-namespace.yaml
,其内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建新的
Namespace
对象:oc apply -f test-namespace.yaml
$ oc apply -f test-namespace.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个文件,如
sriov-node-network-policy.yaml
,内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
SriovNetworkNodePolicy
对象:oc create -f sriov-node-network-policy.yaml
$ oc create -f sriov-node-network-policy.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建以下
SriovNetwork
对象,然后在sriov-network-attachment.yaml
文件中保存 YAML:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如需
SriovNetwork
中的每个选项的详细说明,请参阅"Configuring SR-IOV additional network" 部分。一个可选的库
app-netutil
提供了多种 API 方法来收集有关容器父 pod 的网络信息。运行以下命令来创建
SriovNetwork
对象:oc create -f sriov-network-attachment.yaml
$ oc create -f sriov-network-attachment.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个文件,如
tap-example.yaml
,该文件定义网络附加定义,其内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定创建
SriovNetwork
对象的target_namespace
。
运行以下命令来创建
NetworkAttachmentDefinition
对象:oc apply -f tap-example.yaml
$ oc apply -f tap-example.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个文件,如
dpdk-pod-rootless.yaml
,其内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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
$ oc create -f dpdk-pod-rootless.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow