容器服务支持基于 Katalyst 增强 Kubernetes 资源管理能力,提升资源利用率,降低成本,提升负载的性能。
说明
【邀测·申请试用】:该功能目前处于邀测阶段。如需使用,请提交申请。
在搜广推、游戏、AI 分布式训练等业务场景下,用户对时延的敏感性较高,对容器在微拓扑级别的摆放方式存在要求。原生 Kubernetes 的微拓扑管理能力存在一些局限。因此容器服务基于 Katalyst 实现了 NUMA(Non-Uniform Memory Access,非统一内存访问架构)拓扑感知调度功能。
推荐使用拓扑感知调度功能的场景如下:
使用该功能时,有如下限制和须知事项:
说明
VKE 当前在调度时仅支持 single-numa-node 策略,容器(Container)级别亲和。
该功能依赖 VKE 的 scheduler-plugin 组件、katalyst 组件,因此需要安装和配置该两个组件。
...
> 安装,并勾选 拓扑感知调度 特性开关并勾选 CPU 资源管理类型。vke.node.katalyst.deploy
,Value 为true
。注意
您可以通过开启或关闭节点池的 节点标签及污点自动更新 功能,控制是否同步标签到节点池中的存量节点。关闭该功能时,可能导致存量节点上无法实现拓扑感知调度,请谨慎配置。
下文以创建无状态负载(Deployment)为例,更多工作负载相关操作,请参见 工作负载。
说明
关于工作负载中使用的容器镜像,您可以参考镜像仓库的 推送和拉取镜像 文档内容,提前上传镜像到火山引擎镜像仓库中,也可以直接使用您自己准备的第三方镜像。
vke.node.katalyst.deploy
In
true
。下文以使用公网镜像创建 Pod 为例,演示拓扑感知调度情况。更多业务应用相关 Pod 或工作负载的介绍以及创建方法,请参见 工作负载。
test-topo.yaml
代码如下:apiVersion: v1 kind: Pod metadata: name: test-topo # Pod 名称。 namespace: default # Pod 所属命名空间。 spec: affinity: # Pod 亲和性调度。 nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: # Pod 亲和性调度选择器。 - key: vke.node.katalyst.deploy operator: In values: - "true" containers: # Pod 的容器配置。 - image: redis # Pod 的容器镜像,可替换为您自己的容器镜像。若使用公网镜像,请确保您的集群能够访问公网。 name: redis resources: limits: cpu: "63" memory: 10Gi requests: cpu: "63" memory: 10Gi
kubectl apply -f topo-pod.yaml
预期输出结果:kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES test-topo 1/1 Running 0 3m11s 192.168.16.24 192.168.16.18 <none> <none>
执行如下命令,查看 Pod 被调度到的节点对应的 CustomNodeResource 资源。
kubectl get kcnr -o yaml 192.168.16.18
说明
将192.168.16.18
替换为您自己节点的 IP 地址。
预期输出如下,Pod 已被调度到该节点,满足 single-numa-node 策略。
apiVersion: node.katalyst.kubewharf.io/v1alpha1 kind: CustomNodeResource metadata: creationTimestamp: "2023-08-18T07:16:46Z" generation: 1 labels: beta.kubernetes.io/arch: amd64 beta.kubernetes.io/instance-type: ecs.ebmhfc2i.32xlarge beta.kubernetes.io/os: linux cluster.vke.volcengine.com/cluster-name: ccjev51m5kpqf******** # 集群 ID。 cluster.vke.volcengine.com/machine-name: ncjfhjso70bf9******** # 节点 ID。 cluster.vke.volcengine.com/machinepool-name: pcjfhjpc3bo2l******** # 节点所属节点池 ID。 cluster.vke.volcengine.com/machinepool-type: machine-pool cluster.vke.volcengine.com/node-name: node-bhp929 # 节点池名称。 failure-domain.beta.kubernetes.io/region: cn-beijing # 节点池/节点所在地域。 failure-domain.beta.kubernetes.io/zone: cn-beijing-a # 节点池/节点所在可用区。 kubernetes.io/arch: amd64 kubernetes.io/hostname: 192.168.16.18 # 节点 IP 地址。 kubernetes.io/os: linux node.kubernetes.io/instance-type: ecs.ebmhfc2i.32xlarge topology.kubernetes.io/region: cn-beijing # 满足拓扑管理策略的地域。 topology.kubernetes.io/zone: cn-beijing-a # 满足拓扑管理策略的可用区。 vke.node.katalyst.deploy: "true" # 节点是否已开启拓扑感知能力。 name: 192.168.16.18 ownerReferences: - apiVersion: v1 blockOwnerDeletion: true controller: true kind: Node name: 192.168.16.18 uid: ccbaaecb-3e4a-486e-881b-6071******** resourceVersion: "204363" uid: ff26814d-ee52-4c56-b346-6cfa52******** spec: {} status: topologyPolicy: SingleNUMANodeContainerLevel # 拓扑管理策略(此处为 single-numa-node)和资源粒度(此处为 container 级别)。 topologyZone: - children: - name: "0" resources: allocatable: cpu: "61" capacity: cpu: "64" type: Numa name: "0" resources: {} type: Socket - children: - allocations: - consumer: default/test-topo/e0f06c84-d512-43f2-a34f-20c2******** # 被调度的 Pod 所属命名空间/名称/容器 ID。 requests: cpu: "63" name: "1" resources: allocatable: cpu: "64" capacity: cpu: "64" type: Numa name: "1" resources: {} type: Socket