自定义scheduler plugin扩展开发

自定义scheduler plugin扩展开发

有两种方式可以实现自定义调度

  1. default scheduler recording:配置修改,直接在k8s默认scheduler配置基础上进行添加,然后重新编译kube-scheduler
  2. scheduler framework:插件实现,源码层面实现plugin,重新编译kube-scheduler

配置修改

创建一个policy.cfg文件,内容为:

{"kind":"Policy","apiVersion":"v1","priorities":[{"name":"LeastRequestedPriority","weight":100}]}

修改集群配置中的自定义服务参数中的scheduler参数:

services:
  scheduler:
    extra_args:
      policy-config-file: /policy.cfg

scheduler会读取根目录中的cfg文件

所以需要把创建的该文件拷贝到scheduler组件中:

docker cp policy.cfg kube-scheduler:/policy.cfg && docker start kube-scheduler

kube-scheduler即为scheduler运行的container ID

可以进入scheduler容器查看cfg文件是否已成功拷贝:

docker exec -it kube-scheduler bash
实际效果

LeastRequestedPriority优选调度算法会计算pod所需cpu和内存在当前节点可用资源的百分比
百分比越小,说明节点资源越充足,更容易得分,pod更倾向向改节点调度
修改配置之前,节点资源使用情况如下:

默认调度策略是轮询调度,副本数为9,每个节点分配三个pod

使用stress工具给32节点加压,cpu使用量增加,并修改配置(配置LeastRequestedPriority算法)

调度至32节点的pod减少

插件实现

pod调度流程以及对应的scheduler plugins扩展点如下,可以看出scheduler整个调度流程可以分为如下两个阶段:

调度器

  1. scheduling cycle:选择出一个节点以供pod运行,主要包括预选&优选,串行执行(一个pod调度完成后才调度下一个)
  2. binding cycle:将scheduling cycle选择的node与pod进行绑定,主要包括bind操作,并发执行(并发执行不同pod的绑定操作)

这里按照调用顺序依次介绍各个plugin扩展点:

  • Queue sort:用于对scheduelr优先级队列进行排序,需要实现"less(pod1, pod2)"接口,且该插件只会生效一个
  • Pre-filter:用于检查集群和pod需要满足的条件,或者对pod进行预选 预处理,需要实现"PreFilter"接口
  • Filter:对应scheduler预选算法,用于根据预选策略对节点进行过滤
  • Pre-Score:对应"Pre-filter",主要用于优选 预处理,比如:更新cache,产生logs/metrics等
  • Scoring:对应scheduler优选算法,分为"score"(Map)和"normalize scoring"(Reduce)两个阶段
  • score:并发执行node打分;同一个node在打分的时候,顺序执行插件对该node进行score
  • normalize scoring:并发执行所有插件的normalize scoring;每个插件对所有节点score进行reduce,最终将分数限制在[MinNodeScore, MaxNodeScore]有效范围
  • Reserve(aka Assume):scheduling cycle的最后一步,用于将node相关资源预留(assume)给pod,更新scheduler cache;若binding cycle执行失败,则会执行对应的Un-reserve插件,清理掉与pod相关的assume资源,并进入scheduling queue等待重新调度
  • Permit:binding cycle的第一个步骤,判断是否允许pod与node执行bind,有如下三种行为:
  • approve:允许,进入Pre-bind流程
  • deny:不允许,执行Un-reserve插件,并进入scheduling queue等待重新调度
  • wait (with a timeout):pod将一直持续处于Permit阶段,直到approve,进入Pre-bind;如果超时,则会被deny,等待重新被调度
  • Pre-bind:执行bind操作之前的准备工作,例如volume相关的操作
  • Bind:用于执行pod与node之间的绑定操作,只有在所有pre-bind plugins相关操作都完成的情况下才会被执行;另外,如果一个bind插件选择处理pod,那么其它bind插件都会被忽略
  • Post-bind:binding cycle最后一个步骤,用于在bind操作执行成功后清理相关资源
开发过程

要实现一个调度器插件必须满足两个条件:

必须实现对应扩展点插件接口

将此插件在调度框架中进行注册。
每个扩展点的插件都必须要实现其相应的接口,所有的接口定义在
https://github.com/kubernetes/kubernetes/pkg/scheduler/framework/interface.go

参考

k8s调度器插件开发

k8s调度器调度策略配置修改

彻底搞懂k8s调度框架与插件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DolphinScheduler是一款开源的分布式任务调度系统,可以实现自动化地调度和执行各种任务。如果需要对DolphinScheduler进行二次开发,并进行打包,需要按照以下步骤进行: 1. 克隆DolphinScheduler的源代码:在Github上找到DolphinScheduler的仓库并将其克隆到本地。 2. 将开发代码添加到源代码中:根据自己的需求,在克隆的源代码中添加新的功能或修改现有功能。可以根据实际情况修改调度器、执行器、调度API等。 3. 配置、编译和打包:根据二次开发所需的配置信息,修改`conf`目录下的相关配置文件。使用maven对代码进行编译,可以运行`mvn clean package -Dmaven.test.skip=true`命令进行打包,该命令会在`target`目录下生成打包结果。 4. 部署和运行:将打包的结果部署到服务器上,包括调度服务器和执行器节点。根据DolphinScheduler的部署文档将相关的配置文件、依赖库、打包结果等拷贝到相应的位置。运行DolphinScheduler的启动脚本以启动调度服务器和执行器节点。 5. 测试和验证:根据自己的需求进行相应的测试和验证,确保二次开发的功能能够正常运行。进行功能测试、性能测试、兼容性测试等,确保系统的稳定性和可靠性。 需要注意的是,二次开发需要对DolphinScheduler的源代码有一定的了解和熟悉。在进行二次开发之前,可以先阅读官方文档、源代码以及相关的社区讨论,这样能更好地理解整个系统的架构和设计理念,更方便进行二次开发和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值