LOADING

加载过慢请开启缓存 浏览器默认开启

Volcano扩展——扩展一个调度器插件

Volcano

  • 官方文档
  • Github
  • Volcano是CNCF 下首个也是唯一的基于Kubernetes的容器批量计算平台,主要用于高性能计算场景。它提供了Kubernetes目前缺 少的一套机制,这些机制通常是机器学习大数据应用、科学计算、特效渲染等多种高性能工作负载所需的。作为一个通用批处理平台,Volcano与几乎所有的主流计算框 架无缝对接,如Spark 、TensorFlow 、PyTorch 、 Flink 、Argo 、MindSpore 、 PaddlePaddle,Ray等。它还提供了包括异构设备调度,网络拓扑感知调度,多集群调度,在离线混部调度等多种调度能力。Volcano的设计 理念建立在15年来多种系统和平台大规模运行各种高性能工作负载的使用经验之上,并结合来自开源社区的最佳思想和实践。
  • 插件开发官方文档https://github.com/Stringxy/volcano-custom-plugin-demo/blob/main/docs/design/custom-plugin.md

新增插件说明

  • 本文新增了一个Print Action与logPrint Plugin,Job Pending&Ready时,调度器将会打印日志

环境 Environment

  • volcano: 1.11.0
  • docker: v26.1.3
  • docker buildx: v0.20.1
  • kubernetes: v1.27.1

开发环境准备

  • 官方开发环境准备文档
  • 二次开发Volcano除了官方Github文档上描述的环境要求外,还需要安装docker buildx插件,可在官方github下载对应Release版本,本文下载的是buildx-v0.20.1.linux-amd64
  • 将其改名后放入~/.docker/cli-plugins目录下,并赋予执行权限
root@k8s-master:~/.docker/cli-plugins# ls
docker-buildx
#使用命令验证是否安装成功
docker buildx version

扩展Action

  • 在pkg\scheduler\api\types.go中定义PrintFn
  // PrintFn is the func declaration used to check whether the job can be print
  type PrintFn func([]*JobInfo)
  • 在pkg\scheduler\framework\session.go的Session结构体中定义printFns
  • 在pkg\scheduler\framework\session_plugins.go中编写PrintJobInfo方法
  • PrintJobInfo方法遍历Session中的Tiers,然后遍历每个Tier中的插件,并调用对应的printFns函数。
func (ssn *Session) PrintJobInfo(job []*api.JobInfo) {
    for _, tier := range ssn.Tiers {
        for _, plugin := range tier.Plugins {
            fn, found := ssn.printFns[plugin.Name]
            if !found {
                continue
            }
            fn(job)
        }
    }
}
  • 在以下位置pkg\scheduler\actions新建print目录,并新建print.go、print_test.go文件
  • print.go按Action接口要求实现
  • Name() string: 返回该 Action 的唯一名称。
  • Initialize(): 初始化分配器插件。
  • Execute(ssn *Session): 执行资源分配,将集群的资源分配到每个队列中。参数 ssn 是一个指向 Session 类型的指针。
  • UnInitialize(): 反初始化分配器插件,通常用于清理资源或撤销初始化操作。
type Action struct {
    session *framework.Session
}

func New() *Action {
    return &Action{}
}

func (print *Action) Name() string {
    return "print"
}

func (print *Action) Initialize() {}

func (print *Action) Execute(ssn *framework.Session) {
    klog.V(5).Infof("Enter Print Action ...")
    defer klog.V(5).Infof("Leaving Action ...")
    jobs := make([]*api.JobInfo, 0)
    for _, job := range ssn.Jobs {
        jobs = append(jobs, job)
    }
    ssn.PrintJobInfo(jobs)
}

func (alloc *Action) UnInitialize() {}
  • 编写print_test.go测试用例

扩展Plugin

  • 在以下位置pkg\scheduler\plugins新建logprint插件目录
  • logprint.go主要在OnSessionOpen实现loggingFn,并注册到Action的PrintFn中
func (logPrint *logPrint) OnSessionOpen(ssn *framework.Session) {
    klog.V(5).Infof("Enter logPrint plugin ...")
    defer func() {
        klog.V(5).Infof("Leaving logPrint plugin. %s ...", logPrint.pluginArguments)
    }()
    loggingFn := func(jobs []*api.JobInfo) {
    for _, job := range jobs {
        if job.IsPending() {
            klog.V(1).Infof("Job %s/%s is pending, try to schedule it on node %s", job.Namespace, job.Name)
        }
        if job.IsReady() {
            klog.V(1).Infof("Job %s/%s is ready, detail info : %s", job.Namespace, job.Name, job.String())
        }
    }
}

	ssn.AddPrintFn(PluginName, loggingFn)
}
  • 编写logprint_test.go测试用例

插件部署

  • 重新打包基于ubuntu的volcano镜像,使他支持扩展插件
make images SUPPORT_PLUGINS=yes
  • 如果你想使用 ubuntu 作为基础镜像,你可以使用 gnu-libc 来构建插件。由于大多数 Linux 操作系统都有 gnu-libc,你可以在本地直接构建插件。
# default CC is gcc
CGO_ENABLED=1 go build -o plugins/logprint/logprint.so -buildmode=plugin logprint.go
  • 构建新的调度器镜像
#Dockerfile
FROM volcanosh/vc-scheduler:latest

COPY plugins plugins
docker build -t volcanosh/vc-scheduler:magic-plugins .
  • 指定插件目录
...
containers:
- name: volcano-scheduler
image: volcanosh/vc-scheduler:magic-plugins
args:
- --logtostderr
- --scheduler-conf=/volcano.scheduler/volcano-scheduler.conf
- --enable-healthz=true
- --enable-metrics=true
- -v=3
- --plugins-dir=plugins  # specify plugins dir path
- 2>&1
  • 更新 volcano-scheduler-configmap
kubectl edit cm volcano-scheduler-configmap -n volcano-system
apiVersion: v1
kind: ConfigMap
metadata:
  name: volcano-scheduler-configmap
  namespace: volcano-system
data:
  volcano-scheduler.conf: |
    actions: "print, enqueue, allocate, backfill"
    tiers:
    - plugins:
      - name: priority
      - name: gang
      - name: conformance
      - name: logprint       # activate your custom plugin
    - plugins:
      - name: drf
      - name: predicates
      - name: proportion
      - name: nodeorder
      - name: binpack

完整代码