背景

volcano的前身是kube-batch,Kube-batch的知识参考之前的博客。

volcano的结构

image1

volcano主要分为两个部分:

(1) Volcano-Scheduler:

(2) Volcano-Controller

使用volcano的流程一般如下:

  1. 用户通过kubectl创建Volcano Job资源。
  2. Volcano Controller监测到Job资源创建,校验资源有效性,依据JobSpec创建依赖的Pod, Service, ConfigMap等资源,执行配置的插件。
  3. Volcano Scheduler监听Pod资源的创建,依据策略,完成Pod资源的调度和绑定。
  4. Kubelet负责Pod资源的创建,业务开始执行。
  5. Volcano Controller负责Job后续的生命周期管理(状态监控,事件响应,资源清理等)

volcano-Scheduler

这个组件其实就是Kube-Batch,但是它相比kube-batch增加了一些东西。具体是:

(1)增加了一个action,enqueue

Kube-batch中待调度作业的状态只有两种,pending 和 runing。每次调度时都要从pending作业中选取作业调度,但实际上有些作业一直是资源不够,处于pending状态。这样每次调度都重复浪费资源。

为了解决这个情况,Volcano增加了一个新的状态,InQueue。代表某个作业有足够的资源能被调度。然后真正调度时候,调度器从InQueue=true的作业中调度。

(2)增加了一个Plugin, binpack

Binpack就是给各个可以绑定的节点打分:“假如放在当前节点后,谁更满,谁的分数就高”。

可能还有其他增加的内容,待补充。。

volcano-control

control主要起到作业控制的功能。主要作用如下:

(1)自定义的Job资源: 跟K8s内置的Job(作业)资源相比,Volcano Job有了更多增强配置,比如:任务配置,提交重试,最小调度资源数,作业优先级, 资源队列等。

(2)Job 生命周期管理 : Volcano Controller会监控Job的创建,创建和管理对应的子资源(Pod, ConfigMap, Service),刷新作业的进度概要,提供CLI方便用户查看和管理作业资源等。

(3)任务执行策略: 单个Job下面往往会关联多个任务(Task),而且任务之间可能存在相互依赖关系,Volcano Controller支持配置任务策略,方便异常情况下的任务间关联性重试或终止。

(4)扩展插件: 在提交作业、创建Pod等多个阶段,Controller支持配置插件用来执行自定义的环境准备和清理的工作,比如常见的MPI作业,在提交前就需要配置SSH插件,用来完成Pod资源的SSH信息配置。

vkctl

vkctl是volcano提供的命令工具,可以创建,查看任务等等。例如查看任务:

image-20191202173516058

可见,还是很方便的。

参考:

https://volcano.sh/

https://github.com/volcano-sh/volcano