1. 调度器概述:Kubernetes 调度器的作用、调度流程、调度器架构组件
1.1 调度器在 Kubernetes 集群中的定位
Kubernetes 调度器(kube-scheduler)是控制平面的核心组件之一,负责将待调度的 Pod 绑定到最合适的 Node 上。它不负责运行 Pod,而是通过一系列算法为每个未调度的 Pod 选择一个最优节点,并将绑定决策写入 etcd。
| 角色 | 说明 |
|---|---|
| 决策者 | 为每个新创建的 Pod 选择目标 Node |
| 约束满足者 | 保证调度结果满足 Pod 的资源请求、亲和性、污点容忍等约束 |
| 资源均衡者 | 通过评分机制尽量使集群各节点负载均衡,避免热点 |
| 可扩展平台 | 支持调度框架(Scheduling Framework)扩展点,允许自定义调度逻辑 |
关键认知:调度器只做“决策”而不做“执行”。绑定操作由调度器写入 API Server,kubelet 监听到绑定后才会真正拉取镜像并启动容器。调度器本身不直接与容器运行时交互。
1.2 调度流程:从 Pod 创建到绑定
一个 Pod 从创建到被调度到某个节点,经历以下四个阶段:
- 过滤(Filtering / Predicates):遍历所有 Node,剔除不满足 Pod 硬性约束的节点(如资源不足、端口冲突、污点不匹配)。
- 评分(Scoring / Priorities):对通过过滤的 Node 进行打分,分数越高表示越适合运行该 Pod。
- 选择(Select):从最高分节点中随机选择一个(若多个节点同分),避免调度结果完全确定。
- 绑定(Bind):将 Pod 与选定 Node 的绑定关系写入 API Server 的 etcd 中。
调度流程核心原则:先硬约束(过滤),后软偏好(评分)。过滤阶段保证可行性,评分阶段追求最优性。
1.3 调度器架构组件
Kubernetes 调度器内部采用插件化架构,核心组件包括:
- 调度队列(Scheduling Queue):管理待调度的 Pod,支持优先级排序、重试、回退机制。
- 调度框架(Scheduling Framework):定义了一系列扩展点(Extension Points),允许用户注入自定义插件。
- 插件注册表(Plugin Registry):管理所有已注册的调度插件,包括内置插件和自定义插件。
- 缓存(Cache):维护集群中 Node 和 Pod 的快照,避免每次调度都从 API Server 拉取全量数据。
- 绑定器(Binder):负责将调度结果写入 API Server。
| 组件 | 职责 | 关键特性 |
|---|---|---|
| 调度队列 | 存储待调度 Pod,按优先级排序 | 支持 Pod 重试、回退、抢占 |
| 调度框架 | 定义扩展点,编排插件执行顺序 | QueueSort / PreFilter / Filter / PostFilter / PreScore / Score / NormalizeScore / Reserve / Permit / PreBind / Bind / PostBind |
| 插件注册表 | 管理内置和自定义插件 | 支持动态加载、配置启用/禁用 |
| 缓存 | 维护 Node/Pod 快照 | 增量更新,减少 API Server 压力 |
| 绑定器 | 执行绑定操作 | 异步写入,支持重试 |
注意:调度器缓存与 etcd 中的数据可能存在短暂不一致(秒级)。调度器通过监听机制持续同步,但极端情况下可能产生“调度到已满节点”的问题。生产环境建议配合 Node 资源预留 和 调度器抢占策略 来降低风险。
1.4 调度器扩展点与插件化设计
Kubernetes 调度框架定义了 11 个扩展点,覆盖调度全生命周期:
- QueueSort:定义 Pod 在调度队列中的排序逻辑。
- PreFilter / Filter / PostFilter:过滤阶段的预处理、核心过滤、后处理。
- PreScore / Score / NormalizeScore:评分阶段的预处理、打分、分数归一化。
- Reserve / Permit:资源预留和准入控制。
- PreBind / Bind / PostBind:绑定阶段的预处理、核心绑定、后处理。