23.12. 配置硬件卸载 (offloading)
作为集群管理员,您可以在兼容节点上配置硬件卸载,以提高数据处理性能并减少主机 CPU 的负载。
23.12.1. 关于硬件卸载
Open vSwitch 硬件卸载是一种处理网络任务的方法,方法是将它们从 CPU 中分离出来,并将它们卸载到网络接口控制器上的专用处理器。因此,集群可从更快的数据传输速度、CPU 工作负载减少并降低计算成本中受益。
此功能的关键元素是网络接口控制器的现代类,称为 SmartNIC。SmartNIC 是一个网络接口控制器,它可以处理计算密集型网络处理任务。与专用图形卡可提高图形性能的方式相同,T SmartNIC 可改进网络性能。在各个情形中,专用处理器提高了特定类型的处理任务的性能。
在 OpenShift Container Platform 中,您可以为具有兼容 SmartNIC 的裸机节点配置硬件卸载。SR-IOV Network Operator 配置并启用硬件卸载。
硬件卸载并不适用于所有工作负载或应用程序类型。只支持以下两种通信类型:
- pod 到 pod
- Pod 到服务,其中服务是一个由常规 pod 支持的 ClusterIP 服务
在所有情况下,只有在将 pod 和服务分配给具有兼容 SmartNIC 的节点时,硬件卸载才会发生。假设节点上带有硬件卸载的 pod 会尝试与常规节点上的服务进行通信。常规节点上,所有处理都会在内核中进行,因此 pod 到服务通信的整体性能仅限于该常规节点的最大性能。硬件卸载与 DPDK 应用程序不兼容。
在节点上启用硬件卸载,但没有配置 pod 使用,可能会导致 pod 流量的吞吐量性能降低。您无法为 OpenShift Container Platform 管理的 pod 配置硬件卸载。
23.12.2. 支持的设备
在以下网络接口控制器上支持硬件卸载:
制造商 | model | 供应商 ID | 设备 ID |
---|---|---|---|
Mellanox | MT27800 系列 [ConnectX-5] | 15b3 | 1017 |
Mellanox | MT28880 系列 [ConnectX-5 Ex] | 15b3 | 1019 |
Mellanox | MT2892 系列 [ConnectX-6 Dx] | 15b3 | 101d |
Mellanox | MT2894 系列 [ConnectX-6 Lx] | 15b3 | 101f |
Mellanox | ConnectX-6 NIC 模式中的 MT42822 BlueField-2 | 15b3 | a2d6 |
23.12.3. 先决条件
- 集群至少有一个裸机带有网络接口控制器,支持进行硬件卸载。
- 已安装 SR-IOV Network Operator。
- 集群使用 OVN-Kubernetes 网络插件。
-
在 OVN-Kubernetes 网络插件配置中,
gatewayConfig.routingViaHost
字段被设置为false
。
23.12.4. 为硬件卸载配置机器配置池
要启用硬件卸载,您必须首先创建一个专用的机器配置池,并将其配置为使用 SR-IOV Network Operator。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
为您要使用硬件卸载的机器创建机器配置池。
创建一个文件,如
mcp-offloading.yaml
,其内容类似以下示例:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfigPool metadata: name: mcp-offloading 1 spec: machineConfigSelector: matchExpressions: - {key: machineconfiguration.openshift.io/role, operator: In, values: [worker,mcp-offloading]} 2 nodeSelector: matchLabels: node-role.kubernetes.io/mcp-offloading: "" 3
应用机器配置池的配置:
$ oc create -f mcp-offloading.yaml
将节点添加到机器配置池。使用池的节点角色标签标记每个节点:
$ oc label node worker-2 node-role.kubernetes.io/mcp-offloading=""
可选: 要验证是否创建了新池,请运行以下命令:
$ oc get nodes
输出示例
NAME STATUS ROLES AGE VERSION master-0 Ready master 2d v1.27.3 master-1 Ready master 2d v1.27.3 master-2 Ready master 2d v1.27.3 worker-0 Ready worker 2d v1.27.3 worker-1 Ready worker 2d v1.27.3 worker-2 Ready mcp-offloading,worker 47h v1.27.3 worker-3 Ready mcp-offloading,worker 47h v1.27.3
将此机器配置池添加到
SriovNetworkPoolConfig
自定义资源中:创建一个文件,如
sriov-pool-config.yaml
,其内容类似以下示例:apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkPoolConfig metadata: name: sriovnetworkpoolconfig-offload namespace: openshift-sriov-network-operator spec: ovsHardwareOffloadConfig: name: mcp-offloading 1
- 1
- 用于硬件卸载的机器配置池的名称。
应用配置:
$ oc create -f <SriovNetworkPoolConfig_name>.yaml
注意当您应用由
SriovNetworkPoolConfig
对象中指定的配置时,SR-IOV Operator 会排空并重启机器配置池中的节点。它可能需要几分钟时间来应用配置更改。
23.12.5. 配置 SR-IOV 网络节点策略
您可以通过创建 SR-IOV 网络节点策略来为节点创建 SR-IOV 网络设备配置。要启用硬件卸载,您必须使用值 "switchdev"
定义 .spec.eSwitchMode
字段。
以下流程为带有硬件卸载的网络接口控制器创建 SR-IOV 接口。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
创建一个文件,如
sriov-node-policy.yaml
,其内容类似以下示例:apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: sriov-node-policy 1 namespace: openshift-sriov-network-operator spec: deviceType: netdevice 2 eSwitchMode: "switchdev" 3 nicSelector: deviceID: "1019" rootDevices: - 0000:d8:00.0 vendor: "15b3" pfNames: - ens8f0 nodeSelector: feature.node.kubernetes.io/network-sriov.capable: "true" numVfs: 6 priority: 5 resourceName: mlxnics
应用策略的配置:
$ oc create -f sriov-node-policy.yaml
注意当您应用由
SriovNetworkPoolConfig
对象中指定的配置时,SR-IOV Operator 会排空并重启机器配置池中的节点。它可能需要几分钟时间来应用配置更改。
23.12.5.1. OpenStack 的 SR-IOV 网络节点策略示例
以下示例描述了在 Red Hat OpenStack Platform (RHOSP) 上使用硬件卸载的网络接口控制器 (NIC) 的 SR-IOV 接口。
用于 RHOSP 上带有硬件卸载的 NIC 的 SR-IOV 接口
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: ${name} namespace: openshift-sriov-network-operator spec: deviceType: switchdev isRdma: true nicSelector: netFilter: openstack/NetworkID:${net_id} nodeSelector: feature.node.kubernetes.io/network-sriov.capable: 'true' numVfs: 1 priority: 99 resourceName: ${name}
23.12.6. 使用虚拟功能提高网络流量性能
按照以下步骤,为 OVN-Kubernetes 管理端口分配虚拟功能,并提高其网络流量性能。
此流程会导致创建两个池:第一个池具有 OVN-Kubernetes 使用的虚拟功能,第二个由剩余的虚拟功能组成。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
运行以下命令,将
network.operator.openshift.io/smart-nic
标签添加到带有 SmartNIC 的每个 worker 节点:$ oc label node <node-name> network.operator.openshift.io/smart-nic=
使用
oc get nodes
命令获取可用节点的列表。为管理端口创建一个名为
sriov-node-mgmt-vf-policy.yaml
的策略,其内容如下:apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: sriov-node-mgmt-vf-policy namespace: openshift-sriov-network-operator spec: deviceType: netdevice eSwitchMode: "switchdev" nicSelector: deviceID: "1019" rootDevices: - 0000:d8:00.0 vendor: "15b3" pfNames: - ens8f0#0-0 1 nodeSelector: network.operator.openshift.io/smart-nic: "" numVfs: 6 2 priority: 5 resourceName: mgmtvf
创建名为
sriov-node-policy.yaml
的策略,其内容如下:apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: sriov-node-policy namespace: openshift-sriov-network-operator spec: deviceType: netdevice eSwitchMode: "switchdev" nicSelector: deviceID: "1019" rootDevices: - 0000:d8:00.0 vendor: "15b3" pfNames: - ens8f0#1-5 1 nodeSelector: network.operator.openshift.io/smart-nic: "" numVfs: 6 2 priority: 5 resourceName: mlxnics
注意sriov-node-mgmt-vf-policy.yaml
文件具有与sriov-node-policy.yaml
文件不同的pfNames
和resourceName
键的值。为这两个策略应用配置:
$ oc create -f sriov-node-policy.yaml
$ oc create -f sriov-node-mgmt-vf-policy.yaml
在集群中创建 Cluster Network Operator (CNO) ConfigMap 以进行管理配置:
创建名为
hardware-offload-config.yaml
的 ConfigMap,其内容如下:apiVersion: v1 kind: ConfigMap metadata: name: hardware-offload-config namespace: openshift-network-operator data: mgmt-port-resource-name: openshift.io/mgmtvf
应用 ConfigMap 的配置:
$ oc create -f hardware-offload-config.yaml
其他资源
23.12.7. 创建网络附加定义
在定义机器配置池和 SR-IOV 网络节点策略后,您可以为您指定的网络接口卡创建网络附加定义。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
创建一个文件,如
net-attach-def.yaml
,其内容类似以下示例:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: net-attach-def 1 namespace: net-attach-def 2 annotations: k8s.v1.cni.cncf.io/resourceName: openshift.io/mlxnics 3 spec: config: '{"cniVersion":"0.3.1","name":"ovn-kubernetes","type":"ovn-k8s-cni-overlay","ipam":{},"dns":{}}'
应用网络附加定义的配置:
$ oc create -f net-attach-def.yaml
验证
运行以下命令,以查看是否存在新定义:
$ oc get net-attach-def -A
输出示例
NAMESPACE NAME AGE net-attach-def net-attach-def 43h
23.12.8. 在 pod 中添加网络附加定义
创建机器配置池后,SriovNetworkPoolConfig
和 SriovNetworkNodePolicy
自定义资源以及网络附加定义后,您可以通过在 pod 规格中添加网络附加定义来将这些配置应用到 pod。
流程
在 pod 规格中,添加
.metadata.annotations.k8s.v1.cni.cncf.io/networks
字段,并为硬件卸载指定您创建的网络附加定义:.... metadata: annotations: v1.multus-cni.io/default-network: net-attach-def/net-attach-def 1
- 1
- 该值必须是您为硬件卸载而创建的网络附加定义的名称和命名空间。