概念
操作对象(CR)
- VolcanoJob
用户创建的一个训练任务,一个完整的训练任务可以包含若干子任务,它们由若干pod来执行。
区别于k8s的Job资源类型,VolcanoJob更适合机器学习等AI训练任务,更关注资源的声明和使用。
以下是来自volcano官网的一个VolcanoJob示例:
```yaml
apiVersion: batch.volcano.sh/v1alpha1
kind: Job  # 资源类型
metadata:
name: job-1
spec:
minAvailable: 1
schedulerName: volcano # 指明volcano调度器
queue: test # 指明运行训练任务的队列
policies:
   - event: PodEvicted
      action: RestartJob
tasks:
   - replicas: 1
      name: nginx
      policies:
      - event: TaskCompleted
      action: CompleteJob
      template:
      spec:
         containers:
            - command:
            - sleep
            - 10m
            image: nginx:latest
            name: nginx
            resources:
               requests:
                  cpu: 1
               limits:
                  cpu: 1
         restartPolicy: Never
```
- 
PodGroup Volcano controller会监听 VolcanoJob资源对象,之后创建一个对应的PodGroup后进入调度流程。PodGroup是实际volcano调度的对象。
Queue
Queue是容纳一组PodGroup的队列,也是该组PodGroup获取集群资源的划分依据。
```yaml
apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue # 资源类型
metadata:
name: test # 队列名称
spec:
weight: 1
reclaimable: false
capability: # 声明资源的可用量
   cpu: 2
```
Actions 调度阶段
Actions是调度的不同阶段。
- 
Enqueue 入队 
对session中的job进行入队(volcano调度用的优先队列),将入队的job设置为inqueue状态。
- 
Allocate 分配 
对应k8s调度的预选+优选过程。
- 
(Reclaim) 资源回收 
当存在pending task的Job时,Reclaim Action会计算集群节点中可回收的资源,将这部分任务驱逐、资源回收后,满足高优先级的Job。
实现抢占的几个条件:
- 
队列条件: a. 可被抢占队列的 spec 设置 reclaimable = true b. (非必须)可被抢占队列的 allocated 全部资源大于 deserved(在proportion插件的ReclaimableFn函数中) 
- 
任务条件: a. 可被抢占的 pod 需要 running b. 可被抢占的 pod 的 reclaim annotation 不能为 false(默认是 true) c. (非必须)可被抢占的 pod 数量大于 MinAvailable(在gang插件的preemptableFn/ReclaimableFn函数中) 
- 
(Backfill) 
处理待调度Pod列表中没有指明资源申请量的Pod调度。
插件Plugins/Tiers
volcano通过优先队列实现对不同资源(job、task)的调度排序,插件为优先队列提供“比较函数(lessFn/OrderFn)”,从而影响资源的调度顺序。