侧边栏壁纸
博主头像
蜉蝣的博客博主等级

行动起来,活在当下

  • 累计撰写 39 篇文章
  • 累计创建 6 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Volcano调度器部署

蜉蝣
2025-08-07 / 0 评论 / 0 点赞 / 35 阅读 / 7364 字

安装

文档

https://volcano.sh/zh/docs/v1-12-0/installation/

基于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-configmap
kind: 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

构建

  • 在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.yaml
    kubelet-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

0

评论区