ACK Scheduler是ACK基于Kubernetes Scheduling Framework扩展机制,针对不同任务负载、不同弹性资源的统一调度系统。ACK Scheduler支持不同弹性资源的混合调度、异构资源的精细化调度、批量计算的任务调度等,提升应用的性能和集群整体资源的利用率。本文介绍弹性调度、任务调度、异构资源调度、负载感知调度和精细化调度的主要功能。
弹性调度
ACK为不同弹性资源提供了混合调度的能力。
功能 | 描述 | 参考文档 |
弹性调度 | 阿里云提供了不同种类的弹性资源,如ECS和ECI,以及不同的付费类型如包年包月、按量付费和抢占实例等。 弹性调度提供差异化调度ECS和ECI资源的能力,支持自定义弹性资源优先级调度策略。在应用发布或扩容过程中,按照自定义资源策略,设置应用实例Pod被调度到不同类型节点资源的顺序。同时在缩容过程中按照原调度顺序逆序缩容。 例如在扩容过程中,优先使用已有资源池中的ECS资源,当ECS资源分配完之后,再使用ECI资源。当应用缩容时,可以优先缩容ECI节点,在提升效率的同时降低您的使用成本。 |
任务调度
ACK为批量计算的任务提供了Gang scheduling、Capacity Scheduling和ack-kube-queue。
功能 | 描述 | 参考文档 |
Gang scheduling | All-or-Nothing作业要求所有的任务在同一时间被调度,如果只是部分任务启动的话,启动的任务将持续等待剩余的任务被调度。在极端情况下,所有作业都处于挂起状态,从而导致死锁。 为了解决这个问题,阿里云提供Gang Scheduling功能,保障所有相关联的进程能够同时启动,防止因部分进程的异常而导致整个关联进程组的阻塞的问题。 | |
Capacity Scheduling | 当集群中有多个用户时,通过Kubernetes原生的ResourceQuota方式进行固定资源分配,因为不同的用户使用资源的周期和方式不同,会造成集群的整体资源利用率较低。 ACK借鉴Yarn Capacity Scheduling的设计思路,基于Scheduling Framework的扩展机制,在调度侧通过引入弹性配额组,实现Capacity Scheduling功能,在确保用户资源分配的基础上,通过资源共享的方式来提升集群的整体资源利用率。 | |
Kube Queue | 调度器以Pod为单位进行调度。当集群中任务类型的工作负载数量多时,会导致Pod对调度器的运行速率影响较大,并且不同用户提交的作业之间存在相互影响。 任务队列ack-kube-queue旨在管理Kubernetes中的AI/ML工作负载和批处理工作负载。允许系统管理员使用自定义队列的作业队列管理,以提高队列的灵活性。结合Quota系统,ack-kube-queue自动优化了工作负载和资源配额管理,以便最大化利用集群资源。 |
异构资源调度
ACK为CPU、GPU等异构资源提供了GPU共享调度、GPU/CPU拓扑感知调度等能力。
功能 | 描述 | 参考文档 |
共享GPU调度 | GPU共享调度可以降低使用GPU的经济成本,保障程序运行的稳定性。 ACK Pro版集群支持以下GPU设备分配策略:
| |
GPU/CPU拓扑感知调度 | 调度器基于节点异构资源的拓扑信息,如GPU卡之间的NVLink、PcleSwitch等通信方式、CPU的NUMA拓扑结构等,在集群维度进行最佳的调度选择,为工作负载提供更好的性能。 | |
FPGA调度 | 在进行FPGA计算时,通过Kubernetes集群将FPGA设备进行统一管理。根据应用的需求,将资源调度到具有FPGA设备的节点上。 |
负载感知调度
ACK提供了基于节点负载感知的调度策略,提供负载热点打散重调度能力。
功能 | 描述 | 参考文档 |
负载感知调度 | 在调度过程中,通过参考节点负载的历史统计,将Pod优先调度到负载较低的节点,实现节点负载均衡的目标,避免出现因单个节点负载过高而导致的应用程序或节点故障。 | |
使用负载热点打散重调度 | ack-koordinator组件提供负载热点打散重调度能力,可以感知集群内节点负载的变化,自动地优化超过负载水位安全阈值的节点,防止出现负载极端不均衡的情况。 |
精细化调度
ACK为特定的应用提供了精细化的调度策略,如资源规格智能推荐、动态资源超卖等。
功能 | 描述 | 参考文档 |
资源规格智能推荐 | 提供资源画像能力,实现容器粒度的资源规格推荐,降低容器配置的复杂度。 | |
动态资源超卖 | 通过对节点负载数据的实时收集,充分挖掘集群中已分配但未使用的资源量,提升集群资源利用率。 | |
弹性资源限制 | 通过动态控制不同优先级的负载资源使用量及资源水位,提升负载的运行效率。 | |
容器CPU Qos | 基于容器的Qos等级,优先保障高优先级应用的CPU性能。 | |
容器内存Qos | 在确保内存资源公平性的前提下,改善应用在运行时的内存性能。 | |
容器L3 Cache及内存带宽隔离 | 通过控制L3 cache和MBA,对不同优先级的任务进行隔离,在保障高优先级任务QoS的前提下,提高资源利用率。 | |
容器资源参数动态修改 | 在不重启Pod的情况下,动态修改Pod的CPU、内存等资源。在保障业务稳定的前提下,提高资源利用率。 | |
多NUMA机型的容器内存就近访问加速 | ack-koordinator以数据安全的方式将绑核应用远端NUMA上的内存迁移至本地,提高本地访存命中率,为内存密集型的工作负载提供更好的访存性能。 | |
虚拟交换机剩余IP状态感知调度 | 原生Kubernetes集群调度器对节点所属虚拟交换机是否有剩余IP不感知。在多个集群同时使用同一个虚拟交换机或多个节点同时使用同一个虚拟交换机时,可能出现Pod调度到节点上后由于虚拟交换机可用IP不足启动失败的情况。这种情况下,Pod控制器通常会重建Pod,之后原生Kubernetes集群调度器通常会再次调度Pod到启动失败的节点上,最终在短时间内多次触发IP不足,既影响客户业务部署,也会产生大量告警。容器服务 Kubernetes 版调度器kube-scheduler可以感知节点关联的虚拟交换机IP不足的状态,并暂停后续Pod向该节点上调度。 |