Volcano 在 K8s 集群中的生产级部署与插件配置实战
Volcano 是 CNCF 孵化的云原生批处理调度系统,专为 AI、大数据、HPC 等高并发计算场景设计。相比默认的 Kube-scheduler,它提供了 Gang Scheduling、Queue 管理、任务拓扑感知 等企业级能力。本文提供从安装到插件调优的完整生产路径。
前置条件检查
部署前确保集群满足以下条件:
# 检查 K8s 版本(要求 1.16+)
kubectl version --short
# 确认节点资源充足(建议预留 2C4G 用于 Volcano 组件)
kubectl top nodes
# 关闭默认调度器对批处理任务的抢占(避免冲突)
kubectl get cm -n kube-system kube-scheduler -o yaml | grep disablePreemption
快速部署:Helm vs 原生 YAML
方式一:Helm 安装(推荐生产环境)
# 添加 Volcano 仓库
helm repo add volcano-sh https://volcano-sh.github.io/helm-charts
helm repo update
# 安装指定版本(当前稳定版 v1.8.2)
helm install volcano volcano-sh/volcano \
--namespace volcano-system \
--create-namespace \
--set basic.image_tag_version=v1.8.2 \
--set scheduler.kubeConfigPath=/etc/kubernetes/scheduler.conf
关键参数说明:
scheduler.kubeConfigPath:指定 kubeconfig 路径,确保调度器有权限监听 Pod 事件basic.image_tag_version:锁定版本避免自动升级导致兼容性问题
方式二:kubectl 快速体验(开发测试)
kubectl apply -f https://raw.githubusercontent.com/volcano-sh/volcano/release-1.8/installer/volcano-development.yaml
安装完成后验证组件状态:
kubectl get pods -n volcano-system
# 预期输出:volcano-scheduler、volcano-controller-manager、volcano-admission 均 Running
核心组件架构解析
Volcano 在 K8s 之上增加了三个关键组件,理解其协作机制是配置调优的基础:
| 组件 | 功能 | 关键配置 ConfigMap |
|---|---|---|
| Scheduler | 调度决策核心,支持多插件链式调用 | volcano-scheduler-configmap |
| Controllers | 管理 Job、Queue、PodGroup 生命周期 | 命令行参数 --worker-threads |
| Admission | Webhook 拦截,自动注入默认配置 | 证书管理(自动轮转) |
插件系统深度配置
Volcano 的调度能力通过插件实现,位于 /etc/kubernetes/volcano/scheduler.conf(或 ConfigMap)中配置。
1. 生产级调度器配置模板
apiVersion: v1
kind: ConfigMap
metadata:
name: volcano-scheduler-configmap
namespace: volcano-system
data:
volcano-scheduler.conf: |
actions: "enqueue, allocate, backfill" # 动作链顺序
tiers:
- plugins:
- name: priority
- name: gang # Gang Scheduling 防死锁
enablePreemptable: false
- name: conformance # 遵守节点污点/容忍
- plugins:
- name: drf # 主导资源公平调度
arguments:
drf.weight: 1
- name: predicates # 节点过滤(资源/端口/亲和性)
- name: proportion # Queue 容量比例分配
- name: nodeorder # 节点打分策略
arguments:
nodeorder.weight: 1
- plugins:
- name: cdp # 任务拓扑感知
- name: pipelining # 流水线优化
配置逻辑解析:
- ** tiers[0]**:必备插件(优先级、Gang、合规性),任一失败直接拒绝调度
- ** tiers[1]**:优化类插件(DRF 公平性、Proportion 队列容量),影响打分但不否决
- ** tiers[2]**:加速类插件(拓扑感知、流水线),提升吞吐
2. 关键插件详解
Gang Scheduling(防资源死锁)
AI 训练任务通常需要 N 个 Pod 同时运行(如 4 卡 GPU 训练)。默认 K8s 调度器可能先调度部分 Pod 导致资源碎片化,剩余 Pod pending 造成死锁。
启用 Gang 插件后,Volcano 会等待所有 minAvailable Pod 资源就绪才统一绑定:
# 使用示例:PyTorchJob 配置
apiVersion: kubeflow.org/v1
kind: PyTorchJob
metadata:
name: pytorch-gang-demo
spec:
schedulerName: volcano # 关键:指定调度器
runPolicy:
cleanPodPolicy: Running
pytorchReplicaSpecs:
Worker:
replicas: 4
template:
spec:
containers:
- name: pytorch
resources:
limits:
nvidia.com/gpu: 1
schedulerName: volcano
# PodGroup 自动创建,minAvailable=4
Queue 资源隔离
多租户场景下通过 Queue 实现资源配额管控:
apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
name: ai-training-queue
spec:
weight: 1 # 相对权重(与其他 Queue 比较)
capability: # 硬上限
cpu: "100"
memory: "200Gi"
nvidia.com/gpu: "20"
reclaimable: false # 是否允许资源回收
families: # 层级队列(v1.8+ 支持)
- name: sub-queue-1
weight: 2
使用策略:
- 生产环境建议关闭
reclaimable(避免运行中任务被抢占) - 通过
capability设置物理上限,防止某团队占满集群
NodeOrder 与拓扑感知
针对 GPU/高性能计算节点优化调度位置:
# 在 scheduler config 中启用
- name: nodeorder
arguments:
leastRequested.weight: 0 # 禁用默认最少请求策略
mostRequested.weight: 0 # 禁用最多请求策略
nodeAffinity.weight: 10 # 优先满足节点亲和性
podAffinity.weight: 5 # 优先共址调度(减少通信延迟)
验证与排错
功能验证
# 1. 检查 Queue 状态
kubectl get queue ai-training-queue -o yaml | grep state
# 预期:state: Open
# 2. 查看调度器日志(排查 Gang 调度失败)
kubectl logs -n volcano-system deployment/volcano-scheduler | grep "Failed to bind"
# 3. 验证 PodGroup 创建(Job 提交后自动创建)
kubectl get podgroups.scheduling.volcano.sh
常见问题排查
| 现象 | 根因 | 解决 |
|---|---|---|
| Pod 处于 Pending,scheduler 无日志 | 未指定 schedulerName: volcano |
检查 PodTemplate 或 Job 配置 |
| Gang 调度超时 | 资源不足或 minAvailable 设置过大 | 调整资源或降低 minAvailable |
| Queue 任务积压 | weight 配置过低或 capability 已满 | 扩容资源或调整 Queue weight |
| Admission Webhook 超时 | 网络策略拦截 443 端口 | 放行 volcano-system namespace 的入站规则 |
生产环境最佳实践
双调度器共存:保留默认 scheduler 处理在线服务,Volcano 专注批处理。通过
schedulerName显式区分:# 在线服务(无状态) schedulerName: default-scheduler # AI 训练任务(有状态批处理) schedulerName: volcano监控埋点:暴露 Volcano 指标到 Prometheus:
# 在 scheduler 启动参数添加 --listen-address=:8080 --enable-metrics=true关键指标:
schedule_attempts_total、e2e_scheduling_latency_milliseconds插件热更新:修改 ConfigMap 后无需重启,Volcano 会自动重载配置(约 30 秒生效),但建议低峰期操作。
资源预留:为 volcano-system 设置 PodDisruptionBudget,避免节点维护时调度器中断:
apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: volcano-scheduler-pdb namespace: volcano-system spec: minAvailable: 1 selector: matchLabels: app: volcano-scheduler