kube-scheduler自定义插件
这个仓库是干啥的?
最近在折腾怎么自定义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,还需要将 将调度器名称添加到应用了 endpoints 和 leases 资源的规则的 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节点上,符合预期!
