概念
操作对象(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)”,从而影响资源的调度顺序。