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)。
架构要点:
- 调度队列:维护待调度 Pod 的优先级队列,支持 Pod 的入队、出队、重试和回退机制。
- 调度框架:定义了一组扩展点(Extension Points),允许用户通过插件自定义调度行为。
- 调度算法:执行具体的过滤(Filter)和打分(Score)逻辑,最终选出最优节点。
- 数据源:通过 informer 机制监听 API Server,本地缓存集群状态,避免每次调度都直接访问 etcd。
1.3 调度流程详解
一个 Pod 从创建到被调度到节点上,经历以下标准流程:
- Pod 创建:用户通过 kubectl 或 API 创建 Pod,API Server 将 Pod 写入 etcd,此时 Pod 的
spec.nodeName为空。 - 入队:scheduler 的 informer 监听到新的未调度 Pod,将其加入调度队列(Scheduling Queue)。
- 出队:调度器主循环从队列中取出一个 Pod,开始调度周期(Scheduling Cycle)。
- 过滤(Filter):执行一组过滤插件,筛选出满足 Pod 资源需求、亲和性约束、污点容忍度等条件的节点列表。
- 打分(Score):对过滤后的节点执行打分插件,为每个节点计算综合得分。
- 选择最优节点:选择得分最高的节点作为目标节点;如果多个节点同分,则随机选择一个。
- 绑定(Bind):调度器通过 API Server 将 Pod 与目标节点绑定,写入
spec.nodeName。 - 节点执行:目标节点的 kubelet 监听到绑定事件,拉取镜像并启动容器。
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 参数以提升吞吐量。