1. 调度器基础:Kubernetes 调度器工作原理、调度流程与组件架构

1.1 调度器在 Kubernetes 控制平面中的角色

Kubernetes 调度器(kube-scheduler)是控制平面的核心组件之一,负责将待调度的 Pod 绑定到最合适的节点上。它不执行 Pod 的创建或运行,而是通过一系列算法和策略,为每个未调度的 Pod 选择一个最优的 Worker 节点。

组件 职责 与调度器的关系
API Server 提供 RESTful 接口,存储集群状态 调度器通过 API Server 监听 Pod 和 Node 的变化
etcd 分布式键值存储,保存所有集群数据 调度器读取 Pod 和 Node 信息,写入绑定结果
kube-scheduler 执行调度决策,将 Pod 绑定到 Node 自身即为调度器组件
kubelet 节点代理,管理容器生命周期 接收调度结果,在节点上启动 Pod
关键理解:调度器只做"决策"(Decision),不做"执行"(Execution)。决策结果写入 API Server 后,由目标节点的 kubelet 负责实际拉起容器。这种分离设计使得调度策略可以独立演进,不影响运行时。

1.2 调度器组件架构

kube-scheduler 内部采用插件化架构,核心分为三个层次:调度框架(Scheduling Framework)、调度队列(Scheduling Queue)和调度算法(Scheduling Algorithm)。

kube-scheduler 组件架构图 调度队列 Scheduling Queue 优先级排序 · 重试 · 回退 调度框架 Scheduling Framework 插件注册 · 扩展点 · 上下文 调度算法 Scheduling Algorithm 过滤 · 打分 · 绑定 插件扩展点(Extension Points) QueueSort PreFilter Filter Score Bind 数据源:API Server / informer 缓存 Pod 状态 · Node 资源 · 持久卷声明 · 存储类 · 污点/容忍度
架构要点:
  • 调度队列:维护待调度 Pod 的优先级队列,支持 Pod 的入队、出队、重试和回退机制。
  • 调度框架:定义了一组扩展点(Extension Points),允许用户通过插件自定义调度行为。
  • 调度算法:执行具体的过滤(Filter)和打分(Score)逻辑,最终选出最优节点。
  • 数据源:通过 informer 机制监听 API Server,本地缓存集群状态,避免每次调度都直接访问 etcd。

1.3 调度流程详解

一个 Pod 从创建到被调度到节点上,经历以下标准流程:

  1. Pod 创建:用户通过 kubectl 或 API 创建 Pod,API Server 将 Pod 写入 etcd,此时 Pod 的 spec.nodeName 为空。
  2. 入队:scheduler 的 informer 监听到新的未调度 Pod,将其加入调度队列(Scheduling Queue)。
  3. 出队:调度器主循环从队列中取出一个 Pod,开始调度周期(Scheduling Cycle)。
  4. 过滤(Filter):执行一组过滤插件,筛选出满足 Pod 资源需求、亲和性约束、污点容忍度等条件的节点列表。
  5. 打分(Score):对过滤后的节点执行打分插件,为每个节点计算综合得分。
  6. 选择最优节点:选择得分最高的节点作为目标节点;如果多个节点同分,则随机选择一个。
  7. 绑定(Bind):调度器通过 API Server 将 Pod 与目标节点绑定,写入 spec.nodeName。
  8. 节点执行:目标节点的 kubelet 监听到绑定事件,拉取镜像并启动容器。
Pod 调度完整流程 1. Pod 创建 API Server 2. 入队 Scheduling Queue 3. 出队 调度周期开始 4. 过滤 Filter 插件 5. 打分 Score 插件 6. 选择最优节点 最高分 + 随机 7. 绑定 Bind 插件 8. 节点执行 kubelet 调度周期 vs 绑定周期 • 调度周期(Scheduling Cycle):从 Pod 出队到选出最优节点,包含过滤和打分。此过程是串行的, 同一时间只处理一个 Pod。 • 绑定周期(Binding Cycle):将 Pod 绑定到节点的过程。绑定周期可以与下一个 Pod 的调度周期 并行执行,提高吞吐量。

1.4 调度器工作原理核心概念

概念 说明 影响
Predicates(过滤) 硬性约束条件,不满足则节点被排除 资源不足、端口冲突、污点不匹配等直接淘汰
Priorities(打分) 软性偏好条件,为节点计算分数 资源利用率、亲和性、拓扑分布等影响排名
调度队列 按优先级排序的待调度 Pod 列表 高优先级 Pod 先被调度,支持抢占
调度框架插件 在扩展点注册的自定义逻辑 可扩展调度行为,如自定义过滤、打分、绑定
调度上下文 一次调度周期内的状态传递 插件之间共享数据,避免重复计算
常见误区:
  • 调度器不是负载均衡器——它不保证节点间 Pod 数量均匀,而是基于资源请求和约束做最优匹配。
  • 调度器不感知实际资源使用率——它只根据 Pod 的 requests 和 limits 做决策,不关心节点上实际 CPU/内存消耗。
  • 调度器不处理运行时的资源超卖——如果节点实际资源耗尽,由 kubelet 的驱逐机制处理,调度器不介入。

1.5 调度器的高可用与扩展性

在生产环境中,kube-scheduler 通常以多副本方式部署,配合 leader election 机制实现高可用:

  • Leader Election:多个 scheduler 实例中只有一个作为 leader 执行调度,其他实例处于 standby 状态。
  • 调度周期串行:同一时刻只有一个 Pod 处于调度周期,保证决策的一致性。
  • 绑定周期并行:绑定操作可以与下一个 Pod 的调度周期并行执行,提升吞吐量。
  • 调度框架扩展:通过自定义插件,可以在不修改核心代码的情况下扩展调度逻辑。
性能指标参考:在标准配置下,kube-scheduler 每秒可调度约 100-200 个 Pod(取决于集群规模和插件复杂度)。对于大规模集群(5000+ 节点),建议调整 --kube-api-qps 和 --kube-api-burst 参数以提升吞吐量。