第 2 章 配置 SR-IOV 网络设备
您可以在集群中配置单一根 I/O 虚拟化(SR-IOV)设备。
在执行以下文档中的任何任务前,请确保 安装了 SR-IOV Network Operator。
2.1. SR-IOV 网络节点配置对象 复制链接链接已复制到粘贴板!
您可以通过创建 SR-IOV 网络节点策略来为节点指定 SR-IOV 网络设备配置。策略的 API 对象是 sriovnetwork.openshift.io
API 组的一部分。
以下 YAML 描述了 SR-IOV 网络节点策略:
- 1
- 自定义资源对象的名称。
- 2
- 安装 SR-IOV Network Operator 的命名空间。
- 3
- SR-IOV 网络设备插件的资源名称。您可以为资源名称创建多个 SR-IOV 网络节点策略。
在指定名称时,请确保在
resourceName
中使用接受的语法表达式^[a-zA-Z0-9_]+$
。 - 4
- 节点选择器指定要配置的节点。只有所选节点上的 SR-IOV 网络设备才会被配置。SR-IOV Container Network Interface(CNI)插件和设备插件仅在所选节点上部署。重要
SR-IOV Network Operator 按顺序将节点网络配置策略应用到节点。在应用节点网络配置策略前,SR-IOV Network Operator 会检查节点的机器配置池(MCP)是否处于不健康状态,如
Degraded
或Updating
。如果节点处于不健康的 MCP,将节点网络配置策略应用到集群中的所有目标节点的过程会被暂停,直到 MCP 返回健康状态。为了避免处于不健康的 MCP 的节点阻止将节点网络配置策略应用到其他节点,包括处于其他 MCP 的节点,您必须为每个 MCP 创建单独的节点网络配置策略。
- 5
- 可选: priority 是一个
0
到99
之间的整数。较小的值具有更高的优先级。例如,优先级10
是高于优先级99
。默认值为99
。 - 6
- 可选:物理功能及其所有虚拟功能的最大传输单元(MTU)。最大 MTU 值可能因不同的网络接口控制器(NIC)型号而有所不同。重要
如果要在默认网络接口上创建虚拟功能,请确保将 MTU 设置为与集群 MTU 匹配的值。
如果要修改单个虚拟功能的 MTU,同时将功能分配给 pod,请将 MTU 值留在 SR-IOV 网络节点策略中。否则,SR-IOV Network Operator 会将虚拟功能的 MTU 恢复到 SR-IOV 网络节点策略中定义的 MTU 值,这可能会触发节点排空。
- 7
- 可选:将
needVhostNet
设置为true
,以在 pod 中挂载/dev/vhost-net
设备。使用挂载的/dev/vhost-net
设备及 Data Plane Development Kit (DPDK) 将流量转发到内核网络堆栈。 - 8
- 为 SR-IOV 物理网络设备创建的虚拟功能((VF)的数量。对于 Intel 网络接口控制器(NIC),VF 的数量不能超过该设备支持的 VF 总数。对于 Mellanox NIC,VF 的数量不能超过
127
。 - 9
externallyManaged
字段指示 SR-IOV Network Operator 是否管理所有,或只是虚拟功能(VF)的子集。将值设为false
时,SR-IOV Network Operator 管理并配置 PF 上的所有 VF。注意当
externalManaged
设置为true
时,您必须在应用SriovNetworkNodePolicy
资源前在物理功能(PF)上手动创建虚拟功能(VF)。如果没有预先创建 VF,SR-IOV Network Operator 的 Webhook 将阻止策略请求。当
externallyManaged
设为false
时,SR-IOV Network Operator 会自动创建和管理 VF,包括重置 VF (如果需要)。要在主机系统上使用 VF,您必须通过 NMState 创建它们,并将
externallyManaged
设置为true
。在这个模式中,SR-IOV Network Operator 不会修改 PF 或手动管理的 VF,策略nicSelector
字段中明确定义的 VF 除外。但是,SR-IOV Network Operator 继续管理用作 pod 二级接口的 VF。- 10
- NIC 选择器标识此资源应用到的设备。您不必为所有参数指定值。建议您足够精确地识别网络设备以避免意外选择设备。
如果指定了
rootDevices
,则必须同时为vendor
、deviceID
或pfNames
指定一个值。如果同时指定了pfNames
和rootDevices
,请确保它们引用同一设备。如果您为netFilter
指定了一个值,那么您不需要指定任何其他参数,因为网络 ID 是唯一的。 - 11
- 可选: SR-IOV 网络设备厂商的十六进制厂商代码。允许的值只能是
8086
(Intel)和15b3
(Mellanox)。 - 12
- 可选: SR-IOV 网络设备的十六进制设备标识符。例如,
101b
是 Mellanox ConnectX-6 设备的设备 ID。 - 13
- 可选:资源需要应用到的一个或多个物理功能(PF)名称的数组。
- 14
- 可选:资源需要应用到的一个或多个 PCI 总线地址的数组。例如
0000:02:00.1
。 - 15
- 可选:特定平台的网络过滤器。唯一支持的平台是 Red Hat OpenStack Platform(RHOSP)。可接受的值具有以下格式:
openstack/NetworkID:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
。将xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxx
替换为来自/var/config/openstack/latest/network_data.json
元数据文件的值。此过滤器确保 VF 与特定的 OpenStack 网络关联。Operator 使用此过滤器根据 OpenStack 平台提供的元数据将 VF 映射到适当的网络。 - 16
- 可选:为从此资源创建的 VF 配置的驱动程序。允许的值只能是
netdevice
和vfio-pci
。默认值为netdevice
。对于裸机节点上的 DPDK 模式的 Mellanox NIC,请使用
netdevice
驱动程序类型,并将isRdma
设置为true
。 - 17
- 可选:配置是否启用远程直接访问 (RDMA) 模式。默认值为
false
。如果
isRdma
参数设为true
,您可以继续使用启用了 RDMA 的 VF 作为普通网络设备。设备可在其中的一个模式中使用。将
isRdma
设置为true
,并将needVhostNet
设置为true
以配置 Mellanox NIC 以用于 Fast Datapath DPDK 应用程序。注意对于 intel NIC,您无法将
isRdma
参数设置为true
。 - 18
- 可选:VF 的链接类型。默认值为
eth
(以太网)。在 InfiniBand 中将这个值改为 'ib'。当将
linkType
设置为ib
时,SR-IOV Network Operator Webhook 会自动将isRdma
设置为true
。当将linkType
设定为ib
时,deviceType
不应该被设置为vfio-pci
。不要为 SriovNetworkNodePolicy 将 linkType 设置为
eth
,因为这可能会导致设备插件报告的可用设备数量不正确。 - 19
- 可选: 要启用硬件卸载,您必须将
eSwitchMode
字段设置为"switchdev"
。有关硬件卸载的更多信息,请参阅"配置硬件卸载"。 - 20
- 可选:要排除将一个 SR-IOV 网络资源的 NUMA 节点广告到拓扑管理器,将值设为
true
。默认值为false
。
2.1.1. SR-IOV 网络节点配置示例 复制链接链接已复制到粘贴板!
以下示例描述了 InfiniBand 设备的配置:
InfiniBand 设备的配置示例
以下示例描述了 RHOSP 虚拟机中的 SR-IOV 网络设备配置:
虚拟机中的 SR-IOV 设备配置示例
2.1.2. 自动发现 SR-IOV 网络设备 复制链接链接已复制到粘贴板!
SR-IOV Network Operator 将搜索集群以获取 worker 节点上的 SR-IOV 功能网络设备。Operator 会为每个提供兼容 SR-IOV 网络设备的 worker 节点创建并更新一个 SriovNetworkNodeState 自定义资源 (CR) 。
为 CR 分配了与 worker 节点相同的名称。status.interfaces
列表提供有关节点上网络设备的信息。
不要修改 SriovNetworkNodeState
对象。Operator 会自动创建和管理这些资源。
2.1.2.1. SriovNetworkNodeState 对象示例 复制链接链接已复制到粘贴板!
以下 YAML 是由 SR-IOV Network Operator 创建的 SriovNetworkNodeState
对象的示例:
一 个 SriovNetworkNodeState 对象
2.1.3. 启用安全引导时,在 Mellanox 卡中配置 SR-IOV Network Operator 复制链接链接已复制到粘贴板!
SR-IOV Network Operator 支持一个选项来跳过 Mellanox 设备的固件配置。这个选项允许您在系统启用了安全引导时使用 SR-IOV Network Operator 创建虚拟功能。在切换系统以安全引导前,您必须手动配置并分配固件中的虚拟功能数量。
固件中的虚拟功能数量是策略中您可以请求的最大虚拟功能数。
流程
当使用 sriov-config 守护进程时,当系统没有安全引导时,配置虚拟功能(VF):
mstconfig -d -0001:b1:00.1 set SRIOV_EN=1 NUM_OF_VFS=16
$ mstconfig -d -0001:b1:00.1 set SRIOV_EN=1 NUM_OF_VFS=16
1 2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过禁用 Mellanox 插件来配置 SR-IOV Network Operator。请参阅以下
SriovOperatorConfig
示例配置:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 重启系统以启用虚拟功能和配置设置。
运行以下命令在重启系统后检查虚拟功能(VF):
oc -n openshift-sriov-network-operator get sriovnetworknodestate.sriovnetwork.openshift.io worker-0 -oyaml
$ oc -n openshift-sriov-network-operator get sriovnetworknodestate.sriovnetwork.openshift.io worker-0 -oyaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
totalvfs
值与流程前面在mstconfig
命令中使用的数字相同。
启用安全引导以防止未经授权的操作系统和恶意软件在设备的引导过程中加载。
使用 BIOS (基本输入/输出系统)启用安全引导,以便为以下参数设置值:
-
安全引导: 启用
-
安全引导策略: Standard
-
安全引导模式:部署模式
-
- 重启系统。
2.1.4. SR-IOV 设备的虚拟功能 (VF) 分区 复制链接链接已复制到粘贴板!
在某些情况下,您可能想要将同一物理功能(PF)的虚拟功能(VF)分成多个资源池。例如: 您可能想要某些 VF 使用默认驱动程序载入,而其他的 VF 负载使用 vfio-pci
驱动程序。
例如,以下 YAML 显示名为 netpf0
的、带有 VF 2
到 7
的接口的选择器:
pfNames: ["netpf0#2-7"]
pfNames: ["netpf0#2-7"]
其中:
netpf0
- PF 接口名称的名称。
2
- 包含在范围内的第一个 VF 索引(基于 0)。
7
- 包含在范围内的最后一个 VF 索引(基于 0)。
您可以使用您满足以下要求的不同策略 CR 从同一 PF 中选择 VF:
-
对于选择相同 PF 的策略,
numVfs
值必须类似。 -
VF 索引范围是从
0
到<numVfs>-1
之间。例如,如果您有一个策略,它的numVfs
被设置为8
,则<first_vf>
的值不能小于0
,<last_vf>
的值不能大于7
。 - 不同策略中的 VF 范围不得互相重叠。
-
<first_vf>
不能大于<last_vf>
。
以下示例演示了 SR-IOV 设备的 NIC 分区。
策略 policy-net-1
定义了一个资源池 net-1
,其中包含带有默认 VF 驱动程序的 PF netpf
的 VF 0。策略 0
policy-net-1-dpdk
定义了一个资源池 net-1-dpdk
,其中包含带有 vfio
VF 驱动程序的 PF netpf0
的 VF 8
到 15
。
策略 policy-net-1
:
策略 policy-net-1-dpdk
:
验证接口是否已成功分区
运行以下命令,确认 SR-IOV 设备的接口分区到虚拟功能(VF)。
ip link show <interface>
$ ip link show <interface>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<interface>
替换为您在分区为 SR-IOV 设备的 VF 时指定的接口,如ens3f1
。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.1.5. 在 OpenStack 上使用 SR-IOV 的集群测试 pod 模板 复制链接链接已复制到粘贴板!
以下 testpmd
pod 演示了使用巨页、保留 CPU 和 SR-IOV 端口创建容器。
testpmd
pod 示例
- 1
- 本例假定性能配置集的名称为
cnf-performance profile
。
2.1.6. 在 OpenStack 上使用 OVS 硬件卸载的集群测试 pod 模板 复制链接链接已复制到粘贴板!
以下 testpmd
pod 在 Red Hat OpenStack Platform (RHOSP) 上演示了 Open vSwitch (OVS) 硬件卸载。
testpmd
pod 示例
- 1
- 如果您的性能配置集没有命名为
cnf-performance profile
,请将该字符串替换为正确的性能配置集名称。
2.1.7. Downward API 的巨页资源注入 复制链接链接已复制到粘贴板!
当 pod 规格包含巨页的资源请求或限制时,Network Resources Injector 会自动在 pod 规格中添加 Downward API 字段,以便为容器提供巨页信息。
Network Resources Injector 添加一个名为 podnetinfo
的卷,并挂载到 pod 中的每个容器的 /etc/podnetinfo
。卷使用 Downward API,并包含一个用于大页面请求和限制的文件。文件命名规则如下:
-
/etc/podnetinfo/hugepages_1G_request_<container-name>
-
/etc/podnetinfo/hugepages_1G_limit_<container-name>
-
/etc/podnetinfo/hugepages_2M_request_<container-name>
-
/etc/podnetinfo/hugepages_2M_limit_<container-name>
上一个列表中指定的路径与 app-netutil
库兼容。默认情况下,该库配置为搜索 /etc/podnetinfo
目录中的资源信息。如果您选择自己手动指定 Downward API 路径项目,app-netutil
库除上一个列表中的路径外还会搜索以下路径。
-
/etc/podnetinfo/hugepages_request
-
/etc/podnetinfo/hugepages_limit
-
/etc/podnetinfo/hugepages_1G_request
-
/etc/podnetinfo/hugepages_1G_limit
-
/etc/podnetinfo/hugepages_2M_request
-
/etc/podnetinfo/hugepages_2M_limit
与 Network Resources Injector 可以创建的路径一样,以上列表中的路径可以选择以一个 _<container-name>
后缀结尾。