Kubernetes-调度器 (三)-volcano 调度器
1 背景介绍
kubernetes原生调度器是基于单pod调度的,而大数据和机器学习场景中的一个任务往往需要并行运行多pod来完成,多个 pod 之间需要同步信息来执行复杂的并行算法,单个 pod 无法完成全部计算任务。
最出名的batch作业的例子应该是spark的 "driver-executor模式" 了。正是由于作业的这种属性,对作业调度平台也提出了相应的调度要求。比如spark任务需要同时运行driver和executor,TensorFlow任务需要同时运行ps和worker。
spark on kubernetes 场景,需要同时运行driver 和 executor
原生的调度器在处理batch任务时,作业之间可能造成死锁(两个任务都占用了部分资源,但两个任务都不能完全调度)。
Volcano正是针对batch任务调度而生的。目前volcanoVolcano是CNCF下唯一的基于Kubernetes的容器批量计算平台,已被广泛使用。
volcano-scheduler中的Gang调度算法,它实现了batch任务的子pod调度过程中 "全部调度" or "全都不调度" 的能力。避免了pod的任意调度造成的死锁和资源浪费。
2 架构
Volcano 核心组件主要包含三个:Admission、ControllerManager、Scheduler 。
- Admission对Volcano CRD API提供校验能力
- ControllerManager负责对Volcano CRD进行资源管理
- Scheduler对任务提供丰富的调度能力。
3 Volcano-CRD介绍
3.1 PodGroup
PodGroup定义一组强关联的pod。例如Tensorflow批处理场景中的ps-pod和worker-pod都属于同一个podgroup。
PodGroup.yaml示例:
apiVersion: scheduling.volcano.sh/v1beta1
kind: PodGroup
metadata:
name: test
namespace: default
spec:
minMember: 1 ## 被gang插件使用,表示该podgroup下最少需要运行的pod数量。如果集群资源不满足miniMember数量的pod运行,调度器将不会调度任何一个该podgroup内的pod。
minResources: ## minResources表示运行该podgroup所需要的最少资源。当集群可分配资源不满足minResources时,调度器将不会调度任何一个该podgroup内的pod。
cpu: "3"
memory: "2048Mi"
priorityClassName: high-prority
queue: default ## queue表示该podgroup所属的queue。queue必须提前已创建且状态为open。 作者:BeijingToTokyo https://www.bilibili.com/read/cv30091921/ 出处:bilibili
当各种工作负载提交后,会自动生成podgroup,podgroup的信息会被收集到volcano-scheduler的cache中作为调度这个作业所需要参考的信息。接着volcano-scheduler根据作业信息调度这个作业中的pod。
相关文章:
Kubernetes-调度器(三)-volcano调度器
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)