Volcano 详细笔记

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 调度
队列资源配额

不要一上来就学这些,否则会很乱。

入门总结

相关推荐
Elastic 中国社区官方博客12 小时前
Elasticsearch Agent Builder 黑客松(Hackathon)
大数据·人工智能·elasticsearch·搜索引擎·云原生·全文检索
^ω^。14 小时前
K8s知识
云原生·容器·kubernetes
sbjdhjd14 小时前
从 0 到 1 构建高可用企业级 NoSql 数据库 Redis 集群
linux·运维·redis·云原生·kubernetes·开源·云计算
还在忙碌的吴小二1 天前
Spring Cloud Alibaba 微服务解决方案新手入门指南
微服务·云原生·架构
用户1558319968141 天前
企业云盘API集成实战:用Webhook+OpenAPI实现自动化文件工作流
云原生
2601_948810601 天前
k8s-EFK
云原生·容器·kubernetes
liux35281 天前
云原生入门:什么是K8s?
云原生·容器·kubernetes
思诺学长1 天前
微服务与分布式系统
微服务·云原生·架构
步步为营DotNet2 天前
深挖.NET 11:.NET Aspire 在云原生应用韧性架构构建的探索与实践
云原生·架构·.net