8.6. 将虚拟机连接到 SR-IOV 网络
您可以通过执行以下步骤将虚拟机 (VM) 连接到单根 I/O 虚拟化 (SR-IOV) 网络:
8.6.1. 配置 SR-IOV 网络设备
SR-IOV Network Operator 把 SriovNetworkNodePolicy.sriovnetwork.openshift.io
CRD 添加到 OpenShift Container Platform。您可以通过创建一个 SriovNetworkNodePolicy 自定义资源 (CR) 来配置 SR-IOV 网络设备。
在应用由 SriovNetworkNodePolicy
对象中指定的配置时,SR-IOV Operator 可能会排空节点,并在某些情况下会重启节点。仅在以下情况下重启:
-
使用 Mellanox NIC (
mlx5
驱动程序) 时,每次当在一个物理功能(PF)中的虚拟功能 (VF) 数量增加时,节点都会重启。 -
使用 Intel NIC 时,只有在内核参数不包含
intel_iommu=on
和iommu=pt
时,才会重启。
它可能需要几分钟时间来应用配置更改。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
角色的用户访问集群。 - 已安装 SR-IOV Network Operator。
- 集群中有足够的可用节点,用于处理从排空节点中驱除的工作负载。
- 您还没有为 SR-IOV 网络设备配置选择任何 control plane 节点。
流程
创建一个
SriovNetworkNodePolicy
对象,然后在<name>-sriov-node-network.yaml
文件中保存 YAML。使用配置的实际名称替换<name>
。apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: <name> 1 namespace: openshift-sriov-network-operator 2 spec: resourceName: <sriov_resource_name> 3 nodeSelector: feature.node.kubernetes.io/network-sriov.capable: "true" 4 priority: <priority> 5 mtu: <mtu> 6 numVfs: <num> 7 nicSelector: 8 vendor: "<vendor_code>" 9 deviceID: "<device_id>" 10 pfNames: ["<pf_name>", ...] 11 rootDevices: ["<pci_bus_id>", "..."] 12 deviceType: vfio-pci 13 isRdma: false 14
- 1
- 为 CR 对象指定一个名称。
- 2
- 指定 SR-IOV Operator 安装到的命名空间。
- 3
- 指定 SR-IOV 设备插件的资源名称。您可以为一个资源名称创建多个
SriovNetworkNodePolicy
对象。 - 4
- 指定节点选择器来选择要配置哪些节点。只有所选节点上的 SR-IOV 网络设备才会被配置。SR-IOV Container Network Interface(CNI)插件和设备插件仅在所选节点上部署。
- 5
- 可选:指定一个
0
到99
之间的整数。较小的数值具有较高的优先权,优先级10
高于优先级99
。默认值为99
。 - 6
- 可选:为虚拟功能(VF)的最大传输单位 (MTU) 指定一个值。最大 MTU 值可能因不同的 NIC 型号而有所不同。
- 7
- 为 SR-IOV 物理网络设备指定要创建的虚拟功能 (VF) 的数量。对于 Intel 网络接口控制器(NIC),VF 的数量不能超过该设备支持的 VF 总数。对于 Mellanox NIC,VF 的数量不能超过
127
。 - 8
nicSelector
映射为 Operator 选择要配置的以太网设备。您不需要为所有参数指定值。建议您以足够的准确度来识别以太网适配器,以便尽量减小意外选择其他以太网设备的可能性。如果指定了rootDevices
,则必须同时为vendor
、deviceID
或pfNames
指定一个值。如果同时指定了pfNames
和rootDevices
,请确保它们指向同一个设备。- 9
- 可选:指定 SR-IOV 网络设备的厂商十六进制代码。允许的值只能是
8086
或15b3
。 - 10
- 可选:指定 SR-IOV 网络设备的设备十六进制代码。允许的值只能是
158b
、1015
、1017
。 - 11
- 可选:参数接受包括以太网设备的一个或多个物理功能 (PF) 的数组。
- 12
- 参数接受一个包括一个或多个 PCI 总线地址,用于以太网设备的物理功能的数组。使用以下格式提供地址:
0000:02:00.1
。 - 13
- OpenShift Virtualization 中的虚拟功能需要
vfio-pci
驱动程序类型。 - 14
- 可选:指定是否启用远程直接访问(RDMA)模式。对于 Mellanox 卡,请将
isRdma
设置为false
。默认值为false
。
注意如果将
RDMA
标记设定为true
,您可以继续使用启用了 RDMA 的 VF 作为普通网络设备。设备可在其中的一个模式中使用。-
可选:将 SR-IOV 功能的集群节点标记为
SriovNetworkNodePolicy.Spec.NodeSelector
(如果它们还没有标记)。有关标记节点的更多信息,请参阅"了解如何更新节点上的标签"。 创建
SriovNetworkNodePolicy
对象:$ oc create -f <name>-sriov-node-network.yaml
其中
<name>
指定这个配置的名称。在应用配置更新后,
sriov-network-operator
命名空间中的所有 Pod 都会变为Running
状态。要验证是否已配置了 SR-IOV 网络设备,请输入以下命令。将
<node_name>
替换为带有您刚才配置的 SR-IOV 网络设备的节点名称。$ oc get sriovnetworknodestates -n openshift-sriov-network-operator <node_name> -o jsonpath='{.status.syncStatus}'
8.6.2. 配置 SR-IOV 额外网络
您可以通过创建一个 SriovNetwork
对象来配置使用 SR-IOV 硬件的额外网络。
创建 SriovNetwork
对象时,SR-IOV Network Operator 会自动创建一个 NetworkAttachmentDefinition
对象。
如果一个 SriovNetwork
对象已被附加到状态为 running
的 Pod 或虚拟机上,则不能修改或删除它。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
-
创建以下
SriovNetwork
对象,然后在<name>-sriov-network.yaml
文件中保存 YAML。用这个额外网络的名称替换<name>
。
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: <name> 1 namespace: openshift-sriov-network-operator 2 spec: resourceName: <sriov_resource_name> 3 networkNamespace: <target_namespace> 4 vlan: <vlan> 5 spoofChk: "<spoof_check>" 6 linkState: <link_state> 7 maxTxRate: <max_tx_rate> 8 minTxRate: <min_rx_rate> 9 vlanQoS: <vlan_qos> 10 trust: "<trust_vf>" 11 capabilities: <capabilities> 12
- 1
- 将
<name>
替换为对象的名称。SR-IOV Network Operator 创建一个名称相同的NetworkAttachmentDefinition
对象。 - 2
- 指定 SR-IOV Network Operator 安装到的命名空间。
- 3
- 将
<sriov_resource_name>
替换为来自为这个额外网络定义 SR-IOV 硬件的SriovNetworkNodePolicy
对象的.spec.resourceName
参数的值。 - 4
- 将
<target_namespace>
替换为 SriovNetwork 的目标命名空间。只有目标命名空间中的 pod 或虚拟机可以附加到 SriovNetwork。 - 5
- 可选:使用额外网络的虚拟 LAN (VLAN) ID 替换
<vlan>
。它需要是一个从0
到4095
范围内的一个整数值。默认值为0
。 - 6
- 可选:将
<spoof_check>
替换为 VF 的 spoof 检查模式。允许的值是字符串"on"
和"off"
。重要指定的值必须由引号包括,否则 SR-IOV Network Operator 将拒绝 CR。
- 7
- 可选:将
<link_state>
替换为 Virtual Function (VF) 的链接状态。允许的值是enable
、disable
和auto
。 - 8
- 可选:将
<max_tx_rate>
替换为 VF 的最大传输率(以 Mbps 为单位)。 - 9
- 可选:将
<min_tx_rate>
替换为 VF 的最小传输率(以 Mbps 为单位)。这个值应该总是小于或等于最大传输率。注意Intel NIC 不支持
minTxRate
参数。如需更多信息,请参阅 BZ#1772847。 - 10
- 可选:将
<vlan_qos>
替换为 VF 的 IEEE 802.1p 优先级级别。默认值为0
。 - 11
- 可选:将
<trust_vf>
替换为 VF 的信任模式。允许的值是字符串"on"
和"off"
。重要指定的值必须由引号包括,否则 SR-IOV Network Operator 将拒绝 CR。
- 12
- 可选:将
<capabilities>
替换为为这个网络配置的功能。
运行以下命令来创建对象。用这个额外网络的名称替换
<name>
。$ oc create -f <name>-sriov-network.yaml
可选: 要确认与您在上一步中创建的
SriovNetwork
对象关联的NetworkAttachmentDefinition
对象是否存在,请输入以下命令。将<namespace>
替换为您在SriovNetwork
对象中指定的命名空间。$ oc get net-attach-def -n <namespace>
8.6.3. 使用命令行将虚拟机连接到 SR-IOV 网络
您可以通过在虚拟机配置中包含网络详情将虚拟机 (VM) 连接到 SR-IOV 网络。
流程
将 SR-IOV 网络详情添加到虚拟机配置的
spec.domain.devices.interfaces
和spec.networks
小节中,如下例所示:apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: example-vm spec: domain: devices: interfaces: - name: nic1 1 sriov: {} networks: - name: nic1 2 multus: networkName: sriov-network 3 # ...
应用虚拟机配置:
$ oc apply -f <vm_sriov>.yaml 1
- 1
- 虚拟机 YAML 文件的名称。
8.6.4. 使用 Web 控制台将虚拟机连接到 SR-IOV 网络
您可以通过在虚拟机配置中包含网络详情将虚拟机连接到 SR-IOV 网络。
先决条件
- 您必须为网络创建网络附加定义。
流程
-
进入到 Virtualization
VirtualMachines。 - 点虚拟机查看 VirtualMachine 详情页。
- 在 Configuration 选项卡上,点 Network interfaces 选项卡。
- 点 Add network interface。
- 输入接口名称。
- 从 Network 列表中选择 SR-IOV 网络附加定义。
-
从 Type 列表中选择
SR-IOV
。 - 可选:添加网络 Model 或 Mac 地址。
- 点击 Save。
- 重启或实时迁移虚拟机以应用更改。