×

关于硬件卸载

Open vSwitch硬件卸载是一种通过将网络任务从CPU转移到网络接口控制器上的专用处理器来处理网络任务的方法。因此,集群可以受益于更快的传输速度、更低的CPU工作负载和更低的计算成本。

此功能的关键组件是一种现代化的网络接口控制器,称为SmartNIC。SmartNIC是一种能够处理计算密集型网络处理任务的网络接口控制器。就像专用显卡可以提高图形性能一样,SmartNIC可以提高网络性能。在这两种情况下,专用处理器都会提高特定类型处理任务的性能。

在OpenShift Container Platform中,您可以为具有兼容SmartNIC的裸机节点配置硬件卸载。硬件卸载由SR-IOV网络操作员配置和启用。

硬件卸载与并非所有工作负载或应用程序类型兼容。仅支持以下两种通信类型:

  • Pod到Pod

  • Pod到服务,其中服务是由常规Pod支持的ClusterIP服务

在所有情况下,只有当这些Pod和服务分配给具有兼容SmartNIC的节点时,才会发生硬件卸载。例如,假设具有硬件卸载功能的节点上的一个Pod尝试与普通节点上的服务进行通信。在普通节点上,所有处理都在内核中进行,因此Pod到服务的通信的整体性能受到该普通节点的最大性能的限制。硬件卸载与DPDK应用程序不兼容。

在节点上启用硬件卸载,但不配置Pod使用它,可能会导致Pod流量的吞吐量性能下降。您无法为由OpenShift Container Platform管理的Pod配置硬件卸载。

支持的设备

硬件卸载支持以下网络接口控制器:

表1. 支持的网络接口控制器
制造商 型号 供应商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

先决条件

将SR-IOV网络操作员设置为systemd模式

要支持硬件卸载,您必须首先将SR-IOV网络操作员设置为systemd模式。

先决条件
  • 您已安装OpenShift CLI (oc)。

  • 您可以作为具有cluster-admin角色的用户访问集群。

步骤
  1. 创建一个SriovOperatorConfig自定义资源(CR)以部署所有SR-IOV Operator组件

    1. 创建一个名为sriovOperatorConfig.yaml的文件,其中包含以下YAML内容:

      apiVersion: sriovnetwork.openshift.io/v1
      kind: SriovOperatorConfig
      metadata:
        name: default (1)
        namespace: openshift-sriov-network-operator
      spec:
        enableInjector: true
        enableOperatorWebhook: true
        configurationMode: "systemd" (2)
        logLevel: 2
      1 SriovOperatorConfig资源的唯一有效名称是default,它必须位于部署Operator的命名空间中。
      2 将SR-IOV网络操作员设置为systemd模式仅与Open vSwitch硬件卸载相关。
    2. 运行以下命令创建资源:

      $ oc apply -f sriovOperatorConfig.yaml

配置用于硬件卸载的机器配置池

要启用硬件卸载,您现在需要创建一个专用的机器配置池并将其配置为与SR-IOV网络操作员一起工作。

先决条件
  1. 已安装SR-IOV网络操作员并将其设置为systemd模式。

步骤
  1. 为要使用硬件卸载的机器创建一个机器配置池。

    1. 创建一个文件,例如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]} (1)
        nodeSelector:
          matchLabels:
            node-role.kubernetes.io/mcp-offloading: "" (2)
      1 用于硬件卸载的机器配置池的名称。
      2 此节点角色标签用于将节点添加到机器配置池。
    2. 应用机器配置池的配置

      $ oc create -f mcp-offloading.yaml
  2. 将节点添加到机器配置池。使用池的节点角色标签标记每个节点

    $ oc label node worker-2 node-role.kubernetes.io/mcp-offloading=""
  3. 可选:要验证新池是否已创建,请运行以下命令:

    $ oc get nodes
    示例输出
    NAME       STATUS   ROLES                   AGE   VERSION
    master-0   Ready    master                  2d    v1.30.3
    master-1   Ready    master                  2d    v1.30.3
    master-2   Ready    master                  2d    v1.30.3
    worker-0   Ready    worker                  2d    v1.30.3
    worker-1   Ready    worker                  2d    v1.30.3
    worker-2   Ready    mcp-offloading,worker   47h   v1.30.3
    worker-3   Ready    mcp-offloading,worker   47h   v1.30.3
  4. 将此机器配置池添加到SriovNetworkPoolConfig自定义资源

    1. 创建一个文件,例如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 用于硬件卸载的机器配置池的名称。
    2. 应用配置

      $ oc create -f <SriovNetworkPoolConfig_name>.yaml

      当您应用SriovNetworkPoolConfig对象中指定的配置时,SR-IOV Operator将清空并重新启动机器配置池中的节点。

      配置更改的应用可能需要几分钟时间。

配置SR-IOV网络节点策略

您可以通过创建SR-IOV网络节点策略来为节点创建SR-IOV网络设备配置。要启用硬件卸载,必须使用值"switchdev"定义.spec.eSwitchMode字段。

以下步骤创建具有硬件卸载功能的网络接口控制器的SR-IOV接口。

先决条件
  • 您已安装OpenShift CLI (oc)。

  • 您可以作为具有cluster-admin角色的用户访问集群。

步骤
  1. 创建一个文件,例如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
    1 自定义资源对象的名称。
    2 必需。vfio-pci不支持硬件卸载。
    3 必需。
  2. 应用策略的配置

    $ oc create -f sriov-node-policy.yaml

    当您应用SriovNetworkPoolConfig对象中指定的配置时,SR-IOV Operator将清空并重新启动机器配置池中的节点。

    配置更改的应用可能需要几分钟时间。

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}

使用虚拟功能提高网络流量性能

按照此步骤将虚拟函数分配给OVN-Kubernetes管理端口并提高其网络流量性能。

此步骤将创建两个池:第一个池包含OVN-Kubernetes使用的虚拟函数,第二个池包含其余的虚拟函数。

先决条件
  • 您已安装OpenShift CLI (oc)。

  • 您可以作为具有cluster-admin角色的用户访问集群。

步骤
  1. 通过运行以下命令,为每个存在SmartNIC的工作节点添加network.operator.openshift.io/smart-nic标签:

    $ oc label node <node-name> network.operator.openshift.io/smart-nic=

    使用oc get nodes命令获取可用节点的列表。

  2. 为管理端口创建名为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
    1 将此设备替换为适合您用例的相应网络设备。pfNames值的#0-0部分保留OVN-Kubernetes使用的单个虚拟函数。
    2 此处提供的值只是一个示例。请将其替换为您需求的值。有关更多信息,请参阅“附加资源”部分中的*SR-IOV网络节点配置对象*。
  3. 创建名为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
    1 将此设备替换为适合您用例的相应网络设备。
    2 此处提供的值只是一个示例。请将其替换为sriov-node-mgmt-vf-policy.yaml文件中指定的值。有关更多信息,请参阅“附加资源”部分中的*SR-IOV网络节点配置对象*。

    sriov-node-mgmt-vf-policy.yaml文件中的pfNamesresourceName键的值与sriov-node-policy.yaml文件中的值不同。

  4. 应用这两个策略的配置

    $ oc create -f sriov-node-policy.yaml
    $ oc create -f sriov-node-mgmt-vf-policy.yaml
  5. 为管理配置在集群中创建集群网络操作员(CNO) ConfigMap

    1. 创建一个名为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
    2. 应用ConfigMap的配置

      $ oc create -f hardware-offload-config.yaml

创建网络附件定义

定义机器配置池和 SR-IOV 网络节点策略后,您可以为指定的网络接口卡创建网络附件定义。

先决条件
  • 您已安装OpenShift CLI (oc)。

  • 您可以作为具有cluster-admin角色的用户访问集群。

步骤
  1. 创建一个文件,例如 `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":{}}'
    1 您的网络附件定义的名称。
    2 您的网络附件定义的命名空间。
    3 这是您在 `SriovNetworkNodePolicy` 对象中指定的 `spec.resourceName` 字段的值。
  2. 应用网络附件定义的配置

    $ oc create -f net-attach-def.yaml
验证
  • 运行以下命令查看新的定义是否存在

    $ oc get net-attach-def -A
    示例输出
    NAMESPACE         NAME             AGE
    net-attach-def    net-attach-def   43h

将网络附件定义添加到您的 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 该值必须是您为硬件卸载创建的网络附件定义的名称和命名空间。