容器服务支持基于 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 -o wide
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
使用 NUMA 拓扑感知调度能力后,若后续涉及依赖组件的升级,请仔细阅读组件升级影响,例如:
katalyst 组件从 v0.3.5-vke.5 升级到 v0.5.x 及以上版本后,需要变更组件关联节点池的 kubelet 自定义参数。详细操作,请参见 FAQ。