kube-scheduler
创始人
2024-05-30 00:28:35
0

kube-scheduler,它是 k8s 的默认调度器,负责为新创建出来的 pod寻找一个最合适的节点,这里的“最合适”指两种最优解:从集群中的所有节点中找出的全局最优解,和从集群中的部分节点中找出的局部最优解。它们分别可以解决调度器在小型和大型 k8s 集群规模上的性能问题,比如集群中有几百台主机时 kube-scheduler 采用全局最优解,当集群规模大时采用局部最优解。

那“最合适”的含义是指什么呢?它主要是通过两种调度算法的筛选:

  • Predicate(预选):过滤掉不满足条件的节点,选出所有可以运行该 pod 的节点。

  • Scheduler(优选):给上一步得到的结果中的每个节点打分,选出得分最高的节点为最终调度结果。

那怎么表示调度器对一个 pod 调度成功呢?实际上就是将它的 spec.nodeName 字段填上调度结果的节点名字。


Scheduler 调度机制工作原理

Scheduler 是作为单独程序运行的,它在启动之后会一直监听 API Server,获取 spec.nodeName 字段为空的 pod。调度算法执行完之后,调度器将 pod 对象的 nodeName 字段的值改成对应 node 的名字,表明 pod 应该放在哪个节点上。这个步骤在 k8s 中称为 Bind。

调度的具体过程可以总结为下图:

Scheduler 实际上就是两个独立的控制循环:

第一个循环(Informer Path)主要目的是启动一系列 informer 来监听(Watch) Etcd 中的 pod、Node、Service 等与调度相关的API对象的变化。比如,一个待调度的 pod 被创建出来之后,调度器就会通过 Pod Informer 的 Handler,将这个待调度的 pod 加入调度队列。

此外,调度器 informer 还要对调度器缓存(Schedule Cache) 进行更新。Predicates 调度算法执行时也是从缓存中取数据,从而提高算法执行效率。

第二个循环(Scheduling Path)主要是不断从调度队列中 pop 出 pod,然后调度器启动多个goroutine,以节点为粒度并发执行 Predicates 算法进行过滤并得到一组节点,即可以运行这个 pod 的宿主机列表。再以 MapReduce 方式并发执行 Priorities 算法为列表中的节点打分,分数从0到10,得分最高的节点会作为这次调度的结果,并完成 Bind 的一系列操作,最后更新 Schedule Cache 里的 pod 和 node 信息。


Scheduler 的优先级和抢占机制

以上是调度机制的工作原理,那如果 pod 调度失败怎么办呢?正常情况下,当一个 pod 调度失败后,就会被暂时搁置处于 pending 状态,直到 pod 被更新或者集群状态发生变化,调度器才会对这个 pod 进行重新调度。但在实际业务场景中存在在线和离线业务之分。如果在线业务的 pod 由于资源不足而调度失败时,在线业务就需要抢占离线业务的资源,此时用到的就是 Scheduler 的优先级和抢占机制了。

  • 优先级:高优先级的 pod 可能比低优先级的 pod 提前出队,从而尽早完成调度过程。

  • 抢占:当一个高优先级的 pod 调度失败时触发调度器的抢占能力,当某个节点上的一个或多个低优先级 pod 被删除之后,待调度的高优先级 pod 就可以被调度到该节点上。

抢占过程简言之就是两步:

  1. 将抢占者 Pod 的 spec.nominatedNodeName 字段设置为被抢占节点的名字。

  1. 在下个调度周期决定是否在被抢占节点上运行。

这样设计的一个重要原因是考虑到调度器只会通过向API Server 发起请求,触发 DELETE API 来删除被抢占的 pod,所以在这些 pod “优雅退出”时间内(默认是30s)其他节点也有可能变成可调度的,或者有新的节点被添加到这个集群中。鉴于优雅退出时期集群的可调度性可能会发生变化,所以把抢占者交给下一个调度周期再处理。

在抢占者等待被调度的过程中,如果有优先级更高的 pod 来抢占同一节点,调度器就会清空原抢占者的 spec.nominatedNodeName 字段,从而允许更高优先级的抢占者执行抢占,这也使得原抢占者本身也有机会去重新抢占其他节点。

那么,Scheduler 的抢占机制是如何设计的呢?一个最重要的设计是调度队列中实现了两个不同的队列:

  • activeQ:存放下一个调度周期需要调度的对象。在集群中新建的 pod 都会入队到 activeQ,调度时也是从 activeQ 中出队。

  • unschedulableQ:存放调度失败的 pod。当 unschedulableQ 里的 pod 更新后,调度器会把这个 pod 移到 activeQ。

抢占基本流程图如下:

  1. 集群中新建的 pod 先放到 activeQ 中经过正常的调度策略进行调度;

  1. 调度失败后,将该 pod 放入 unschedulableQ;

  1. 检查失败原因,已确认抢占能否帮助抢占者找到新节点;

  1. 确定可以抢占后,从 Schedule Cache 中复制所有节点信息,用副本模拟抢占流程(基于影响集群稳定性最小原则,即被抢占的 pod 越少越好,优先级越低越好);

  1. 检查选中的“牺牲者”列表,清理这些 pod 的 nominatedNodeName 字段;

  1. 更新抢占者pod,将 nominatedNodeName 改成第4步选出的 node 名字;

  1. 由于抢占者 pod 已发生了更新,所以给他“重新做人”的机会,重新放入 activeQ 里;

  1. 同时,开启一个新的协程,清理牺牲者 node 上对应的牺牲者 pod。

相关内容

热门资讯

清华同方系统安装黑屏,清华同方... 清华同方电脑系统安装黑屏问题解析及解决方法一、黑屏原因分析1. 硬件故障:电脑硬件故障是导致系统安装...
安装治安系统入账,治安系统安装... 治安系统安装入账流程详解随着社会治安形势的日益复杂,治安系统的安装与维护已成为保障社会安全的重要手段...
安卓安装win7系统,如何在安... 如何在安卓设备上安装Windows 7系统一、准备工作在开始安装Windows 7之前,您需要做好以...
安装原版系统bootmgr 安装原版系统Bootmgr:解决系统引导问题 重拾流畅体验在电脑使用过程中,我们可能会遇到各种...
宝塔系统安装证书,宝塔系统安装... 宝塔系统安装SSL证书的详细教程随着网络安全意识的不断提高,越来越多的网站开始使用SSL证书来保障用...
安卓怎么安装系统更新包,安卓手... 安卓手机系统更新包安装指南一、通过官方渠道更新系统1. 打开手机设置首先,在手机主屏幕上找到并点击“...
安装在虚拟机的系统怎么安装wi... 如何在虚拟机中安装Windows 7系统 准备阶段在开始安装Windows 7系统之前,我们需要做一...
安装显卡导致系统崩溃,原因与解... 显卡驱动安装不当导致系统崩溃:原因与解决方法随着电脑硬件的不断发展,显卡作为电脑性能的重要组成部分,...
报警系统安装联网,守护安全,构... 报警系统安装联网:守护安全,构建智慧社区随着社会的发展和科技的进步,报警系统的安装与联网已经成为现代...
安卓系统凭密码安装应用,安全与... 安卓系统凭密码安装应用:安全与便捷的双重保障随着智能手机的普及,安卓系统因其开放性和丰富的应用生态而...
北斗定位系统模块安装,技术革新... 北斗定位系统模块安装:技术革新助力多领域发展一、北斗定位系统模块简介北斗定位系统是我国自主研发的全球...
白城电脑系统安装价钱,电脑系统... 白城电脑系统安装价格一览,让您明明白白消费一、电脑系统安装的必要性电脑系统是电脑的核心组成部分,它负...
驱动安装卡在系统检查,驱动安装... 驱动安装卡在系统检查怎么办?解决方法大揭秘在电脑使用过程中,我们经常会遇到各种问题,其中驱动安装卡在...
安装鱼缸底滤系统,鱼缸底滤系统... 鱼缸底滤系统安装全攻略鱼缸底滤系统是维护鱼缸水质的重要设备,它能有效过滤掉鱼缸中的杂质和有害物质,为...
清洁大师如何安装系统,清洁大师... 清洁大师U盘安装系统教程一、准备工作在开始安装系统之前,我们需要做好以下准备工作: 准备一个至少2...
安装系统展开文件时蓝屏,安装系... 安装系统展开文件时蓝屏的原因及解决方法在电脑使用过程中,遇到安装系统展开文件时蓝屏的情况,无疑会让用...
清灰后安装系统更新,电脑清灰后... 电脑清灰后,系统更新的重要性与操作指南随着电脑使用时间的增长,灰尘的积累会严重影响电脑的散热性能,进...
安装系统找不到驱动盘,安装系统... 安装系统时找不到驱动盘的解决方法详解在安装操作系统时,有时候会遇到找不到驱动盘的情况,这可能会让许多...
安装系统装载虚拟光驱,如何使用... 如何使用虚拟光驱安装操作系统——轻松实现系统升级与备份一、什么是虚拟光驱?虚拟光驱是一种软件,它可以...
斑马打印系统安装包,轻松实现高... 斑马打印系统安装包:轻松实现高效打印解决方案随着信息技术的飞速发展,打印技术在工业生产、办公自动化等...