Kubernetes-调度器 (三)-volcano 调度器

1  背景介绍

kubernetes原生调度器是基于单pod调度的,而大数据和机器学习场景中的一个任务往往需要并行运行多pod来完成,多个 pod 之间需要同步信息来执行复杂的并行算法,单个 pod 无法完成全部计算任务。

最出名的batch作业的例子应该是spark的 "driver-executor模式" 了。正是由于作业的这种属性,对作业调度平台也提出了相应的调度要求。比如spark任务需要同时运行driver和executor,TensorFlow任务需要同时运行ps和worker。

file
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对任务提供丰富的调度能力。

file

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

file

当各种工作负载提交后,会自动生成podgroup,podgroup的信息会被收集到volcano-scheduler的cache中作为调度这个作业所需要参考的信息。接着volcano-scheduler根据作业信息调度这个作业中的pod。

file


相关文章:
Kubernetes-调度器(三)-volcano调度器

为者常成,行者常至