调度概述

在Kubernetes集群中,调度(Scheduling)过程具体是指调度器组件(kube-scheduler)根据集群整体资源情况,将待运行的Pod分配到合适的节点上。由于ACS集群以虚拟节点的形式提供资源,因此您无需考虑复杂的资源分配策略,只需专注于应用的编排规则即可。本文介绍ACS集群中常用调度能力的使用方法和注意事项。

Kubernetes原生调度策略

Kubernetes原生调度器提供了多种的调度插件,在ACS的虚拟节点中,您只需关注亲和性相关策略,来保证应用的性能和高可用场景,具体包括可用区拓扑打散、节点亲和性、Pod间亲和性。

功能

策略说明

参考文档

可用区拓扑打散

通过在拓扑分布约束协议字段TopologyKey中指定虚拟节点的标签,实现对工作负载的可用区打散能力。

可用区拓扑打散

节点亲和性

虚拟节点以label的形式标记了各类属性,例如可用区。通过在nodeSelector等字段中描述亲和性需求,可以将应用运行在特定属性的虚拟节点上。

节点亲和性调度

Pod间亲和性

用于表达Pod之间的亲和性偏好,相较于节点亲和性,Pod间亲和性调度支持基于已经在虚拟节点上运行的Pod的标签来约束Pod可以调度到的范围。通过在podAffinity等字段中描述亲和性需求,可以将Pod调度到指定的拓扑域。

Pod间亲和性调度

自定义资源优先级调度

功能

策略说明

典型场景

参考文档

自定义资源优先级调度

支持为Pod同时指定多种Compute Class或Compute QoS,调度器将在库存不足时自动尝试生产其他类型的Pod实例。

应用要求优先使用某一类型应用,例如计算任务希望优先使用性价比更优的best-effort型实例。

自定义资源优先级调度

任务调度

K8s集群中,任务型应用的申请资源需求更为多样,例如AI训练任务会要求保障一组Pod都可以同时申请到资源,在应用较多的集群内还会有资源容量管理的需求,ACS针对任务型应用提供了以下调度能力。

功能

策略说明

典型场景

参考文档

Gang scheduling

要求在调度时按照一组Pod整批分配资源,确保这组Pod都可以同时申请到资源,当无法满足时,这组Pod应都集体处于Pending状态。

高性能计算、AI训练等任务,应用需要所有副本都启动才能运行,如MPI任务。

使用Gang Scheduling

Capacity Scheduling

允许集群为特定的命名空间设定资源容量限制。

多个用户或应用共享集群,需要按命名空间限制资源使用。

使用Capacity Scheduling