kube-scheduler-plugins

command module
v0.0.0-...-3ac6884 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 24, 2022 License: MIT Imports: 7 Imported by: 0

README

kube-scheduler自定义插件

这个仓库是干啥的?

最近在折腾怎么自定义scheduler,主要有四种方式:

  • 修改配置文件:只能基于现有插件做到调度策略上的微调
  • 通过scheduler extender扩展,对系统的侵入最小:实现一个 Kubernetes Scheduler Extender (liqiang.io)
  • 实现自己的插件:可以实现自己的插件,实现个性化的调度(比如基于GPU调度)
  • 基于scheduler源码二次开发:基于源码重写、编译,彻底的自定义

这里属于第三种,折腾了老半天才弄好,所以记录一下,这里只是实现了一个插件的demo,只需要在/pkg目录下实现自己的插件即可,main.go负责插件的注册,编译后就能得到附带你插件的scheduler了,打包镜像使用即可。

0.如何使用

环境说明: k8s版本:1.23.1 kubescheluer.config版本:v1beta3 版本比较关键!

直接make build即可得到kube-scheduler的二进制程序

make build
./bin/run.sh

命令参考:kube-scheduler | Kubernetes

配置文件api参考:kube-scheduler Configuration (v1beta3) | Kubernetes

注意如果集群开启了RBAC,还需要将 将调度器名称添加到应用了 endpointsleases 资源的规则的 resourceNames 中:

kubectl edit clusterrole system:kube-scheduler

添加你的调度器名字:

...
- apiGroups:
      - coordination.k8s.io
    resourceNames:
      - kube-scheduler
      - my-scheduler
    resources:
      - leases
    verbs:
      - get
      - update
  - apiGroups:
      - ""
    resourceNames:
      - kube-scheduler
      - my-scheduler
    resources:
      - endpoints
    verbs:
...

1.关于插件的开发

就在pkg目录下开发,只需要实现相应扩展点的接口即可,然后在配置文件中启动该插件即可

如果你需要开发你K8s版本的插件,需要修改go.mod,如果直接删掉,想用go mod tidy获得最新版本的话,会出现问题(kubernetes在设计上会独立发布各个模块,并对外屏蔽部分不稳定的代码,避免主仓库作为一个整体被外部引用,所以将部分模块的依赖版本写成了v0.0.0,然后再用replace替换成了代码仓库里的相对路径,即staging目录里的独立模块):

k8s.io/api@v0.0.0: reading k8s.io/api/go.mod at revision v0.0.0: unknown revision

还好是搜到了解决方案,使用hack/get-k8s-as-dep.sh生成指定版本的go.mod就好了

2.简单的展示一下这个插件

这个插件实现了score扩展点,通过节点的名字来打分,具体打分逻辑很简单(自行看代码)

运行run.sh后(为了调试方便,这里没有打包镜像,直接运行):

可以看到调度器正在运行:

然后我们创建pod,指定调度器:

apiVersion: v1
kind: Pod
metadata:
  name: busybox-test-scheduler
  namespace: default
spec:
  schedulerName: namescore-scheduler
  containers:
  - name: busybox
    image: busybox:1.35.0
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

通过预先计算可以知道,三个节点的打分如下,所以理应会调度到k8s-node02节点上

然后创建上述pod,果然被调度到了k8s-node02节点上,符合预期!

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
pkg

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL