volcano调度器源代码走读plugins篇
Gang
简介
Gang调度策略是volcano-scheduler的核心调度算法之一,它满足了调度过程中的“All or nothing”的调度需求,避免Pod的任意调度导致集群资源的浪费。具体算法是,观察Job下的Pod已调度数量是否满足了最小运行数量,当Job的最小运行数量得到满足时,为Job下的所有Pod执行调度动作,否则,不执行。
场景
基于容器组概念的Gang调度算法十分适合需要多进程协作的场景。AI场景往往包含复杂的流程,Data Ingestion、Data Analysts、Data Splitting、Trainer、Serving、Logging等,需要一组容器进行协同工作,就很适合基于容器组的Gang调度策略。MPI计算框架下的多线程并行计算通信场景,由于需要主从进程协同工作,也非常适合使用Gang调度策略。容器组下的容器高度相关也可能存在资源争抢,整体调度分配,能够有效解决死锁。
在集群资源不足的场景下,gang的调度策略对于集群资源的利用率的提升是非常明显的。
Binpack
简介
binpack调度算法的目标是尽量把已有的节点填满(尽量不往空白节点分配)。具体实现上,binpack调度算法是给可以投递的节点打分,分数越高表示节点的资源利用率越高。binpack算法能够尽可能填满节点,将应用负载靠拢在部分节点,这非常有利于K8S集群节点的自动扩缩容功能。
Binpack算法以插件的形式,注入到volcano-scheduler调度过程中,将会应用在Pod优选节点的阶段。Volcano-scheduler在计算binpack算法时,会考虑Pod请求的各种资源,并根据各种资源所配置的权重做平均。每种资源在节点分值计算过程中的权重并不一样,这取决于管理员为每种资源配置的权重值。同时不同的插件在计算节点分数时,也需要分配不同的权重,scheduler也为binpack插件设置了分数权重。
场景
binpack算法对能够尽可能填满节点的小作业有利。例如大数据场景下的单次查询作业、电商秒杀场景订单生成、AI场景的单次识别作业以及互联网高并发的服务场景等。这种调度算法能够尽可能减小节点内的碎片,在空闲的机器上为申请了更大资源请求的Pod预留足够的资源空间,使集群下空闲资源得到最大化的利用。
Priority
简介
Priority plugin提供了job、task排序的实现,以及计算牺牲作业的函数preemptableFn。job的排序根据priorityClassName,task的排序依次根据priorityClassName、createTime、id。
场景
当集群运行了多个Job,但资源不足,并且每个Job下有不等数量的Pod等待被调度的时候,如果使用Kubernetes默认调度器,那么最终,具有更多Pod数量的Job将分得更多的集群资源。在这种情况下,volcano-scheduler提供算法支持不同的Job以fair-share的形式共享集群资源。
Priority plugin能够让用户自定义job、task优先级,根据自己的需求在不同层次来定制调度策略。根据job的priorityClassName在应用层面进行优先级排序,例如集群中有金融场景、物联网监控场景等需要较高实时性的应用,Priority plugin能够保证其优先得到调度。
DRF
简介
DRF调度算法的全称是Dominant Resource Fairness,是基于容器组Domaint Resource的调度算法。volcano-scheduler观察每个Job请求的主导资源,并将其作为对集群资源使用的一种度量,根据Job的主导资源,计算Job的share值,在调度的过程中,具有较低share值的Job将具有更高的调度优先级。这样能够满足更多的作业,不会因为一个胖业务,饿死大批小业务。DRF调度算法能够确保在多种类型资源共存的环境下,尽可能满足分配的公平原则。
场景
DRF调度算法优先考虑集群中业务的吞吐量,适用单次AI训练、单次大数据计算以及查询等批处理小业务场景。
Proportion
简介
Proportion调度算法是使用queue的概念,用来控制集群总资源的分配比例。每一个queue分配到的集群资源比例是一定的。举例来说,有3个团队,共享一个集群上的资源池:A团队最多使用总集群的40%,B团队最多使用30%,C团队最多使用30%。如果投递的作业量超过团队最大可用资源,就需要排队。
场景
Proportion调度算法为集群的调度带来了弹性、灵活性上面的提升。最典型的场景就是在一个公司的多个开发团队,共用一个集群的时候,这种调度算法能够很好的处理不同部门之间的共享资源配比和隔离的需求。在多业务混合场景,如计算密集型的AI业务,网络IO密集型的MPI、HPC业务,存储密集型的大数据业务,Proportion调度算法通过配比,能很好的按需分配共享资源。
Task-topology
简介
Task-topology算法是一种根据Job内task之间亲和性和反亲和性配置计算task优先级和Node优先级的算法。通过在Job内配置task之间的亲和性和反亲和性策略,并使用task-topology算法,可优先将具有亲和性配置的task调度到同一个节点上,将具有反亲和性配置的Pod调度到不同的节点上。
场景
node affinity:
- Task-topology对于提升深度学习计算场景下的计算效率非常重要。以TensorFlow计算为例,配置“ps”和“worker”之间的亲和性。Task-topology算法,可使“ps”和“worker”尽量调度到同一台节点上,从而提升“ps”和“worker”之间进行网络和数据交互的效率,进而提升计算效率。
- HPC、MPI场景下task之间具有高度同步性,需要高速的网络IO。
Anti-affinity:
- 以TensorFlow计算为例,“ps”与“ps”之间的反亲和性。
- 电商服务场景的主从备份,数据容灾,保证一个作业挂掉之后有备用作业继续提供服务。
Predicates
简介
Predicate plugin通过pod、nodeInfo作为参数,调用predicateGPU,根据计算结果对作业进行评估预选。
场景
在AI的应用场景下,GPU资源是必需,Predicate plugin可以快速筛选出来需要GPU的进行集中调度。
Nodeorder
简介
Nodeorder plugin是一种调度优选策略:通过模拟分配从各个维度为node打分,找到最适合当前作业的node。打分参数由用户来配置。参数包含了Affinity、reqResource,、LeastReqResource、MostReqResource、balanceReqResouce。
场景
Nodeorder plugin给调度提供了多个维度的打分标准,不同维度的组合,能够让用户根据自身需求灵活的配置合适的调度策略。
Conformance
简介
Conformance plugin会筛选牺牲页,使命名空间是kube-system的作业不能被驱逐。其能确保系统的关键资源不会被强制回收使用。
场景
Conformance plugin能够保护在kube-system命名空间下的业务,这些业务是整个集群正常运行的保障。用户也可以根据其提供的模版,用于保护一些特定命名空间下的业务,使其不被抢占。
Reservation
简介
资源预留算法,包含以下几个核心的方面:
-
节点选取:规格优先/空闲优先
1.规格优先是指是指集群中所有节点按照主要规格(目标作业申请资源规格)进行降序排序,选取前N个节点纳入节点组,这N个节点的资源总量满足申请量。在volcano的实现中使用的是规格优先。
2.空闲优先是指集群中所有节点按照主要资源类型(目标作业申请资源类型)的空闲资源量进行降序排序,选取前N个节点纳入节点组,这N个节点的资源总量满足申请量。
-
节点数量:为了尽可能减少锁定操作对调度器综合性能的影响,在满足预留资源申请量的前提下,无论采用哪种节点选取算法,都应保证所选节点数最少。
-
锁定方式
锁定方式有单节点、多节点、集群锁定三种实现方式。volcano的实现方式是单节点锁定。锁定已有负载锁定节点已有负载的处理手段有两种:抢占式预留、非抢占式预留。顾名思义,抢占式预留将会强制驱逐锁定节点上的已有负载。这种方式可以保证最快腾出所需的资源申请量,但会对已有业务造成重大影响,因此仅适用于紧急任务的资源预留。非抢占式预留则在节点锁定后不做任何处理,等待运行在其上的负载自行结束。v1.1.0采用的是非抢占式预留。
场景
规格优先的选取方式的优点是实现简单、锁定节点数量最小化、对目标作业的调度友好。这种方式锁定的资源总量往往比申请总量大一些,且作业中各Pod容易聚集调度在锁定节点,有利于Pod间通信等。缺点是锁定资源总量大概率不是最优解、综合调度性能损失(吞吐量、调度时长)、易产生大资源碎片。
参考:
1.http://weekly.dockone.io/article/9538
2.https://www.infoq.cn/article/FWsOGCzTqPBSiK9fO6JH