Volcano
新增插件说明
- 本文新增了一个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() {}
扩展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)
}
插件部署
- 重新打包基于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
完整代码