Tekton 优化之定制集群调度器

1. 受限的构建环境无法满足构建需求

  • default-scheduler

如上图,scheduler extender 提供了几个扩展点,当 kube-scheduler 调度流程进入该扩展阶段时,会向 sheduler extender 发送 http 请求,处理定制逻辑。部署时,可以使用 Deployment 部署 scheduler extender,修改 kube-scheduler 启动参数指向 scheduler extender 的地址即可。

  • scheduler framework
如上图,scheduler framework 也提供了几个扩展点,根据处理的阶段,实现对应的接口。部署时,直接替换 kube-scheduler 的镜像,添加配置文件说明启用哪些 plugin 即可。

4. 定制集群调度器

上述四种方式,第一种硬编码太硬核,第二种适用于多租户场景。第三种和第四种都是基于扩展点,但第三种需要部署额外的组件,第四种直接替换 kube-scheduler 镜像。第三种调度时需要发起 http 请求、创建集群 Client 维护 Informer ,第四种效率应该会更高,也更新更有未来。网上相关的教程挺详细,这里主要记录下遇到的坑。

4.1 如何新建项目

打开 https://github.com/kubernetes-sigs/scheduler-plugins/ 切换到集群对应的 tag,构建集群是 Kubernetes 1.21 ,因此选择 v0.21.6。这个项目下有很多可以参考的 plugin,我们可以直接拿来用,也可以根据自己的需求修改定制。拷贝 go.mod 文件 replace 部分,新建一个自己的 go 项目。这样做的目的是:
  • 让调度器的代码依赖版本与集群版本保持一致,否则跨版本太多会有参数不兼容问题
  • 避免编译时,依赖报错,处理起来很费时
  • 调研了常见的四种调度器,最终选择了 scheduler framework 的扩展方式
  • 使用 sheduler framework 的方式,实现了一个简单的调度器插件
  • 本地调试和部署
  • 根据主机的负载,选择不同的节点
  • 根据任务的资源需求,选择不同的节点