3.7. 排除 NUMA 感知调度的 SR-IOV 网络拓扑


要将 SR-IOV 网络资源的 Non-Uniform Memory Access (NUMA)节点排除到拓扑管理器,您可以在 SriovNetworkNodePolicy 自定义资源中配置 excludeTopology 规格。在 NUMA 感知 pod 调度过程中,使用此配置来实现更灵活的 SR-IOV 网络部署。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 您已将 CPU Manager 策略配置为 static。有关 CPU Manager 的更多信息,请参阅附加资源部分。
  • 您已将 Topology Manager 策略配置为 single-numa-node
  • 已安装 SR-IOV Network Operator。

流程

  1. 创建 SriovNetworkNodePolicy CR:

    1. 将以下 YAML 保存到 sriov-network-node-policy.yaml 文件中,替换 YAML 中的值以匹配您的环境:

      apiVersion: sriovnetwork.openshift.io/v1
      kind: SriovNetworkNodePolicy
      metadata:
        name: <policy_name>
        namespace: openshift-sriov-network-operator
      spec:
        resourceName: sriovnuma0 
      1
      
        nodeSelector:
          kubernetes.io/hostname: <node_name>
        numVfs: <number_of_Vfs>
        nicSelector: 
      2
      
          vendor: "<vendor_ID>"
          deviceID: "<device_ID>"
        deviceType: netdevice
        excludeTopology: true 
      3
      Copy to Clipboard Toggle word wrap
      1
      SR-IOV 网络设备插件的资源名称。此 YAML 使用示例 resourceName 值。
      2
      使用网络接口控制器(NIC 选择器)识别要配置的 Operator 的设备。
      3
      要将 SR-IOV 网络资源的 NUMA 节点排除到拓扑管理器,请将值设为 true。默认值为 false
      注意

      如果多个 SriovNetworkNodePolicy 资源都以同一 SR-IOV 网络资源为目标,则 SriovNetworkNodePolicy 资源必须具有与 excludeTopology 规格相同的值。否则,冲突策略将被拒绝。

    2. 运行以下命令来创建 SriovNetworkNodePolicy 资源。成功输出列出了 SriovNetworkNodePolicy 资源的名称,状态为 created

      $ oc create -f sriov-network-node-policy.yaml
      Copy to Clipboard Toggle word wrap
  2. 创建 SriovNetwork CR:

    1. 将以下 YAML 保存到 sriov-network.yaml 文件中,替换 YAML 中的值以匹配您的环境:

      apiVersion: sriovnetwork.openshift.io/v1
      kind: SriovNetwork
      metadata:
        name: sriov-numa-0-network 
      1
      
        namespace: openshift-sriov-network-operator
      spec:
        resourceName: sriovnuma0 
      2
      
        networkNamespace: <namespace> 
      3
      
        ipam: |- 
      4
      
          {
            "type": "<ipam_type>",
          }
      Copy to Clipboard Toggle word wrap
      1
      sriov-numa-0-network 替换为 SR-IOV 网络资源的名称。
      2
      指定上一步中的 SriovNetworkNodePolicy CR 的资源名称。此 YAML 使用示例 resourceName 值。
      3
      输入 SR-IOV 网络资源的命名空间。
      4
      输入 SR-IOV 网络的 IP 地址管理配置。
    2. 运行以下命令来创建 SriovNetwork 资源。成功输出列出了 SriovNetwork 资源的名称,状态为 created

      $ oc create -f sriov-network.yaml
      Copy to Clipboard Toggle word wrap
  3. 创建 pod 并从上一步中分配 SR-IOV 网络资源:

    1. 将以下 YAML 保存到 sriov-network-pod.yaml 文件中,替换 YAML 中的值以匹配您的环境:

      apiVersion: v1
      kind: Pod
      metadata:
        name: <pod_name>
        annotations:
          k8s.v1.cni.cncf.io/networks: |-
            [
              {
                "name": "sriov-numa-0-network", 
      1
      
              }
            ]
      spec:
        containers:
        - name: <container_name>
          image: <image>
          imagePullPolicy: IfNotPresent
          command: ["sleep", "infinity"]
      Copy to Clipboard Toggle word wrap
      1
      这是使用 SriovNetworkNodePolicy 资源的 SriovNetwork 资源的名称。
    2. 运行以下命令来创建 Pod 资源。预期输出显示 Pod 资源的名称 ,状态为 created

      $ oc create -f sriov-network-pod.yaml
      Copy to Clipboard Toggle word wrap

验证

  1. 运行以下命令,将 <pod_name> 替换为 pod 的名称来验证 pod 的状态:

    $ oc get pod <pod_name>
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                                     READY   STATUS    RESTARTS   AGE
    test-deployment-sriov-76cbbf4756-k9v72   1/1     Running   0          45h
    Copy to Clipboard Toggle word wrap

  2. 打开目标 pod 的 debug 会话,以验证 SR-IOV 网络资源是否已部署到与内存和 CPU 资源不同的节点上。

    1. 运行以下命令,使用 pod 打开 debug 会话,将 <pod_name> 替换为目标 pod 名称。

      $ oc debug pod/<pod_name>
      Copy to Clipboard Toggle word wrap
    2. /host 设为 debug shell 中的根目录。debug pod 从 pod 中的 /host 中的主机挂载 root 文件系统。将根目录改为 /host,您可以从主机文件系统中运行二进制文件:

      $ chroot /host
      Copy to Clipboard Toggle word wrap
    3. 运行以下命令,查看有关 CPU 分配的信息:

      $ lscpu | grep NUMA
      Copy to Clipboard Toggle word wrap

      输出示例

      NUMA node(s):                    2
      NUMA node0 CPU(s):     0,2,4,6,8,10,12,14,16,18,...
      NUMA node1 CPU(s):     1,3,5,7,9,11,13,15,17,19,...
      Copy to Clipboard Toggle word wrap

      $ cat /proc/self/status | grep Cpus
      Copy to Clipboard Toggle word wrap

      输出示例

      Cpus_allowed:	ffff
      Cpus_allowed_list:	1,3,5,7
      Copy to Clipboard Toggle word wrap

      预期输出显示 CPU (1, 3, 5, 和 7),它们分配给一个 NUMA 节点,如 NUMA node1。SR-IOV 网络资源可以使用来自另一个 NUMA 节点的 NIC,如 NUMA node0。请注意,ffff 十六进制值代表运行一个进程的 CPU 内核。

      $ cat  /sys/class/net/net1/device/numa_node
      Copy to Clipboard Toggle word wrap

      预期输出显示 NUMA 节点的数,如 0

      注意

      如果将 excludeTopology 规格设为 True,则所需资源可能存在于同一个 NUMA 节点上。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat