Scheduling Framework
2019-11-03 本文已影响0人
allenhaozi
背景
随着Kubernetes被越来越多的个人及公司使用, 需要越来越强大的调度能力, 面对不同的或者更复杂的场景, 调度器就会添加更多的特性来满足, 代码量会越来越大, 逻辑更复杂, 这样维护成本越来越大, 同时提供webhook的方式扩展调度, 让用户可以根据自己实际场景来来开发自定义的调度器, 但是自定义调度器也存在诸多问题
- 调度器的扩展方式是有限制的, Filter逻辑一定是在默认的predicate之后运行
- http + json 形式的调用效率问题
- 原生的scheduler和extender scheduler是两个独立的服务, 不同共享原生的
informer cache
scheduling framework 解决如上问题, 提供了
- 使调度更具扩展性
- 将调度器的一些feature移到插件中, 使它变得更简单
- 提供一种机制来接收插件结果并根据接收到的结果继续或终止
- 提供一种机制处理错误与插件通信
调度过程
Scheduling Cycle & Binding Cycle
- Scheduling Cycle
调度逻辑, 这个逻辑运行各种插件, 完成一个将Pod绑定到一个Node上, 这个是一个串行的过程
- Binding Cycle
绑定逻辑, 负责将调度结果落地到集群中, 这是一个可以并行的结果
如下图
20180409-scheduling-framework-extensions.png
Reserve plugin
调度逻辑的最后一个插件, 防止调度成功后资源的竞争, 确保集群的资源视图准确, 也是串行逻辑的最后一个流程, 生命周期随着unreserve 或者 Post-bind 成功
Permit 插件
提供阻止或者延迟一个Pod的绑定( 牛逼的设计)
- approve
所有的Permit插件通过的Pod, 才会真正的被绑定 - deny
如果任何permit插件拒绝pod,它将返回到调度队列。这将触发un-reserve - wait
如果Permit插件返回“wait”,那么pod将keep in Permit phase,直到Permit插件允许它, 同时提供超时机制, 超时机制同样会触发un-reserve插件