1. Kube-scheduler 架构总览:调度器核心组件、调度框架与扩展点概览

Kube-scheduler 是 Kubernetes 控制平面的核心组件之一,负责将待调度的 Pod 绑定到最合适的 Node 上。本章从宏观架构出发,梳理调度器的内部组件、调度框架(Scheduling Framework)的设计理念以及各扩展点(Extension Points)的职责,为后续的调优与漂移复测打下基础。

1.1 调度器核心组件

Kube-scheduler 以 “调度队列 → 调度周期 → 绑定周期” 三阶段循环运行,每个阶段由独立组件协作完成:

组件 职责 关键数据结构/行为
Scheduling Queue 管理待调度 Pod 的优先级队列 activeQ / backoffQ / unschedulableQ
Scheduler Cache 缓存集群 Node 与 Pod 的实时状态 nodeInfoMap / assumedPods
Scheduler Framework 插件化调度引擎,驱动扩展点调用链 Plugin 注册表 / CycleState
Schedule One 单个 Pod 的调度主流程 Filter → Score → Normalize → Select
Binder 将调度结果写入 API Server POST /api/v1/namespaces/{ns}/bindings
💡 关键认知: Scheduler Cache 是调度器性能的瓶颈之一。Cache 与 API Server 之间通过 Watch 机制同步,任何 Watch 延迟都会直接导致调度决策基于过期数据,引发调度漂移。

1.2 调度框架(Scheduling Framework)设计理念

Kubernetes 从 v1.19 开始将调度器重构为 插件化架构,即 Scheduling Framework。其核心思想是将调度流程拆解为多个 扩展点(Extension Points),每个扩展点可以插入一个或多个插件(Plugin),插件按顺序执行,共同完成调度决策。

框架带来的优势:

  • 可扩展性:无需修改调度器核心代码,通过编写插件即可实现自定义调度策略。
  • 可组合性:多个插件可以串联或并联,灵活组合过滤、评分、预留等行为。
  • 可观测性:每个扩展点都有明确的 Metrics 和日志,便于定位调度瓶颈。
Kube-scheduler 调度框架与扩展点架构 Kube-scheduler 调度框架与扩展点架构 Scheduling Queue 调度周期(Scheduling Cycle) PreFilter Filter PostFilter PreScore Score NormalizeScore 绑定周期 Reserve PreBind Bind 扩展点按顺序执行,每个扩展点可注册多个插件;插件通过实现对应接口参与调度决策。 调度周期结束后进入绑定周期,绑定周期失败会触发 Unreserve 扩展点回滚预留资源。

1.3 扩展点详解

调度框架定义了 11 个扩展点,分布在调度周期和绑定周期中。下表列出每个扩展点的触发时机与典型用途:

阶段 扩展点 触发时机 典型插件示例
调度周期 PreFilter Pod 调度前预处理 NodeResourcesFit 预检查
Filter 过滤不满足条件的 Node NodeUnschedulable / NodePorts
PostFilter 所有 Node 被过滤后执行 DefaultPreemption 抢占
PreScore 评分前预处理 PodTopologySpread 预计算
Score 对通过过滤的 Node 打分 NodeResourcesBalancedAllocation
NormalizeScore 对评分结果归一化 ImageLocality 归一化
绑定周期 Reserve 在 Cache 中预留资源 VolumeBinding 预留 PVC
PreBind 绑定前预处理 NodeAffinity 校验
Bind 执行绑定写入 API Server DefaultBinder
PostBind 绑定成功后通知 Metrics 记录
Unreserve 绑定失败时回滚预留 VolumeBinding 回滚
🎯 调优切入点: 调度漂移通常发生在 Filter 和 Score 扩展点。例如,Node 资源利用率数据更新延迟导致 Filter 误判,或 Score 权重配置不合理导致 Pod 频繁迁移。后续章节将针对这些扩展点进行参数调优与漂移复测。

1.4 调度器工作流程总览

结合上述组件与扩展点,Kube-scheduler 的完整工作流程可概括为以下步骤:

  1. Pod 入队:新创建的 Pod 或重试的 Pod 进入 Scheduling Queue。
  2. 出队调度:调度器从队列中取出一个 Pod,开始调度周期。
  3. 过滤(Filter):依次执行 PreFilter、Filter、PostFilter 扩展点,筛选出候选 Node 列表。
  4. 评分(Score):对候选 Node 执行 PreScore、Score、NormalizeScore,计算每个 Node 的最终得分。
  5. 选择 Node:选择得分最高的 Node(若多个 Node 同分则随机选择)。
  6. 绑定(Bind):进入绑定周期,执行 Reserve、PreBind、Bind,将 Pod 绑定到选定 Node。
  7. 结果处理:绑定成功则更新 Cache 并记录 Metrics;失败则触发 Unreserve 回滚,Pod 重新入队。
Kube-scheduler 工作流程泳道图 Kube-scheduler 工作流程泳道图 Scheduling Queue Pod 入队 Pod 出队 重新入队 调度周期 PreFilter → Filter → PostFilter PreScore → Score → NormalizeScore 选择最优 Node 绑定周期 Reserve PreBind Bind → PostBind 绑定失败 → Unreserve → 重新入队
⚠️ 漂移风险提示: 调度周期与绑定周期之间没有事务保证。如果绑定周期失败,Cache 中已预留的资源需要通过 Unreserve 回滚,但回滚期间其他调度器可能已经读取了过期的 Cache 数据,导致调度冲突。这是调度漂移的重要来源之一,后续章节将专门讨论如何通过调优减少此类冲突。

1.5 本章小结