Volcano 入门教程
-
- [一、为什么要学 Volcano?](#一、为什么要学 Volcano?)
- [二、Volcano 解决了什么问题?](#二、Volcano 解决了什么问题?)
-
- [1. 分布式任务无法整体调度](#1. 分布式任务无法整体调度)
- [2. 多团队资源不好分配](#2. 多团队资源不好分配)
- [3. AI 训练任务需要更复杂的调度策略](#3. AI 训练任务需要更复杂的调度策略)
- [三、先理解 Volcano 的几个核心概念](#三、先理解 Volcano 的几个核心概念)
- [1. Volcano Scheduler:高级调度器](#1. Volcano Scheduler:高级调度器)
- [2. VolcanoJob:Volcano 自己的 Job 类型](#2. VolcanoJob:Volcano 自己的 Job 类型)
- [3. PodGroup:一组必须一起调度的 Pod](#3. PodGroup:一组必须一起调度的 Pod)
- [4. Queue:队列](#4. Queue:队列)
- [四、Volcano 和 Kubernetes 默认调度器的区别](#四、Volcano 和 Kubernetes 默认调度器的区别)
- [五、Volcano 的典型使用场景](#五、Volcano 的典型使用场景)
-
- [1. AI / 机器学习训练](#1. AI / 机器学习训练)
- [2. 大数据计算](#2. 大数据计算)
- [3. HPC 高性能计算](#3. HPC 高性能计算)
- [4. 多租户 GPU 集群](#4. 多租户 GPU 集群)
- [六、安装 Volcano](#六、安装 Volcano)
- [七、运行第一个 VolcanoJob](#七、运行第一个 VolcanoJob)
- [八、理解这个 YAML](#八、理解这个 YAML)
-
- [1. schedulerName](#1. schedulerName)
- [2. minAvailable](#2. minAvailable)
- [3. queue](#3. queue)
- [4. tasks](#4. tasks)
- [5. policies](#5. policies)
- [九、创建一个自己的 Queue](#九、创建一个自己的 Queue)
- [十、Volcano 最重要的调度思想:Gang Scheduling](#十、Volcano 最重要的调度思想:Gang Scheduling)
- [十一、Volcano 和 KServe 的关系](#十一、Volcano 和 KServe 的关系)
- 十二、我后续的方向:
一、为什么要学 Volcano?
若说:
text
Kubernetes:负责管理容器、Pod、Service、Deployment
KServe:负责把模型服务部署成可访问的推理服务
vLLM:负责高性能运行大模型推理
Volcano:负责更高级的任务调度,尤其适合 AI 训练、大数据、批处理任务
Volcano 不是用来替代 KServe 的,也不是用来替代 vLLM 的。
它更像 Kubernetes 的"高级调度器"。
普通 Kubernetes 调度器更擅长处理普通在线服务,比如 Web 服务、API 服务、Deployment 服务。
但是 AI 训练、大数据计算、分布式任务有一个特点:
text
不是一个 Pod 能跑就行,
而是一组 Pod 必须一起被调度、一起运行、一起完成任务。
比如 PyTorch 分布式训练:
text
Master Pod
Worker Pod 1
Worker Pod 2
Worker Pod 3
如果只启动了 Master,但是 Worker 没有资源启动,那么整个训练任务可能没有意义。
这时候就需要 Volcano 这种批处理调度系统。
一句话总结:
text
Volcano 是 Kubernetes 上专门面向 AI、大数据、HPC、批处理任务的高级调度系统。
二、Volcano 解决了什么问题?
假设你现在有一个 Kubernetes 集群,里面有很多任务:
text
A 同学提交了一个 PyTorch 训练任务,需要 4 个 GPU
B 同学提交了一个 Spark 任务,需要大量 CPU 和内存
C 同学提交了一个普通 Deployment
D 同学提交了一个 Ray 任务
如果全部交给普通 Kubernetes 默认调度器,可能会出现几个问题:
1. 分布式任务无法整体调度
比如一个训练任务需要 4 个 Worker。
普通调度器可能先调度成功 2 个 Pod,另外 2 个 Pod 因为资源不够一直 Pending。
结果就是:
text
部分 Pod 占着资源
但整个训练任务跑不起来
资源被浪费
Volcano 的 Gang Scheduling 可以解决这个问题。
Gang Scheduling 的思想是:
text
要么一组 Pod 都能启动,
要么一个都先别启动。
这就是所谓的 all-or-nothing。
2. 多团队资源不好分配
公司里可能有多个团队共用一个 Kubernetes 集群:
text
算法组
推荐组
搜索组
大模型组
数据平台组
每个组都想用 GPU、CPU、内存。
如果没有队列和资源配额,很容易出现:
text
一个团队把资源全占了
其他团队的任务全部排队
Volcano 的 Queue 可以帮助我们做资源划分。
你可以把 Queue 理解成:
text
任务排队的地方 + 资源分配的边界
比如:
text
ai-queue:给 AI 训练任务
bigdata-queue:给 Spark/Flink 任务
default:普通默认队列
3. AI 训练任务需要更复杂的调度策略
AI 训练任务不只是"找个节点跑起来"这么简单。
它还可能关心:
text
Pod 是否能一起启动
GPU 是否够用
任务优先级
队列资源配额
节点资源利用率
网络拓扑
失败后是否重启
这些就是 Volcano 的价值。
三、先理解 Volcano 的几个核心概念
入门 Volcano,不要一上来就啃源码。
先掌握 4 个概念:
text
Volcano Scheduler
VolcanoJob
PodGroup
Queue
1. Volcano Scheduler:高级调度器
Kubernetes 默认有一个调度器,叫 kube-scheduler。
它的职责是:
text
决定 Pod 应该放到哪个 Node 上运行。
Volcano Scheduler 也是调度器,但它更适合批处理和 AI 任务。
你可以理解成:
text
kube-scheduler:普通调度器
volcano-scheduler:更适合 AI / 大数据 / 批处理任务的调度器
在 YAML 里,如果你想让任务交给 Volcano 调度,通常会看到:
yaml
schedulerName: volcano
这句话的意思是:
text
这个任务不要交给默认调度器,
而是交给 Volcano 调度器。
2. VolcanoJob:Volcano 自己的 Job 类型
Kubernetes 原生有 Job。
但是 Volcano 有自己的 Job,通常叫 VolcanoJob 或 vcjob。
它比普通 Kubernetes Job 更适合复杂批处理任务。
普通 Job 更像:
启动一个或多个 Pod,把任务跑完。
VolcanoJob 更像:
启动一组加粗样式有关联的任务,并且支持队列、优先级、最小可运行数量、失败策略、任务组等高级能力。
一个 VolcanoJob 里面可以有多个 task。
比如:
text
task 1:master
task 2:worker
task 3:evaluator
这对 AI 训练和大数据任务很有用。
3. PodGroup:一组必须一起调度的 Pod
PodGroup 是理解 Volcano 的关键。
你可以把 PodGroup 理解成:
一组强相关 Pod 的集合。
比如分布式训练里:
text
Master Pod
Worker Pod 1
Worker Pod 2
Worker Pod 3
这 4 个 Pod 不是互相独立的,而是一个整体任务。
Volcano 会把它们看成一个 PodGroup。
PodGroup 里有一个很重要的字段:
yaml
minMember
它表示:
text
至少需要多少个 Pod 能够运行,这个任务才可以被调度。
比如:
yaml
minMember: 3
意思是:
text
如果集群资源不能同时满足 3 个 Pod 运行,
那么这个 PodGroup 就先不要调度。
这就是 Gang Scheduling 的基础。
4. Queue:队列
简介:不同任务,可以选择进入不同队列排队,不同队列所占用资源,是有限制的。(其实就是分组实现资源隔离,避免乱抢占)
Queue 是 Volcano 做资源管理的重要概念。
你可以把 Queue 理解成:
任务排队的地方。
不同任务可以进入不同队列。
比如:
text
ai-queue
bigdata-queue
default
一个队列可以配置资源上限、资源保证、权重、优先级等。
简单理解:
text
Queue 解决的是"谁先用资源、能用多少资源"的问题。
如果你以后做公司内部 AI 平台,就一定会遇到这个问题:
text
多个用户共用 GPU 集群,资源怎么分?
Volcano 的 Queue 就是为这种场景服务的。
四、Volcano 和 Kubernetes 默认调度器的区别
可以这样理解:
text
Kubernetes 默认调度器:适合普通 Pod 调度
Volcano:适合一组有关联的任务调度
举个例子。
普通 Web 服务:
text
Deployment replicas: 3
这 3 个 Pod 通常是独立的。
少一个 Pod,服务可能还能跑,只是容量下降。
但是分布式训练不一样:
text
Master + Worker1 + Worker2 + Worker3
如果 Worker 没有全部启动,训练可能直接不能正常运行。
所以 Volcano 重点解决的是:
text
成组调度
队列管理
资源公平
优先级
批处理任务生命周期管理
五、Volcano 的典型使用场景
我理解的 Volcano 的非常适合 "需成组、排队、抢资源、长时间运行 " 等任务场景。
需要长时间运行,是为了容错,避免一般执行了,另一半没执行,导致重来。
Volcano 常见于这些场景:
1. AI / 机器学习训练
例如:
text
PyTorchJob
TensorFlowJob
MPIJob
RayJob
尤其是多机多卡训练。
2. 大数据计算
例如:
text
Spark
Flink
MapReduce 类任务
这些任务往往需要大量 CPU、内存,并且有明显的批处理特征。
3. HPC 高性能计算
例如:
text
科学计算
基因计算
仿真计算
MPI 并行计算
4. 多租户 GPU 集群
比如一个公司内部有统一 GPU 集群:
text
算法组
NLP 组
推荐组
视觉组
平台组
大家都要提交任务。
Volcano 可以帮助做:
text
队列隔离
资源配额
优先级调度
资源回收
公平调度
六、安装 Volcano
若已有 Kubernetes 集群,并且只是入门学习,可放心使用 Helm 安装。
安装命令:
bash
helm repo add volcano-sh https://volcano-sh.github.io/helm-charts
helm repo update
helm install volcano volcano-sh/volcano -n volcano-system --create-namespace
安装完成后检查:
bash
kubectl get all -n volcano-system
正常情况下,你应该能看到类似组件:
text
volcano-admission
volcano-controllers
volcano-scheduler
可以简单理解成:
text
volcano-scheduler:负责调度
volcano-controllers:负责控制 Volcano 自定义资源
volcano-admission:负责校验和准入
七、运行第一个 VolcanoJob
下面写一个最简单的 VolcanoJob。
创建文件:
bash
vim vcjob-quickstart.yaml
写入:
yaml
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: quickstart-job
spec:
minAvailable: 3
schedulerName: volcano
queue: default
policies:
- event: PodFailed
action: RestartJob
tasks:
- replicas: 3
name: demo-task
policies:
- event: TaskCompleted
action: CompleteJob
template:
spec:
restartPolicy: Never
containers:
- name: busybox
image: busybox:latest
command:
- sh
- -c
- |
echo "Volcano Job is running"
sleep 30
echo "Volcano Job done"
执行:
bash
kubectl apply -f vcjob-quickstart.yaml
查看 VolcanoJob:
bash
kubectl get vcjob
查看 Pod:
bash
kubectl get pod
查看 PodGroup:
bash
kubectl get podgroup
如果你看到 3 个 Pod 被创建,说明 VolcanoJob 已经运行起来了。
八、理解这个 YAML
重点看这几个字段。
1. schedulerName
yaml
schedulerName: volcano
表示这个任务由 Volcano 调度。
2. minAvailable
yaml
minAvailable: 3
表示这个 Job 至少需要 3 个 Pod 可运行,才算满足调度条件。
这就是 Volcano 很核心的能力。
如果集群资源不够同时运行 3 个 Pod,那么任务可能会等待。
3. queue
yaml
queue: default
表示这个任务进入 default 队列。
入门阶段可以先用 default 队列。
后面你可以自己创建新队列,比如:
text
ai-queue
gpu-queue
training-queue
4. tasks
yaml
tasks:
- replicas: 3
name: demo-task
表示这个 Job 里面有一个任务组,这个任务组启动 3 个副本。
你可以把它理解成:
text
这个 VolcanoJob 需要启动 3 个 Pod。
5. policies
yaml
policies:
- event: PodFailed
action: RestartJob
表示如果 Pod 失败,就重启整个 Job。
这适合批处理任务,因为一个 Pod 挂了,整个任务结果可能就不可靠了。
九、创建一个自己的 Queue
入门 Volcano,必须理解 Queue。
创建文件:
bash
vim ai-queue.yaml
写入:
yaml
apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
name: ai-queue
spec:
weight: 1
reclaimable: true
capability:
cpu: "4"
memory: "8Gi"
执行:
bash
kubectl apply -f ai-queue.yaml
查看队列:
bash
kubectl get queue
然后把前面的 VolcanoJob 改成:
yaml
queue: ai-queue
这样这个任务就会进入 ai-queue 队列。
通过字段,来理解YAML文件:
创建一个叫 ai-queue 的 Volcano 队列。
(weight:)这个队列参与资源分配时权重是 1。
(reclaimable: true)它可以临时借用空闲资源,但如果其他队列需要,它多占的资源可以被回收。
(capability: ...)它最多只能使用 4 CPU 和 8Gi 内存。
十、Volcano 最重要的调度思想:Gang Scheduling
Gang Scheduling 是 Volcano 入门最重要的概念。
它解决的问题是:
text
一组 Pod 必须一起调度。
假设一个训练任务需要 4 个 Pod:
text
worker-0
worker-1
worker-2
worker-3
如果只调度成功 2 个,另外 2 个一直 Pending,那么前 2 个 Pod 可能也没法真正工作。
这就是资源浪费。
Gang Scheduling 的思路是:
text
如果资源够,就一起启动。
如果资源不够,就一起等待。
这对于 AI 训练、大数据、MPI 任务非常重要。
十一、Volcano 和 KServe 的关系
如果你已经学过 KServe,可以这样理解:
text
KServe:更偏模型推理服务部署
Volcano:更偏任务调度和资源管理
KServe 关注的是:
text
模型怎么部署
服务怎么暴露
推理请求怎么进入模型
自动扩缩容怎么做
灰度发布怎么做
Volcano 关注的是:
text
任务怎么排队
资源怎么分配
Pod 是否能一起启动
谁优先调度
GPU/CPU/内存怎么公平使用
所以它们不是一个层面的东西。
更完整的 AI Infra 链路可以是:
text
Kubernetes:底座
Volcano:训练 / 批任务调度
KServe:模型推理服务
vLLM:大模型推理引擎
Prometheus / Grafana:监控
Ingress / Gateway:流量入口
十二、我后续的方向:
我现在已经走到了,前 4 个阶段。
第五个阶段,是我后续要努力的方向。
第一阶段:理解定位
先搞清楚:
text
Volcano 是什么
它和 kube-scheduler 的区别
它适合什么场景
为什么 AI 训练需要它
这一阶段不需要看源码。
第二阶段:跑通安装
你要会:
bash
helm install volcano volcano-sh/volcano -n volcano-system --create-namespace
kubectl get all -n volcano-system
目标是看到:
text
volcano-scheduler 正常运行
volcano-controllers 正常运行
volcano-admission 正常运行
第三阶段:跑通第一个 VolcanoJob
你要会:
bash
kubectl apply -f vcjob-quickstart.yaml
kubectl get vcjob
kubectl get pod
kubectl get podgroup
目标是理解:
text
VolcanoJob 会创建 Pod
Volcano 会为任务生成 PodGroup
PodGroup 体现成组调度
第四阶段:理解 Queue
你要会:
bash
kubectl get queue
kubectl apply -f ai-queue.yaml
目标是理解:
text
Queue 是资源队列
Job 可以指定 queue
不同队列可以管理不同团队或不同类型任务
第五阶段:结合 AI 训练任务
等你理解基础之后,再去看:
text
PyTorchJob + Volcano
Kubeflow Training Operator + Volcano
Ray + Volcano
Spark + Volcano
GPU 调度
队列资源配额
不要一上来就学这些,否则会很乱。
入门总结
