鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

使用Kunpeng TAP

Kunpeng TAP允许在部署Pod时指定CPU资源需求,系统将自动按NUMA亲和性分配资源。通过编写YAML文件并指定节点选择器,可以将Pod部署到特定节点上。成功部署插件后,只需在部署其他Pod时指定CPU资源的request和limit值,系统将自动按照NUMA亲和性原则进行资源分配。

以下为部署一个单容器Pod的YAML文件示例,供用户参考。该Pod请求的CPU资源最小值为4核,最大值为8核,内存固定为4Gi,容器使用busybox作为镜像。

  1. 创建YAML文件,例如example.yaml,并在YAML文件中写入以下配置。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    apiVersion: v1
    kind: Pod
    metadata:
      name: tap-test
      annotations:
    spec:
      containers:
      - name: tap-example
        image: busybox:latest
        imagePullPolicy: IfNotPresent
        command: ["/bin/sh"]
        args: ["-c", "while true; do echo `date`; sleep 5; done"]
        resources:
          requests:
            cpu: "4"
            memory: "4Gi"
          limits:
            cpu: "8"
            memory: "4Gi"
    
  2. 以指定Pod在compute01节点上运行为例,需要在YAML文件中的spec部分加入以下内容。

    在多个工作节点的K8s集群中,Pod可能会被调度到不同节点的NUMA内。如果希望Pod在指定的节点上运行,只需在YAML文件的spec部分加入nodeSelector字段,并指定kubernetes.io/hostname为目标节点的名称。

    1
    2
      nodeSelector:
        kubernetes.io/hostname: compute01
    
  3. 在管理节点应用YAML文件,完成Pod部署。
    kubectl apply -f example.yaml
  4. 判断Kunpeng TAP是否生效。
    1. 以Docker运行时为例,进入步骤二中nodeSelector所指定的集群节点compute01后,通过docker命令查询容器的CpusetCpus参数,判断容器是否与NUMA成功亲和。
    2. 通过docker ps查询集群节点运行的容器任务,在NAMES列中找到步骤一中“spec.containers.name”指定的nri-1容器。
      # docker ps | grep nri-1
      CONTAINER ID   IMAGE                  COMMAND                  CREATED       STATUS       PORTS     NAMES
    3. 依据CONTAINER ID查询目标容器的部署参数CpusetCpus,该参数表示容器的可调度CPU范围。
      # docker inspect bf32de0d09fe | grep "CpusetCpus"
                  "CpusetCpus": "0-23",

      如果启用了内存绑定功能,可以通过如下命令查看,注意其取值表示节点的编号:

      # docker inspect bf32de0d09fe | grep "CpusetMems"
                  "CpusetMems": "0",

      在不同的机器上查看时, 绑定的NUMA节点不固定,CpusetCpus数字可能不一致。

      Containerd运行时可以运行如下命令查看容器的可调度CPU范围。
      # crictl inspect bf32de0d09fe | grep "cpuset_cpus"
                  "cpuset_cpus": "0-23",

      如果NUMA节点亲和失败,则可能无法查找到cpuset_cpus输出。

    4. 查询系统的NUMA信息,与上述的容器可调度CPU范围进行对比,一致则表示亲和于对应NUMA节点。
      # lscpu
      ...
      NUMA node0 CPU(s):               0-23
      NUMA node1 CPU(s):               24-47
      NUMA node2 CPU(s):               48-71
      NUMA node3 CPU(s):               72-95
      ...

      “node0”表示编号为“0”的NUMA节点,“0-23”表示NUMA节点内的CPU编号。

  5. (可选)此外,当对容器的GPU资源进行亲和时,需要查询系统中GPU设备的NUMA分布,可以运行如下命令查看,以AMD Radeon GPU为例。
    lspci -nn|grep VGA|grep Radeon

    回显如下图所示。

    图中的1002:67c7为<vendor>:<device> ID,用于下一步查询。
    lspci -vvv -d 1002:67c7 | grep NUMA

    回显如下图所示。