安装
文档
基于yaml文件部署
kubectl apply -f https://raw.githubusercontent.com/volcano-sh/volcano/master/installer/volcano-development.yaml配置GPU虚拟化
前置条件
NVIDIA驱动 > 440
nvidia-docker > 2.0(或nvidia-container-toolkit)
Docker已配置
nvidia为默认运行时Kubernetes >= 1.16
Volcano >= 1.9
部署volcano-vgpu-device-plugin
克隆代码仓库
git clone https://github.com/Project-HAMi/volcano-vgpu-device-plugin.git配置volcano-scheduler-configmap
kubectl edit cm -n volcano-system volcano-scheduler-configmapkind: ConfigMap
apiVersion: v1
metadata:
name: volcano-scheduler-configmap
namespace: volcano-system
data:
volcano-scheduler.conf: |
actions: "enqueue, allocate, backfill"
tiers:
- plugins:
- name: priority
- name: gang
- name: conformance
- plugins:
- name: drf
- name: deviceshare
arguments:
deviceshare.VGPUEnable: true # enable vgpu
deviceshare.SchedulePolicy: binpack # scheduling policy. binpack (装箱) / spread (均摊)
- name: predicates
- name: proportion
- name: nodeorder
- name: binpack编辑volcano-vgpu-device-plugin.yml
插入一个gpu-memory-factor参数(此为bug,当集群内总GPU显存过高时vgpu-memory=0)

执行
kubectl create -f volcano-vgpu-device-plugin.yml测试
apiVersion: v1
kind: Pod
metadata:
name: test-volcano-gpu-sharing
namespace: test-volcano
spec:
schedulerName: volcano
containers:
- name: cuda-container
image: pytorch/pytorch:2.7.1-cuda11.8-cudnn9-runtime
imagePullPolicy: IfNotPresent
command: ["sleep"]
args: ["infinity"]
resources:
limits:
volcano.sh/vgpu-number: 2 # 申请 2 个 vGPU 卡
volcano.sh/vgpu-memory: 300 # (可选) 每个 vGPU 使用 3G 设备显存, 单位10Mi
volcano.sh/vgpu-cores: 20 # (可选) 每个 vGPU 使用 20% 的核心部署Volcano Dashboard
克隆代码仓库
git clone https://github.com/volcano-sh/dashboard.git启动面板
kubectl apply -f dashboard/deployment/volcano-dashboard.yaml更改服务配置(bug)
修改 targetPort: 80
kubectl edit svc volcano-dashboard -n volcano-system端口转发
kubectl port-forward svc/volcano-dashboard <idle-ip>:80 -n volcano-system --address 0.0.0.0基于源码编译安装
下载源码
git clone https://github.com/volcano-sh/volcano.git编译源码
生成任务调度器等组件的可执行文件
make构建镜像
安装docker buildx
从代码仓库https://github.com/docker/buildx下载需要的二进制文件
将二进制文件移动到/usr/local/lib/docker/cli-plugins目录下
构建
在installer/dockerfile目录下的所有Dockerfile中添加go代理
ENV GOPROXY=https://goproxy.cn,direct
构建镜像
make images TAG=latest修改yaml文件配置
将installer/volcano-development.yaml中的所有镜像替换为上一步构建的镜像
部署
kubectl apply -f volcano-development.yaml维护
节点压力驱逐
kubelet 监控集群节点的内存、磁盘空间和文件系统的 inode 等资源。 当这些资源中的一个或者多个达到特定的消耗水平, kubelet 可以主动地使节点上一个或者多个 Pod 失效,以回收资源防止饥饿
硬驱逐条件
硬驱逐条件没有宽限期。当达到硬驱逐条件时, kubelet 会立即杀死 Pod,而不会正常终止以回收紧缺的资源。
kubelet 具有以下默认硬驱逐条件:
memory.available<100Mi(Linux 节点)nodefs.available<10%(Windows 节点)imagefs.available<15%nodefs.inodesFree<5%(Linux 节点)imagefs.inodesFree<5%(Linux 节点)
解决
定期清理节点存储空间避免pod被驱逐
改小硬驱逐条件
在master和worker节点创建config.yaml并写入新配置
touch /etc/rancher/k3s/config.yamlkubelet-arg: - "eviction-hard=nodefs.available<5%,nodefs.inodesFree<5%,imagefs.available<5%,imagefs.inodesFree<5%"重启节点
# master sudo systemctl restart k3s # worker sudo systemctl restart k3s-agent
bug
当使用NFS-Subdir-External-Provisioner创建动态sc时,在短时间内创建一定数目的pvc后,后面的任务会被阻塞,状态一直为pending,且不会随着之前的任务完成而解决,原因不明
当前仅能使用静态sc,注意,在使用静态sc时,volumeBindingMode只能是Immediate
评论区