41 | 十字路口上的Kubernetes默认调度器
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
Kubernetes默认调度器是Kubernetes项目中的核心组件之一,负责为新创建的Pod寻找最合适的节点。调度器通过一系列调度算法来选择可运行该Pod的节点,并最终确定最适合的节点。调度器的工作原理包括Informer Path和Scheduling Path两个控制循环,通过监听Etcd中的API对象变化和并发执行算法来提高执行效率。调度器还采用了Cache化和乐观绑定的设计,避免了全局竞争资源和锁同步带来的性能损耗。随着Kubernetes项目的发展,对默认调度器进行扩展和重新实现成为社区的主要诉求,因此默认调度器正在经历大量重构,以提高可扩展性和性能。Scheduler Framework的设计为用户提供了自定义调度器的能力,使得扩展和自定义Kubernetes的默认调度器变得非常容易实现。这一设计符合Kubernetes的“民主化”设计思路,但也存在接口设计不合理可能导致整个生态无法很好地使用插件机制的问题。总的来说,Kubernetes默认调度器的发展方向是向着组件的轻量化、接口化和插件化发展,以满足不断增长的集群规模和复杂业务的需求。在 Kubernetes 的整体架构中,kube-scheduler 的责任虽然重大,但其实它却是在社区里最少受到关注的组件之一。调度这个事情,在不同的公司和团队里的实际需求一定是大相径庭的,上游社区不可能提供一个大而全的方案出来。因此,将默认调度器进一步做轻做薄,并且插件化,才是 kube-scheduler 正确的演进方向。Kubernetes默认调度器与Mesos的“两级”调度器相比,都致力于提高集群资源的利用率和任务的调度效率,但在实现方式和架构设计上存在一些差异。Kubernetes默认调度器更加注重轻量化、接口化和插件化的发展方向,以满足不断增长的集群规模和复杂业务的需求。而Mesos的“两级”调度器则采用了不同的架构,将资源的分配和任务的调度分为两个阶段,以实现更灵活的资源管理和调度策略。这些差异体现了两者在调度理念和架构设计上的不同取向。
《深入剖析 Kubernetes》,新⼈⾸单¥68
全部留言(19)
- 最新
- 精选
- CYH问题回答:messos二级调度是资源调度和业务调度分开;优点:插件化调度框架(用户可以自定义自己调度器然后注册到messos资源调度框架即可),灵活可扩展性高.缺点:资源和业务调度分开无法获取资源使用情况,进而无法做更细粒度的调度.k8s调度是统一调度也就是业务和资源调度进行统一调度,可以进行更细粒度的调度;缺点其调度器扩展性差。以上是本人拙见,请老师指正。
作者回复: 一点都不拙!
2018-11-29383 - Vip He老师您好,这个pod调度过程是并行的吗还是一个一个pod调度?
作者回复: 串行的
2019-05-26326 - Jasper2021年了,来还18年没读完的债。在老孟的指导下学习,再回首张磊老师的文章,感慨万千2021-10-31714
- dgonly调度器对APIServer的更新失败,Bind过程失败,老师说等schedule cache同步后就恢复正常,这个怎么理解? 我理解是informer path继续watch,发现pod没有被bind到node就继续执行一遍调度流程吗?如果某种原因更新APIServer一直失败,会不会就一直执行重新调度的操作,有没有一种类似重试超过一定比如就丢弃的机制。谢谢!2018-11-2629
- 陈斯佳第四十一课:十字路口上的Kubernetes默认调度器 K8s项目中默认调度器的主要职责是就是为了新创建出来的Pod寻找一个最合适的Node。 调度器首先会调用一组叫Predicate的调度算法,来检每一个Node。然后再调用一组叫作Priority的调度算法来给上一步得到的结果里的每一个Node打分。最终的调度结果就是得分最高的那个Node。 Kubernetes 的调度器的核心,实际上就是两个相互独立的控制循环。第一个是Informer Path,主要是启动一系列Informer用来监听(Watch)Etcd中的Pod,Node, Service等与调度相关的API对象的变化。此外,Kubernetes 的默认调度器还要负责对调度器缓存(即:scheduler cache)进行更新。事实上,Kubernetes 调度部分进行性能优化的一个最根本原则,就是尽最大可能将集群信息 Cache 化,以便从根本上提高 Predicate 和 Priority 调度算法的执行效率。第二个控制循环是Scheduling Path,主要逻辑是不断从调度队列里调出Pod,然后用Predicates算法进行过滤,得到一组可以运行这个Pod的宿主机列表,然后再用Priority打分,得分高的称为Pod结果。2021-11-024
- loda想请教个问题,kubernetes如何保证用户能提前知道这次调度能否成功? 场景:很多公司都希望提前就发现资源池余量是否充足,从而决定是要加机器还是可以继续扩容 拙见: 1.scheduler的缓存其实是一个非常重要的数据,可以提供当前时刻调度能否成功的视图,但是直接暴露出来不太符合kubernetes以apiserver为依据的原则 2.提供余量检查接口,实时查询apiserver中所有pod和node,根据扩容参数算出剩余资源量。不过规模大后,对集群压力太大 3.定时采集上述指标,缺点是实时性太差 4.监听pod crud,自己独立维护一个和scheduler一样的缓存或持久话数据,每次基于这个数据判断剩余量。缺点是维护成本较高,容易出现数据不一致 想问下,有没有更合适的方式?2018-12-0954
- 宋晓明老师 刚才遇到一个问题 我初始化的时候 分配的ip范围是10.64.200.0/22 然后两个master 3个node kubernetes自己分配master分别是200.0/24 201.0/24 然后其他两个node是202.0/24 203.0/24 其实这些范围已经用满了 在加第三个node 在master看也成功了 但创建多个pod的时候 第三个node上的pod是失败的,后来发现第三个node上kube-bridge网桥上没有IP地址,需求是:因为master上不会有自己创建的pod的,所以master上地址段有点浪费,我如何把master上空闲的地址段用到新增node上,还是不用管,还是怎么样?2018-11-273
- 凌如果能结合源码将解决就更好了,不知道相关代码在哪啊2019-01-2512
- Jake2023年了,来还18年没读完的债。在老孟的指导下学习,再回首张磊老师的文章,感慨万千2023-06-20归属地:上海1
- 小寞子。(≥3≤)2021年,找到代码了 https://github.com/kubernetes-sigs/scheduler-plugins/blob/master/pkg/trimaran/handler.go 不知道这是不是正确的地方。2021-01-281