【集群】云原生批调度实战:Volcano 安装与初试

【集群】云原生批调度实战:Volcano 安装与初试

Fre5h1nd Lv6

本系列《云原生批调度实战:Volcano 深度解析》计划分为以下几篇,点击查看其它内容。

  1. 云原生批调度实战:Volcano 深度解析(一)批处理背景需求与Volcano特点
  2. 云原生批调度实战:Volcano 深度解析(二)Volcano调度流程与调度状态
  3. 云原生批调度实战:Volcano 安装与初试
  4. 云原生批调度实战:调度器测试与监控工具 kube-scheduling-perf
  5. 云原生批调度实战:调度器测试监控结果

💡简介

在 Kubernetes 集群中,原生调度器主要针对在线服务设计,采用”先到先得”的调度策略。然而,在实际生产环境中,我们经常需要处理大规模批处理作业,这些作业具有资源需求大、运行时间长、依赖关系复杂等特点。原生调度器在处理这类作业时往往力不从心,无法满足复杂的调度需求。

Volcano 作为 Kubernetes 的批处理调度系统,正是为了解决这些问题而生。它提供了作业管理、队列管理、资源预留等高级特性,特别适合 AI 训练、大数据处理等场景。本文将首先对 Volcano 进行深入调研,了解其设计理念和业界应用情况;然后详细介绍安装部署过程,为后续的调度功能测试和源码研究打下基础。

🖼️背景

1. Volcano 的提出背景

根据 CNCF 官方博客[1]的介绍,Volcano 项目最初由华为云发起,旨在解决 Kubernetes 在批处理作业调度方面的不足。原生 Kubernetes 调度器存在以下局限性:

  1. 资源调度策略:

    • 原生调度器采用”先到先得”的调度策略,无法满足批处理作业的复杂需求
    • 不支持作业优先级和公平性调度,可能导致资源分配不均衡
    • 缺乏对批处理作业特性的考虑,如作业依赖关系、资源预留等
  2. 作业管理能力:

    • 不支持作业级别的资源管理,难以实现作业间的资源隔离
    • 缺乏作业依赖关系处理,无法保证作业按正确顺序执行
    • 不支持作业队列管理,难以实现多租户场景下的资源分配
  3. 资源利用效率:

    • 无法进行资源预留和抢占,可能导致关键作业无法及时执行
    • 缺乏对集群整体资源利用率的优化,资源利用率可能较低
    • 不支持跨作业的资源平衡,可能导致资源碎片化

2. Volcano 的业界地位

根据 GitHub 仓库[2]和 CNCF 项目状态[3]

  1. 项目背景:

    • 由华为云开源并贡献给 CNCF
    • 2020 年 4 月成为 CNCF 沙箱项目
    • 2021 年 7 月升级为 CNCF 孵化项目
    • 被阿里云、腾讯云等多家云服务提供商采用
  2. 应用范围:

    • 广泛应用于 AI 训练场景,如 TensorFlow、PyTorch 等框架
    • 被用于大规模数据处理,如 Spark、Flink 等应用
    • 在科学计算领域有重要应用,如基因测序、气象模拟等
  3. 社区活跃度:

    • GitHub 星数超过 3.5k
    • 有超过 100 位贡献者
    • 每月有稳定的版本更新
    • 有活跃的 Slack 社区和邮件列表

3. 离线作业的特殊性

根据 Kubernetes 官方文档[4]和 Volcano 技术博客[5]

  1. 资源需求特征:

    • 资源需求量大:单个作业可能需要多个节点的资源
    • 运行时间长:从几分钟到数天不等
    • 对资源利用率要求高:需要最大化资源利用效率
  2. 调度需求:

    • 需要支持作业优先级:确保重要作业优先执行
    • 需要处理作业依赖关系:保证作业按正确顺序执行
    • 需要支持资源预留和抢占:确保关键作业能够及时执行
  3. 原生调度器的不足:

    • 无法处理作业间的依赖关系:可能导致作业执行顺序错误
    • 缺乏对作业优先级的支持:无法保证重要作业优先执行
    • 资源调度策略过于简单:无法满足复杂的调度需求
    • 无法进行跨作业的资源优化:可能导致资源利用率低下

🧠思路

  1. 调研 Volcano 的基本情况
  2. 安装部署 Volcano
  3. 配置测试环境
  4. 进行功能测试

🔨解决

0. 安装 Helm

0.1 Helm 简介

Helm 是 Kubernetes 的包管理工具,类似于 Linux 的 apt、yum 等包管理器。它可以帮助我们:

  • 简化 Kubernetes 应用的部署和管理
  • 实现应用配置的版本控制
  • 方便地分享和复用应用配置
  • 管理应用依赖关系

0.2 安装 Helm

1
2
3
4
5
6
7
8
9
10
11
# 下载 Helm 安装脚本
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3

# 添加执行权限
chmod 700 get_helm.sh

# 执行安装脚本
./get_helm.sh

# 验证安装
helm version

1.3 配置 Helm 仓库

1
2
3
4
5
6
7
8
9
10
# 添加各个仓库
helm repo add stable https://charts.helm.sh/stable
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo add azure https://mirror.azure.cn/kubernetes/charts

# 更新仓库信息
helm repo update

# 查看已添加的仓库
helm repo list

1. 安装 Volcano

注意:如果要使用 kwok 进行模拟,则需要先安装 Volcano 后再启动 kwok。否则会被 kwok 变为假请求而无法安装。

1.1 使用 Helm 安装

1
2
3
4
5
6
# 添加 Helm 仓库
helm repo add volcano-sh https://volcano-sh.github.io/helm-charts
helm repo update

# 安装 Volcano
helm install volcano volcano-sh/volcano -n volcano-system --create-namespace

1.2 通过 YAML 文件安装

1
2
3
4
5
curl -fsSL -o volcano-development.yaml https://raw.githubusercontent.com/volcano-sh/volcano/master/installer/volcano-development.yaml
# 为避免镜像拉取问题,可使用 DaoCloud 代理,在文件中所有image名前加上 m.daocloud.io/ 即可
# 若有多个文件要修改,则可以使用 `find ./files -type f -exec sed -i 's/image: /image: m.daocloud.io\//g' {} +`
sed -i 's/image: /image: m.daocloud.io\//g' volcano-development.yaml
kubectl apply -f volcano-development.yaml

1.3 验证安装

1
2
3
4
5
# 检查 Pod 状态
kubectl get pods -n volcano-system

# 检查调度器状态
kubectl get pods -n volcano-system -l app=volcano-scheduler

2. 配置 Volcano

2.1 创建队列

queue.yaml
1
2
3
4
5
6
7
8
9
apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
name: test-queue
spec:
priority: 100
reclaimable: true
# weight字段仅用于proportion插件
weight: 1
1
2
kubectl apply -f queue.yaml
kubectl get queue

2.2 创建 PodGroup

podgroup.yaml
1
2
3
4
5
6
7
apiVersion: scheduling.volcano.sh/v1beta1
kind: PodGroup
metadata:
name: test-podgroup
spec:
minMember: 1
queue: test-queue
1
2
kubectl apply -f podgroup.yaml
kubectl get podgroup

3. 测试调度功能

3.1 创建测试作业

vcjob-quickstart.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: quickstart-job
spec:
minAvailable: 3
schedulerName: volcano
# 如果省略 'queue' 字段,将使用 'default' 队列。
queue: test-queue
policies:
# 如果Pod失败(例如,由于应用程序错误),则重启整个作业。
- event: PodFailed
action: RestartJob
tasks:
- replicas: 3
name: completion-task
policies:
# 当此特定任务成功完成时,将整个作业标记为"完成"。
- event: TaskCompleted
action: CompleteJob
template:
spec:
containers:
- command:
- sh
- -c
- 'echo "Job is running and will complete!"; sleep 100; echo "Job done!"'
image: m.daocloud.io/docker.io/library/busybox:latest
name: busybox-container
resources:
requests:
cpu: 1
limits:
cpu: 1
restartPolicy: Never

3.2 验证调度结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 查看作业状态
$ kubectl get vcjob quickstart-job -oyaml
# 会看到类似以下输出(时间戳和 UID 会不同)
……
status:
conditions:
- lastTransitionTime: "2025-05-28T08:39:22Z"
status: Pending
- lastTransitionTime: "2025-05-28T08:39:23Z"
status: Pending
- lastTransitionTime: "2025-05-28T08:39:27Z"
status: Pending
- lastTransitionTime: "2025-05-28T08:39:28Z"
status: Pending
- lastTransitionTime: "2025-05-28T08:39:30Z"
status: Running
minAvailable: 3
running: 3
state:
lastTransitionTime: "2025-05-28T08:39:30Z"
phase: Running
taskStatusCount:
completion-task:
phase:
Running: 3
……
1
2
3
4
5
6
7
# 查看 Pod 状态
$ kubectl get pods -l volcano.sh/job-name=quickstart-job
# 最初 Pod 将处于 Running 状态。大约100秒后,busybox 容器将退出,Pod 的状态将变为 Completed。
NAME READY STATUS RESTARTS AGE
quickstart-job-completion-task-0 0/1 Completed 0 3m59s
quickstart-job-completion-task-1 0/1 Completed 0 3m59s
quickstart-job-completion-task-2 0/1 Completed 0 3m59s
1
2
3
4
5
6
7
8
9
10
11
12
13
# 一旦 Pod 完成,VolcanoJob 中的 TaskCompleted 策略将触发 CompleteJob 操作,这会将 VolcanoJob 的阶段转换为 Completed
# 查看作业状态
$ kubectl get vcjob quickstart-job -oyaml
# 会看到类似以下输出(时间戳和 UID 会不同)
……
status:
……
minAvailable: 3
runningDuration: 1m49s
state:
lastTransitionTime: "2025-05-28T08:41:11Z"
phase: Completed
version: 3


  • 希望这篇博客对你有帮助!如果你有任何问题或需要进一步的帮助,请随时提问。
  • 如果你喜欢这篇文章,欢迎动动小手给我一个follow或star。

🗺参考文献

[1] CNCF 官方博客:Volcano 项目介绍

[2] Volcano GitHub 仓库

[3] CNCF 项目状态

[4] Kubernetes 批处理作业文档

[5] Volcano 官方文档

[6] Kwok Discussion

[7] Volcano 开源项目安装与配置指南

[8] Volcano 安装

[9] Volcano 快速开始

  • 标题: 【集群】云原生批调度实战:Volcano 安装与初试
  • 作者: Fre5h1nd
  • 创建于 : 2025-06-22 16:30:35
  • 更新于 : 2025-06-27 11:09:38
  • 链接: https://freshwlnd.github.io/2025/06/22/k8s/k8s-volcano-install/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论