在ACK集群中,企业可以通过AI套件中的任务管理工具Arena、队列调度管理系统Kube Queue、配额管理工具ElasticQuotaTree以及Prometheus监控打造企业级任务调度系统。本文将从实际案例出发自底而上地介绍如何基于ACK集群构建一个任务调度系统。
背景介绍
批处理任务(Batch Job)常应用于数据处理、仿真计算、科学计算和人工智能等领域,主要用于执行一次数据处理或模型训练任务。由于这类任务往往需要消耗大量计算资源,因此必须根据任务的优先级和提交者的可用资源情况进行合理排队,才能最大化集群资源的利用效率。为了解决批处理任务的调度问题,企业需要自上而下地解决任务管理、配额管理、任务调度、用户隔离、日志收集、集群监控、资源供给等多方面问题。
为解决以上问题,您可以使用ACK集群来管理大规模集群的管理系统,其较为完善的生态为企业打造大规模任务调度系统扫清了障碍,简化了企业集群管理系统搭建的流程。
用户角色
企业的任务调度系统中通常有两类角色,分别为提交任务的开发人员以及任务调度系统的运维人员。开发人员和运维人员对任务调度系统的需求有所区别。
角色类型 |
说明 |
开发人员 |
专注于自身的业务领域,对任务调度系统使用的Kubernetes系统可能并不熟悉,日常对系统的操作仅为提交任务,因此只需能够简化提交任务流程的工具,并且在提交完任务后,需要能够方便地查看任务的运行时日志以进行Bug修复。 |
运维人员 |
对Kubernetes系统较为熟悉,而对具体的业务领域并不熟悉,需要进行系统的维护并为用户提供高效可靠的任务调度系统,因此需要对Kubernetes集群进行整体的监控。 |
实际使用场景中,开发人员很有可能来自于公司的不同部门,这些不同的部门内部有着自己的任务优先级定义规则,不同部门之间的任务优先级没有关联或关联不大,因此需要将不同部门的任务单独进行排队。
同时,公司内部的可用资源是有限的,为了将资源倾斜给更重要的项目,这些部门的资源配额通常是互不相同。这些资源是受保障资源,只在这些部门的资源配额空闲时允许其他部门临时借用资源运行自己的任务。当集群整体资源紧张时,保障资源的拥有者有权主动驱逐借用资源的部门的任务。
实现原理
如下图所示,企业内部有两个部门:Department-a和Department-b。Department-a有两名员工(User-a和User-b),Department-b有一名员工(User-c)。企业在ACK上构建任务调度系统的过程为:
-
首先,运维人员需要创建一个ACK集群,并在ACK集群中安装队列调度系统Kube Queue、Prometheus监控以及Arena组件。
-
Kube Queue可以帮助企业有效地管理大量并发任务,确保资源的合理分配。Kube Queue通过监听ElasticQuotaTree自动为配额生成对应的任务队列,共享同一个配额的任务会一起进行排队。
-
Prometheus监控提供了实时监控能力,使运维人员能够快速识别并诊断集群中潜在的问题,保证任务调度系统的稳定性和资源利用率。
-
Arena组件可以简化GPU资源的申请、任务提交、监控等流程。
-
-
然后,运维人员再对ElasticQuotaTree以及ResourcePolicy进行配置。
-
ElasticQuotaTree是一种弹性配额管理机制。通过对Department-a和Department-b分别设定合理的配额,可以确保各部门在共享集群资源时互不影响,避免资源争抢或浪费。
-
ResourcePolicy定义了资源的使用规则和优先级,通过该方式实现当ECS资源耗尽时将Pod调度到Virtual Node上,触发ECI实例的创建和运行,从而保持整体资源使用的均衡和效率。
-
-
最后,开发人员可以通过企业的任务提交平台提交任务或通过ACK AI套件的开发控制台提交任务。
</