volcano

2025-05-25

运维

有志者事竟成。 ——《后汉书·耿 列传》

https://github.com/volcano-sh/volcano

Volcano:高性能容器批量调度系统

在云原生时代,容器技术和 Kubernetes 已成为现代分布式系统的核心。然而,针对批处理任务(Batch Jobs)和大规模计算任务,Kubernetes 的默认调度器无法完全满足高性能、复杂依赖和资源优化的需求。这正是 Volcano 项目诞生的原因。

本文将介绍 Volcano 的核心功能、应用场景以及如何快速上手。


什么是 Volcano?

Volcano 是一个基于 Kubernetes 的批量调度系统,专为高性能计算(HPC)、人工智能/机器学习(AI/ML)、大数据处理等工作负载设计。它增强了 Kubernetes 的调度能力,使其更高效地处理复杂的批处理任务和资源密集型应用。


Volcano 的核心特性

  1. 批量调度:支持批量任务调度,优化任务的执行顺序和资源利用率。
  2. 任务优先级:通过任务的优先级和公平性策略进行资源分配。
  3. 依赖管理:支持任务之间的 DAG(有向无环图)依赖关系,确保任务按依赖顺序执行。
  4. 扩展性强:支持多种插件机制,可以根据需求定制调度策略。
  5. 资源感知:提供多种资源调度策略,包括 GPU、CPU、内存等。
  6. 容错能力:支持任务失败重试、任务抢占和任务迁移。

典型应用场景

1. 高性能计算(HPC)

在科学计算、生物信息学、气象模拟等领域,任务往往需要高度并行和资源密集型的调度。Volcano 提供了资源感知的调度策略,确保任务在资源使用上的高效性。

2. 人工智能与机器学习

在 AI/ML 模型训练中,任务可能需要多个 GPU 和高性能的分布式计算环境。Volcano 支持 GPU 任务调度和分布式任务的依赖管理,减少资源浪费。

3. 大数据处理

在大数据工作负载中,任务通常具有复杂依赖性(如 MapReduce 工作流)。Volcano 的 DAG 调度功能可以很好地支持这类场景。


快速上手

以下是使用 Volcano 的基本步骤:

1. 环境准备

确保你的 Kubernetes 集群已经部署完毕,并且 Kubernetes 版本在 v1.24 或以上。

2. 安装 Volcano

通过 Helm 安装 Volcano:

1
2
3
helm repo add volcano-sh https://volcano-sh.github.io/helm-charts
helm repo update
helm install volcano volcano-sh/volcano

完成后,Volcano 的核心组件(如 volcano-schedulervolcano-controller)将被部署到集群中。


3. 创建 Volcano 任务

Volcano 提供了自定义的 Job CRD(Custom Resource Definition)来定义批处理任务。以下是一个简单的 Volcano Job 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: volcano-job-example
spec:
minAvailable: 2
schedulerName: volcano
policies:
- event: PodEvicted
action: RestartJob
tasks:
- replicas: 2
name: "task1"
template:
spec:
containers:
- image: ubuntu
name: main
command: ["sleep", "60"]
restartPolicy: Never

4. 提交任务

将上述 YAML 文件保存为 volcano-job.yaml,然后使用 kubectl 提交任务:

1
kubectl apply -f volcano-job.yaml

通过以下命令查看任务状态:

1
kubectl get jobs.batch.volcano.sh

关键功能解析

1. 多任务依赖调度

Volcano 支持任务之间的依赖关系,通过 DAG(有向无环图)定义任务执行顺序。例如:

1
2
3
4
5
spec:
tasks:
- name: "task1"
dependsOn: ["task0"]
- name: "task0"

2. 资源公平分配

Volcano 支持基于 Queue 的资源分配模式,不同队列之间可以设置优先级,确保高优先级任务优先获得资源。

3. 插件扩展

Volcano 提供了丰富的插件机制,例如:

  • gang: 保证任务组的资源分配原子性。
  • binpack: 优化资源利用率,尽可能将任务安排在最少的节点上。
  • priority: 基于任务优先级进行调度。

通过插件机制,开发者可以根据业务需求自定义调度策略。


实际案例

1. AI 模型训练

某公司的 AI 团队需要同时训练多个深度学习模型,每个模型需要 4 个 GPU。通过 Volcano 的 gang 调度插件,可以确保训练任务只在分配到足够 GPU 时启动,避免资源浪费。

2. 科学计算

某科研机构需要运行多个高性能计算任务,这些任务对内存和 CPU 要求较高。通过 Volcano 的 binpack 插件,可以最大化资源利用率,减少节点的空闲率。


与 Kubernetes 默认调度器的对比

特性 Kubernetes 默认调度器 Volcano 调度器
批量调度 不支持 支持
任务依赖管理 不支持 支持(DAG 调度)
GPU 资源调度 基础支持 强大的 GPU 调度能力
插件扩展性 有限 丰富的插件机制
资源公平性 有限支持 支持基于队列的资源分配

通过对比可以看出,Volcano 在批量调度和资源优化方面更为强大,是批处理任务的首选解决方案。


总结

Volcano 是一个专注于高性能批量调度的 Kubernetes 扩展,弥补了默认调度器的不足。在 AI 训练、大数据处理和科学计算等场景中,Volcano 提供了灵活高效的解决方案。

项目地址:https://github.com/volcano-sh/volcano

如果你正在开发需要批量调度的项目,不妨试试 Volcano,它将大幅提升你的工作效率!