两张大图一次性讲清楚k8s调度器工作原理

kube-scheduler负责将k8s pod调度到worker节点上。

当你部署pod时,在manifest文件pod规格上会指定cpu、memory、亲和性affinity、污点taints、优先级、持久盘等。

调度器的主要工作是识别create request然后选择满足要求的最佳节点。

分步解释:

  1. Pod Create Request: 外部系统(kubectl、cicd)发出了创建一个新pod的请求。

  2. kube-api server收到请求,然后将pod状态保存到etcd(集群的分布式kv存储)。

  3. api server给外部系统回发确认信息。

  4. kube scheduler持续监听unassignedods (使用watch机制),注意到新的pod。

4.1. scheduler会根据pod的规格(cpu、memory、亲和性)决定pod应在哪个节点上运行,并创建pod-node binding,它会将此绑定决定通知api server。

  1. scheduler更新etcd中pod的状态(通过api server): ① 标记pod为"scheduled"状态 ② 记录被分配的节点。

  2. 被选中节点上的kubelet, 也会持续监听新pod分配(使用watch机制),侦测到最新的已经分配的pod。

  3. kubeletapi server拉取pod manifest信息, 内容包含启动需要的镜像、volume、网关配置。

  4. kubelet指示容器运行时为pod启动容器。

  5. kubelet 通知apiserver: 现在 pod 已与节点绑定。

  6. api server更新etcd 中pod的最终状态,确保当前状态正确反映到集群数据库etcd。


4.1 kube-scheduler是如何选中节点?

在k8s集群,会存在不止一个节点,scheduler是如何从所有worker节点中选中节点。

scheduler一般包含两阶段:

  • 调度期
  • 绑定期

调度期

在这个时期,kueb-scheduler使用过滤打分策略选择最佳节点。

过滤Filtering :cheduler找到pod能被调度的最合适的节点。

从本质上讲,它会利用pod规格(cpu、memory、亲和性、污点、持久盘)过滤掉不适合运行特定pod的节点。

对于大集群, 过滤之后, 也不会对剩下的所有节点都做打分。

scheduler有一个配置参数percentageOfNodesToScore决定了参与打分的节点比例。 默认值取决与集群大小:小集群50%--->大集群5%

即使这个百分比被设置的很小,scheduler会持续搜索直到找到了𝗺𝗶𝗻𝗙𝗲𝗮𝘀𝗶𝗯𝗹𝗲𝗡𝗼𝗱𝗲𝘀𝗧𝗼𝗙𝗶𝗻𝗱数量。

Scoring: 给节点打分, scheduler给节点排名

k8s使用Priorities(Scorers)来给节点打分,打分机制通过各种scheduling 插件来实现。

  1. pod priority: 高优先级的pod通过影响打分过程影响节点选择(高优Pod会先于低优Pod被调度)。
  2. pod拓扑分布: 确保 pod 分布在不同的拓扑域(如区域或节点)中,避免在一个地方集中过多pod。

scheduler通过调用多个调度插件给节点打分, 每个插件都会根据特定标准对节点进行评估,并累计到最终得分。

最后,排名最高的worker节点会被选中调度pod。如果所有节点的排名相同,则会随机选择一个节点。

一旦节点被选中,调度器在api server创建了binding event(pod+node)。

绑定期

scheduler尝试将pod绑定到得分最高的节点,如果绑定失败,scheduler一般会选用次高得分的节点。


自定义Scheduler

开发者可以创建自定义scheduler,在集群内和原生调度器一起运行。

当部署pod时,可以在pod manifest文件指定自定义的Scheduler, 这样调度器的调度决定就会基于你自定义的调度逻辑。

Pluggable Scheduling Framework

调度器有一个可插拔的调度框架,这意味着开发者可以在调度工作流中添加自定义的插件。

相关推荐
张忠琳10 小时前
【Go 1.26.4】Golang Channel 深度解析
开发语言·后端·golang
Rain50910 小时前
2.1 Nest.js 项目初始化与模块化架构
开发语言·前端·javascript·后端·架构·数据分析·node.js
cjp56010 小时前
009. ASP.NET WEB API 用户关联esp32设备
前端·后端·asp.net
贺国亚11 小时前
Text-to-SQL与Analytics-Agent
后端
一只叫煤球的猫11 小时前
ThreadForge 源码解读二:一个 Task 从 submit 到完成,内部到底发生了什么?
java·后端·面试
苏三说技术11 小时前
AgentScope Java 2.0 正式发布了!
后端
ping某11 小时前
一个“日志备份”需求,为什么会牵出整个 Linux 日志系统?
后端·架构
血小溅12 小时前
Spring AI 对 Skill/MCP 的支持全景整理
后端
晓杰'12 小时前
从0到1实现Balatro游戏后端(8):Skip Blind与Tag奖励机制设计与实现
后端·websocket·typescript·项目实战·nestjs·状态管理·游戏服务器
叫我:松哥12 小时前
基于Flask框架的校园二手书籍交易平台,注重校园场景的特殊需求,通过学号认证保障用户真实性
后端·python·sqlite·flask·bootstrap