6.4. 使用手动性能设置调度 NUMA 感知工作负载
运行对延迟敏感工作负载的集群通常具有性能配置集,以帮助最小化工作负载延迟并优化性能。但是,您可以在不功能性能配置集的 pristine 集群中调度 NUMA 感知工作负载。以下工作流带有一个 pristine 集群,您可以使用 KubeletConfig 资源手动配置性能。这不是调度 NUMA 感知工作负载的典型环境。
6.4.1. 使用手动性能设置创建 NUMAResourcesOperator 自定义资源
安装 NUMA Resources Operator 后,创建 NUMAResourcesOperator 自定义资源 (CR) 来指示 NUMA Resources Operator 安装支持 NUMA 感知调度程序所需的所有集群基础架构,包括守护进程集和 API。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。 - 安装 NUMA Resources Operator。
流程
可选:创建
MachineConfigPool自定义资源,为 worker 节点启用自定义 kubelet 配置:注意默认情况下,OpenShift Container Platform 为集群中的 worker 节点创建一个
MachineConfigPool资源。如果需要,您可以创建自定义MachineConfigPool资源。将以下 YAML 保存到
nro-machineconfig.yaml文件中:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfigPool metadata: labels: cnf-worker-tuning: enabled machineconfiguration.openshift.io/mco-built-in: "" pools.operator.machineconfiguration.openshift.io/worker: "" name: worker spec: machineConfigSelector: matchLabels: machineconfiguration.openshift.io/role: worker nodeSelector: matchLabels: node-role.kubernetes.io/worker: ""运行以下命令来创建
MachineConfigPoolCR:$ oc create -f nro-machineconfig.yaml
创建
NUMAResourcesOperator自定义资源:将以下 YAML 保存到
nrop.yaml文件中:apiVersion: nodetopology.openshift.io/v1 kind: NUMAResourcesOperator metadata: name: numaresourcesoperator spec: nodeGroups: - machineConfigPoolSelector: matchLabels: pools.operator.machineconfiguration.openshift.io/worker: "" 1- 1
- 应该与相关
MachineConfigPoolCR 中的 worker 节点匹配。
运行以下命令来创建
NUMAResourcesOperatorCR:$ oc create -f nrop.yaml
验证
运行以下命令,验证 NUMA Resources Operator 是否已成功部署:
$ oc get numaresourcesoperators.nodetopology.openshift.io
输出示例
NAME AGE numaresourcesoperator 10m
6.4.2. 使用手动性能设置部署 NUMA 感知辅助 pod 调度程序
安装 NUMA Resources Operator 后,执行以下操作来部署 NUMA 感知辅助 pod 调度程序:
- 为所需机器配置集配置 pod admittance 策略
- 创建所需的机器配置池
- 部署 NUMA 感知二级调度程序
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。 - 安装 NUMA Resources Operator。
流程
创建
KubeletConfig自定义资源,为机器配置集配置 pod admittance 策略:将以下 YAML 保存到
nro-kubeletconfig.yaml文件中:apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: cnf-worker-tuning spec: machineConfigPoolSelector: matchLabels: cnf-worker-tuning: enabled kubeletConfig: cpuManagerPolicy: "static" 1 cpuManagerReconcilePeriod: "5s" reservedSystemCPUs: "0,1" memoryManagerPolicy: "Static" 2 evictionHard: memory.available: "100Mi" kubeReserved: memory: "512Mi" reservedMemory: - numaNode: 0 limits: memory: "1124Mi" systemReserved: memory: "512Mi" topologyManagerPolicy: "single-numa-node" 3 topologyManagerScope: "pod"运行以下命令来创建
KubeletConfig自定义资源 (CR):$ oc create -f nro-kubeletconfig.yaml
创建
NUMAResourcesScheduler自定义资源来部署 NUMA 感知自定义 pod 调度程序:将以下 YAML 保存到
nro-scheduler.yaml文件中:apiVersion: nodetopology.openshift.io/v1 kind: NUMAResourcesScheduler metadata: name: numaresourcesscheduler spec: imageSpec: "registry.redhat.io/openshift4/noderesourcetopology-scheduler-container-rhel8:v4.13" cacheResyncPeriod: "5s" 1- 1
- 为调度程序缓存同步输入间隔值(以秒为单位)。值
5s通常用于大多数实现。
注意-
启用
cacheResyncPeriod规格,以帮助 NUMA Resource Operator 通过监控节点上的待处理资源,并在调度程序缓存中同步此信息,以帮助 NUMA Resource Operator 报告更准确的资源可用性。这也有助于减少Topology Affinity Error错误,因为未优化调度决策。网络负载越低的时间间隔。cacheResyncPeriod规格默认禁用。 -
为
NUMAResourcesOperatorCR 中的podsFingerprinting规格设置Enabled值是cacheResyncPeriod规格的实施要求。
运行以下命令来创建
NUMAResourcesSchedulerCR:$ oc create -f nro-scheduler.yaml
验证
运行以下命令验证所需资源是否已成功部署:
$ oc get all -n openshift-numaresources
输出示例
NAME READY STATUS RESTARTS AGE pod/numaresources-controller-manager-7575848485-bns4s 1/1 Running 0 13m pod/numaresourcesoperator-worker-dvj4n 2/2 Running 0 16m pod/numaresourcesoperator-worker-lcg4t 2/2 Running 0 16m pod/secondary-scheduler-56994cf6cf-7qf4q 1/1 Running 0 16m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/numaresourcesoperator-worker 2 2 2 2 2 node-role.kubernetes.io/worker= 16m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/numaresources-controller-manager 1/1 1 1 13m deployment.apps/secondary-scheduler 1/1 1 1 16m NAME DESIRED CURRENT READY AGE replicaset.apps/numaresources-controller-manager-7575848485 1 1 1 13m replicaset.apps/secondary-scheduler-56994cf6cf 1 1 1 16m
6.4.3. 使用手动性能设置使用 NUMA 感知调度程序调度工作负载
您可以使用 Deployment CR 将工作负载调度到 NUMA 感知调度程序,该 CR 指定处理工作负载的最低所需资源。
以下示例部署使用 NUMA 感知调度示例工作负载。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。 - 安装 NUMA Resources Operator 并部署 NUMA 感知辅助调度程序。
流程
运行以下命令,获取集群中部署的 NUMA 感知调度程序名称:
$ oc get numaresourcesschedulers.nodetopology.openshift.io numaresourcesscheduler -o json | jq '.status.schedulerName'
输出示例
topo-aware-scheduler
创建一个
DeploymentCR,它使用名为topo-aware-scheduler的调度程序,例如:将以下 YAML 保存到
nro-deployment.yaml文件中:apiVersion: apps/v1 kind: Deployment metadata: name: numa-deployment-1 namespace: <namespace> 1 spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: schedulerName: topo-aware-scheduler 2 containers: - name: ctnr image: quay.io/openshifttest/hello-openshift:openshift imagePullPolicy: IfNotPresent resources: limits: memory: "100Mi" cpu: "10" requests: memory: "100Mi" cpu: "10" - name: ctnr2 image: gcr.io/google_containers/pause-amd64:3.0 imagePullPolicy: IfNotPresent resources: limits: memory: "100Mi" cpu: "8" requests: memory: "100Mi" cpu: "8"
运行以下命令来创建
DeploymentCR:$ oc create -f nro-deployment.yaml
验证
验证部署是否成功:
$ oc get pods -n openshift-numaresources
输出示例
NAME READY STATUS RESTARTS AGE numa-deployment-1-56954b7b46-pfgw8 2/2 Running 0 129m numaresources-controller-manager-7575848485-bns4s 1/1 Running 0 15h numaresourcesoperator-worker-dvj4n 2/2 Running 0 18h numaresourcesoperator-worker-lcg4t 2/2 Running 0 16h secondary-scheduler-56994cf6cf-7qf4q 1/1 Running 0 18h
运行以下命令,验证
topo-aware-scheduler是否在调度部署的 pod:$ oc describe pod numa-deployment-1-56954b7b46-pfgw8 -n openshift-numaresources
输出示例
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 130m topo-aware-scheduler Successfully assigned openshift-numaresources/numa-deployment-1-56954b7b46-pfgw8 to compute-0.example.com
注意请求的资源超过可用于调度的部署将失败,并显示
MinimumReplicasUnavailable错误。当所需资源可用时,部署会成功。Pod 会一直处于Pending状态,直到所需资源可用。验证是否为节点列出了预期的分配资源。
运行以下命令识别运行部署 pod 的节点,将 <namespace> 替换为您在
DeploymentCR 中指定的命名空间:$ oc get pods -n <namespace> -o wide
输出示例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES numa-deployment-1-65684f8fcc-bw4bw 0/2 Running 0 82m 10.128.2.50 worker-0 <none> <none>
运行以下命令,将 <node_name> 替换为运行部署 pod 的该节点的名称:
$ oc describe noderesourcetopologies.topology.node.k8s.io <node_name>
输出示例
... Zones: Costs: Name: node-0 Value: 10 Name: node-1 Value: 21 Name: node-0 Resources: Allocatable: 39 Available: 21 1 Capacity: 40 Name: cpu Allocatable: 6442450944 Available: 6442450944 Capacity: 6442450944 Name: hugepages-1Gi Allocatable: 134217728 Available: 134217728 Capacity: 134217728 Name: hugepages-2Mi Allocatable: 262415904768 Available: 262206189568 Capacity: 270146007040 Name: memory Type: Node- 1
- 由于已分配给有保证 pod 的资源,
可用的容量会减少。
通过保证 pod 使用的资源从
noderesourcetopologies.topology.node.k8s.io中列出的可用节点资源中减去。
对具有
Best-effort或Burstable服务质量 (qosClass) 的pod 的资源分配不会反映在noderesourcetopologies.topology.node.k8s.io下的 NUMA 节点资源中。如果 pod 消耗的资源没有反映在节点资源计算中,请验证 pod 的Guaranteed具有qosClass,且 CPU 请求是一个整数值,而不是十进制值。您可以运行以下命令来验证 pod 是否具有Guaranteed的qosClass:$ oc get pod <pod_name> -n <pod_namespace> -o jsonpath="{ .status.qosClass }"输出示例
Guaranteed