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