3. Scheduler 调度器架构:调度器组件、调度队列、调度算法、调度周期、与 API Server 交互

Kubernetes Scheduler(kube-scheduler)是控制平面中负责将待调度 Pod 绑定到合适 Node 的核心组件。在集群升级与证书轮换场景中,理解调度器内部架构是制定节点排空策略的前提——只有掌握调度器如何选择 Pod、如何与 API Server 交互,才能准确预判排空过程中哪些 Pod 会被重新调度、哪些 Node 会进入“不可调度”状态。

3.1 调度器组件架构

kube-scheduler 采用插件化架构,内部由三大核心模块构成:调度队列、调度框架(Scheduling Framework)和 绑定循环。调度框架通过注册一系列插件(Plugin)来实现调度算法,每个插件在调度周期的特定扩展点(Extension Point)执行。

关键组件表:
组件 职责 与排空的关系
调度队列 管理待调度 Pod 的优先级排序与重试 排空时 Pod 被驱逐后进入队列等待重新调度
调度框架 定义扩展点,执行 Filter/Score/Normalize/Bind 等插件 决定排空后的 Pod 能否找到合适 Node
绑定循环 将调度结果写入 API Server(Pod 与 Node 的绑定关系) 绑定失败会导致 Pod 卡在 Pending 状态
缓存(Scheduler Cache) 缓存 Node 和 Pod 状态,减少对 API Server 的读请求 缓存过期可能导致调度决策基于过时数据
Scheduler 组件架构图 调度队列 PriorityQueue 待调度 Pod 排序 调度框架 Scheduling Framework 扩展点 + 插件 绑定循环 Binding Cycle 写入 API Server Scheduler Cache Node/Pod 状态缓存 API Server etcd 持久化 说明: 调度器通过 Informer 机制监听 API Server 的 Pod/Node 变更事件, 将待调度 Pod 放入队列,经过调度框架筛选打分后,由绑定循环写入绑定结果。 缓存层减少对 API Server 的直接读请求,提升调度吞吐量。

3.2 调度队列(Scheduling Queue)

调度队列是调度器的入口,负责管理所有等待调度的 Pod。kube-scheduler 默认使用 PriorityQueue 实现,内部维护三个子队列:

  • ActiveQ(活跃队列):存放所有可以立即调度的 Pod,按优先级排序。
  • BackoffQ(退避队列):存放调度失败后需要等待一段时间才能重试的 Pod,退避时间指数增长。
  • UnschedulableQ(不可调度队列):存放因资源不足、节点不可用等原因无法调度的 Pod,等待集群状态变化后重新评估。
排空场景提示:当节点被排空时,该节点上的 Pod 被驱逐后进入 UnschedulableQ 或 ActiveQ(取决于 Pod 是否设置了优先级和抢占策略)。如果集群中其他节点资源不足,Pod 可能长时间停留在 UnschedulableQ,导致服务降级。运维人员应提前评估集群剩余容量。

3.3 调度算法与调度周期

调度器将每个 Pod 的调度过程分为两个阶段:调度周期(Scheduling Cycle)和 绑定周期(Binding Cycle)。调度周期是串行的,绑定周期可以并行执行。

3.3.1 调度周期(Scheduling Cycle)

调度周期包含以下扩展点,每个扩展点可以注册多个插件:

扩展点 插件类型 作用
QueueSort 排序 定义 Pod 在队列中的排序规则(默认按优先级)
PreFilter 预过滤 检查 Pod 的调度约束(如 NodeSelector、Affinity)
Filter 过滤 筛选出满足 Pod 资源需求的 Node(如 CPU、内存、端口)
PostFilter 后过滤 当所有 Node 都被过滤掉时,执行抢占或标记不可调度
PreScore 预打分 运行评分前的准备工作
Score 打分 对通过过滤的 Node 进行评分(0-100)
NormalizeScore 归一化 将多个插件的评分结果合并为最终分数
Reserve 预留 在缓存中预留 Pod 的资源,防止并发调度冲突
Permit 许可 允许或拒绝调度结果(可用于实现调度门控)

3.3.2 绑定周期(Binding Cycle)

绑定周期在调度周期之后执行,包含以下扩展点:

  • PreBind:绑定前的准备工作(如 CNI 网络分配、存储卷挂载准备)。
  • Bind:将 Pod 与 Node 的绑定关系写入 API Server(通过 POST /api/v1/namespaces/{ns}/pods/{name}/binding)。
  • PostBind:绑定成功后的清理或通知操作。
调度周期与绑定周期流程 调度周期(串行) QueueSort PreFilter Filter PostFilter Score NormalizeScore Reserve Permit 绑定周期(可并行) PreBind Bind PostBind 注意: 绑定周期可以并行处理多个 Pod 的绑定, 但调度周期必须串行执行以保证一致性。

3.4 与 API Server 的交互

kube-scheduler 与 API Server 的交互主要通过 Informer 机制 和 REST API 完成。理解这些交互对于排空操作至关重要,因为排空过程中调度器需要实时感知 Node 状态变化和 Pod 驱逐事件。

3.4.1 监听机制(Informer)

调度器启动时会为 Pod、Node、PersistentVolumeClaim(PVC)、StorageClass 等资源创建 Informer,通过 List-Watch 模式从 API Server 获取资源变更事件:

  • List:启动时全量拉取资源列表,初始化缓存。
  • Watch:持续监听资源变更事件(ADDED/MODIFIED/DELETED),增量更新缓存。

3.4.2 写入操作

调度器对 API Server 的写入操作主要包括:

操作 API 路径 触发时机
Pod 绑定 POST /api/v1/namespaces/{ns}/pods/{name}/binding 调度周期完成后,将 Pod 绑定到选定 Node
Pod 状态更新 PATCH /api/v1/namespaces/{ns}/pods/{name}/status 更新 Pod 的调度相关状态(如 NominatedNodeName)
事件记录 POST /api/v1/namespaces/{ns}/events 记录调度失败原因、抢占事件等

3.4.3 证书轮换对交互的影响

证书轮换风险提示:当 kube-scheduler 的客户端证书轮换时,如果证书未正确更新或 API Server 的 CA 证书未同步,调度器与 API Server 之间的 TLS 握手将失败。具体表现为:Informer 的 Watch 连接断开,调度器无法感知新 Pod 和 Node 状态变化;绑定请求被拒绝,Pod 卡在 Pending 状态。在节点排空操作前,务必确认调度器证书轮换已完成且连接正常。

3.5 调度器高可用与 Leader Election

在生产环境中,kube-scheduler 通常以多副本方式部署,通过 Leader Election 机制保证同一时刻只有一个调度器实例执行调度决策:

  • 所有副本通过 API Server 的 kube-system/kube-scheduler Endpoint 或 Lease 对象竞争 Leader 角色。
  • Leader 实例负责执行调度周期和绑定周期,其他副本处于 Standby 状态。
  • 当 Leader 实例故障或证书轮换导致连接中断时,其他副本会在 Lease 过期后接管调度任务。
排空操作建议:在证书轮换期间,建议先轮换 Standby 副本的证书,确认其与 API Server 通信正常后再轮换 Leader 副本。这样可以避免调度中断,确保节点排空过程中调度器始终可用。