1. 调度器基础:Kubernetes 调度器架构概述、调度流程、调度框架与扩展点
1.1 调度器在集群中的角色
Kubernetes 调度器(kube-scheduler)是控制平面的核心组件之一,负责将待调度的 Pod 绑定到最合适的 Node 上。它不负责运行 Pod,而是通过监听 API Server 中未调度的 Pod(spec.nodeName 为空),为每个 Pod 选择一个最优节点,并将绑定结果写回 API Server。
关键职责: 调度器只做“决策”,不执行“创建”。真正的 Pod 运行由 kubelet 完成。
1.2 调度器架构概述
kube-scheduler 采用“插件化”架构,核心调度循环通过一系列可配置的插件(调度框架扩展点)完成过滤、打分、绑定等操作。其内部主要模块包括:
- 调度队列(Scheduling Queue): 存储待调度的 Pod,支持优先级排序、重试、背压等机制。
- 调度框架(Scheduling Framework): 定义了一组扩展点接口,允许用户通过插件定制调度行为。
- 缓存(Scheduler Cache): 维护集群中 Node 和 Pod 的快照,避免每次调度都从 API Server 拉取全量数据。
- 绑定器(Binder): 将调度结果(Pod 与 Node 的绑定关系)写入 API Server。
架构特点: 调度器本身是无状态的,所有状态都存储在 API Server 和缓存中,支持高可用部署(多个副本通过 leader election 选主)。
1.3 调度流程:从 Pod 创建到绑定
一个 Pod 从创建到被调度到 Node 上,经历以下核心步骤:
- Pod 入队: 调度器通过 Informer 监听未调度的 Pod,将其加入调度队列。
- 调度周期(Scheduling Cycle): 从队列中取出 Pod,依次执行过滤、打分、优选等扩展点,最终选出一个最优 Node。
- 绑定周期(Binding Cycle): 将选中的 Node 与 Pod 进行绑定,写入 API Server。
- 异步确认: 调度器异步等待绑定结果,若失败则重新入队或重试。
| 阶段 | 主要操作 | 扩展点 |
|---|---|---|
| 调度周期 | 过滤不可用节点、对可用节点打分、选择最优节点 | PreFilter, Filter, PostFilter, PreScore, Score, NormalizeScore |
| 绑定周期 | 预留资源、等待许可、执行绑定、清理缓存 | Reserve, Permit, PreBind, Bind, PostBind |
注意: 调度周期和绑定周期是串行的,但多个 Pod 的调度周期可以并行执行。绑定周期通常比调度周期耗时更长(涉及 API 写入)。
1.4 调度框架与扩展点
调度框架(Scheduling Framework)是 Kubernetes 1.15+ 引入的插件化调度架构,它将调度流程拆分为多个明确定义的扩展点(Extension Points)。每个扩展点可以注册多个插件,插件按顺序执行,共同决定调度结果。
1.5 核心扩展点详解
| 扩展点 | 所属周期 | 作用 | 典型插件 |
|---|---|---|---|
| PreFilter | 调度周期 | 预处理 Pod 信息,检查 Pod 是否满足基本条件 | NodeResourcesFit, PodTopologySpread |
| Filter | 调度周期 | 过滤掉不满足条件的 Node(硬约束) | NodeUnschedulable, NodeAffinity, TaintToleration |
| PostFilter | 调度周期 | 所有 Node 都被过滤时,执行干预逻辑(如抢占) | DefaultPreemption |
| PreScore | 调度周期 | 在打分前对过滤后的 Node 做预处理 | NodeResourcesFit |
| Score | 调度周期 | 对每个 Node 打分(软约束),分数越高越优先 | NodeResourcesBalancedAllocation, ImageLocality |
| NormalizeScore | 调度周期 | 对分数进行归一化,确保不同插件分数可比较 | NodeResourcesFit |
| Reserve | 绑定周期 | 在缓存中预留 Pod 在 Node 上的资源 | VolumeBinding |
| Permit | 绑定周期 | 允许或拒绝绑定,支持等待/超时机制 | InterPodAffinity |
| PreBind | 绑定周期 | 绑定前执行准备工作(如挂载卷) | VolumeBinding |
| Bind | 绑定周期 | 执行绑定操作,将 Pod 与 Node 关联 | DefaultBinder |
| PostBind | 绑定周期 | 绑定后清理或通知 | (通常为空) |
扩展点执行顺序: 调度周期内扩展点按 PreFilter → Filter → PostFilter → PreScore → Score → NormalizeScore 顺序执行;绑定周期内按 Reserve → Permit → PreBind → Bind → PostBind 顺序执行。每个扩展点可以有多个插件,插件按配置顺序执行。
1.6 调度器参数调优基础
调度器的性能直接影响集群的 Pod 启动速度和资源利用率。常见的调优参数包括:
- 调度队列参数:
podInitialBackoffSeconds(Pod 重试初始退避时间)、podMaxBackoffSeconds(最大退避时间)。 - 并行度参数:
parallelism(调度周期并行数,默认 16)。 - 缓存参数:
percentageOfNodesToScore(参与打分的节点比例,默认 50%)。 - 插件权重: 通过
score扩展点的插件权重调整各维度的影响力。
调优原则: 调度器调优应基于实际负载特征。例如,大规模集群(1000+ Node)应降低
percentageOfNodesToScore 以减少计算开销;延迟敏感场景应减小 podInitialBackoffSeconds 以加快重试。
1.7 本章小结
调度器是 Kubernetes 集群的“交通指挥中心”,其架构设计遵循插件化、可扩展的原则。调度流程分为调度周期和绑定周期,每个周期包含多个明确定义的扩展点。理解这些基础概念是后续学习污点容忍策略和调度器参数调优的前提。