用途:Volcano 是 Kubernetes 原生批调度器,核心特性是 gang scheduling——一组 Pod 要么整体放置、要么完全不放置,适合需要 N 个 Pod 同时运行的分布式训练任务。需配合 together-gpu-clusters 技能(负责创建集群与配置 kubectl)。公开文档:https://docs.together.ai/docs/volcano-on-gpu-clusters。
前提:Together Kubernetes GPU 集群处于 Ready 状态,kubectl 已指向该集群(tg beta clusters get-credentials <cluster_id> --set-default-context)。GPU 节点暴露 nvidia.com/gpu,NVIDIA device plugin 已预装,可用 kubectl get nodes -o custom-columns='NODE:.metadata.name,GPU:.status.allocatable.nvidia.com/gpu' 确认。
安装:固定版本,勿用 master。kubectl apply -f https://raw.githubusercontent.com/volcano-sh/volcano/v1.15.0/installer/volcano-development.yaml,再 kubectl -n volcano-system wait --for=condition=Available deployment --all --timeout=180s。会自动创建默认队列(kubectl get queue)。也可用 Helm:helm repo add volcano-sh https://volcano-sh.github.io/helm-charts && helm install volcano volcano-sh/volcano -n volcano-system --create-namespace。
队列:Queue 限制并加权一组作业可用资源,字段含 reclaimable、weight、capability(硬上限,如 nvidia.com/gpu: 8)。
共享存储(可选):Together 提供以集群共享卷命名的静态 PersistentVolume,可绑定 ReadWriteMany PVC(storageClassName: shared-wekafs,volumeName 填该静态 PV),再在作业中挂载。
运行 gang 作业:gang 保证来自 Volcano Job(vcjob)的 minAvailable,需设置 schedulerName: volcano 与 queue。示例中 minAvailable: 4 表示 4 个 Pod 一起调度或都不调度;policies 可在 PodEvicted 时 RestartJob 重启整个 gang;tasks 下 replicas 与容器资源 limits(如 nvidia.com/gpu: 2)决定总量。
验证:kubectl get vcjob <name> 应显示 STATUS Running 且 RUNNINGS 等于 minAvailable;kubectl get podgroup 显示 gang,Running 阶段表示整组已放置。无法容纳的 gang 会保持 Inqueue 且零 Pod 运行,这是正常信号,不要通过把 minAvailable 降到低于真实并行度来“修复”。
规则与限制:安装 URL 必须固定版本;schedulerName: volcano 必须写在 Pod 模板上(vcjob 中位于 spec 下),否则默认调度器会接管且无 gang 保证;总请求超过队列 capability 的作业会被拒绝,需提高上限或拆分作业;非 vcjob 工作负载(如预装 MPI Operator 的 MPIJob)需设置 schedulerName: volcano 并附加 PodGroup,见 https://volcano.sh/en/docs/podgroup/;Volcano 与 Kueue 可共存于同一集群,Volcano 负责 schedulerName: volcano 的 Pod,Kueue 在默认调度器上准入作业,每个工作负载只选其一,不要同时指向两者。参考:https://volcano.sh/en/docs/、installation、gang_scheduling、queue、vcjob。