Volcano Kubernetes 调度系统详解
1. Volcano 简介
Volcano 是一个基于 Kubernetes 的批处理工作负载调度系统(Batch Scheduling System),旨在增强 Kubernetes 原生调度能力,使其能够支持高性能计算(HPC)、人工智能训练、大数据计算、科学计算等场景。
Kubernetes 原生调度器 kube-scheduler 的设计目标主要是:
为单个 Pod 找到一个满足资源和约束条件的运行节点。
这种模型非常适合:
-
Web 服务
-
微服务
-
长运行服务
-
无状态应用
但是对于以下场景存在不足:
-
AI 分布式训练
-
MPI 任务
-
Spark/Flink 批计算
-
大规模 GPU 作业
-
多租户资源共享
这些任务具有明显特点:
-
任务由多个 Pod 组成
-
Pod 之间存在强依赖关系
-
需要多个资源同时满足才能运行
-
资源需求动态变化
-
需要公平共享集群资源
Volcano 的核心目标:
在 Kubernetes 的声明式模型基础上,为批处理任务提供队列管理、组调度、资源公平分配以及高级调度策略。
2. Kubernetes 默认调度器的问题
理解 Volcano,需要先理解 kube-scheduler 的限制。
3. kube-scheduler 调度模型
Kubernetes 调度对象:
Pod
Scheduler 每次处理:
一个 Pod
流程:
Pod 创建
|
v
kube-scheduler
|
|
Filter
|
|
Score
|
|
Bind
|
v
Node
例如:
一个 AI 训练任务:
TensorFlow Job
需要:
1个 Master Pod
8个 Worker Pod
总共:
9个 Pod
8张 GPU
Kubernetes scheduler 看到的是:
Pod1
Pod2
Pod3
...
Pod9
它不知道:
这些 Pod 属于同一个训练任务
因此可能出现:
Pod1 -> Node1
Pod2 -> Node2
Pod3 -> Node3
...
Pod8 等待 GPU
结果:
已经分配资源:
7张GPU被占用
但是训练任务无法启动
这种问题称为:
4. Resource Fragmentation(资源碎片)
5. Gang Scheduling 问题
很多分布式任务要求:
所有 Worker 必须同时启动,否则任务没有意义。
例如:
MPI:
MPI Job
worker-0
worker-1
worker-2
worker-3
要求:
4个worker同时运行
否则:
worker-0启动
worker-1启动
worker-2等待
worker-3等待
前面的资源:
无法产生价值。
这种调度模式:
称为:
6. Gang Scheduling
中文:
组调度 / 集合调度。
7. Volcano总体架构
Volcano 架构如下:
User
|
|
Kubernetes API Server
|
------------------------------
| |
Volcano Controller Volcano Scheduler
|
Scheduler Framework
|
------------------------------------
| | | |
Queue Gang Binpack DRF
|
Bind
|
Node
Volcano主要包含:
-
Volcano Scheduler
-
Volcano Controller
-
CRD扩展对象
-
Scheduler Plugin体系
8. Volcano核心对象模型
Volcano扩展 Kubernetes API,引入新的资源对象。
主要包括:
-
Job
-
Queue
-
PodGroup
9. Volcano Job
Volcano Job 是批任务抽象。
类似:
Kubernetes Job:
kind: Job
但是增强:
kind: VolcanoJob
用于描述:
-
AI训练任务
-
MPI任务
-
Spark任务
例如:
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: tensorflow-training
spec:
minAvailable: 9
tasks:
- name: worker
replicas: 8
- name: ps
replicas: 1
含义:
这个任务:
总共9个Pod
至少9个Pod同时满足
才开始运行
这里:
minAvailable
就是 Gang Scheduling 的核心参数。
10. PodGroup
PodGroup 是 Volcano 中非常重要的概念。
它表示:
一组需要被整体调度的 Pod。
例如:
Training Job
|
|
PodGroup
-----------------
worker1
worker2
worker3
worker4
Scheduler 调度时:
不是:
Pod
而是:
PodGroup
11. Queue
Queue 是资源管理核心。
用于:
多租户环境。
例如:
公司 GPU 集群:
GPU Cluster
------------------
AI部门
100 GPU
算法部门
50 GPU
测试部门
20 GPU
对应:
Queue-AI
Queue-Algorithm
Queue-Test
每个 Queue:
可以定义:
-
Resource Capability
-
Weight
-
Priority
例如:
apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
spec:
weight: 2
capability:
cpu: 100
memory: 500Gi
nvidia.com/gpu: 20
表示:
该队列最大:
20 GPU
12. Volcano Scheduler核心流程
Volcano Scheduler 不采用简单的:
Pod -> Node
而采用:
Session Scheduling Model
一次调度过程称为:
Session。
13. 创建 Session
Scheduler启动:
Create Session
加载:
-
Node信息
-
Queue信息
-
Job信息
-
Plugin
形成:
Scheduling Session
14. Enqueue阶段
作用:
决定:
哪些任务进入调度队列。
例如:
Queue:
AI-training
任务:
Job-A
Job-B
Job-C
根据:
-
Priority
-
Queue状态
-
Fairness
决定顺序。
15. Allocate阶段
核心调度阶段。
Scheduler:
寻找:
PodGroup
↓
Node
例如:
任务:
需要:
8 GPU
扫描:
Node:
Node1:
4 GPU
Node2:
4 GPU
Node3:
8 GPU
选择:
Node3。
16. Backfill阶段
Backfill:
后台填充。
例如:
大任务:
需要100 GPU
等待中
空闲:
10 GPU
但是:
未来可能释放。
可以允许:
小任务临时运行。
提高:
资源利用率。
17. Preempt阶段
抢占。
例如:
低优任务:
训练测试
Priority=10
高优任务:
线上模型训练
Priority=100
资源不足:
驱逐:
低优任务。
18. Volcano Scheduler Plugin机制
Volcano 最大特点:
插件化调度。
Scheduler Framework:
Scheduler
|
Plugin Framework
|
---------------------
enqueue
allocate
predicates
prioritize
preempt
19. Gang Plugin
功能:
组调度。
核心:
minAvailable
例如:
任务:
10 Pods
设置:
minAvailable=10
只有:
10 Pod全部找到资源
↓
启动
20. Binpack Plugin
资源紧凑策略。
目标:
减少资源碎片。
例如:
两个节点:
Node1:
CPU:
90%
Node2:
CPU:
10%
优先:
Node2还是Node1?
Binpack:
选择:
Node1
原因:
让Node2保持空闲。
优势:
-
节省机器
-
提高利用率
21. DRF Plugin
Dominant Resource Fairness。
用于:
多资源公平。
例如:
用户A:
需要:
CPU 80%
GPU 10%
用户B:
需要:
CPU 20%
GPU 80%
不能只看CPU。
DRF计算:
主要资源占用。
保证:
公平。
22. Priority Plugin
根据:
PriorityClass
排序。
例如:
production:
priority=1000
test:
priority=100
生产任务优先。
23. Volcano GPU调度
AI场景是 Volcano 最大应用。
Kubernetes GPU调度:
默认:
nvidia.com/gpu
例如:
Pod:
resources:
limits:
nvidia.com/gpu: 4
但是:
复杂场景:
例如:
A100:
8 GPU
要求:
同一机器
NVLink通信
Volcano 可以结合:
-
GPU拓扑
-
NUMA
-
RDMA
-
网络带宽
实现:
拓扑感知调度。
24. Volcano与Kubernetes Scheduler对比
| 能力 | kube-scheduler | Volcano |
|---|---|---|
| Pod调度 | 支持 | 支持 |
| 单Pod优化 | 强 | 强 |
| Job调度 | 弱 | 强 |
| Gang Scheduling | 无 | 支持 |
| Queue管理 | 无 | 支持 |
| GPU调度 | 基础 | 高级 |
| 公平调度 | 弱 | 支持 |
| 批计算 | 一般 | 优秀 |
| AI训练 | 一般 | 优秀 |
25. Volcano典型生产架构
例如:
企业AI云平台:
用户
|
AI Training Platform
|
Volcano
--------------------------------
Queue-AI
Queue-BigData
Queue-Test
|
Kubernetes Cluster
--------------------------------
GPU Node Pool
CPU Node Pool
Storage Node Pool
实现:
-
GPU共享
-
多租户隔离
-
优先级控制
-
资源利用率优化
26. 运维工程师需要掌握的重点
如果你面向:
云平台 / AIOps / Kubernetes高级运维岗位。
Volcano重点掌握:
26.1. 基础:
-
Volcano架构
-
Job
-
Queue
-
PodGroup
26.2. 调度:
-
Gang Scheduling
-
Binpack
-
DRF
-
Preemption
26.3. GPU:
-
GPU资源管理
-
NVIDIA device plugin
-
GPU拓扑
26.4. 平台化:
结合:
Prometheus
+
Volcano Metrics
+
AI预测模型
+
自动调度
最终形成:
资源监控
↓
负载预测
↓
调度策略优化
↓
自动扩缩容
关联文档
- K8s 核心概念:Kubernetes 核心对象与控制面基础。
