1. Kubernetes 调度概述:调度器工作原理、调度流程、调度器架构组件解析
Kubernetes 调度器(kube-scheduler)是控制平面中负责将 Pod 绑定到合适 Node 的核心组件。它不负责运行 Pod,而是通过一系列算法为每个待调度 Pod 选择最优的节点。理解调度器的工作原理、完整流程和内部架构,是进行调度优化和镜像拉取加速的前提。
1.1 调度器工作原理
调度器采用 “事件驱动 + 异步循环” 的工作模式。它通过监听 API Server 获取未调度的 Pod(spec.nodeName 为空),然后执行调度算法,最终将 Pod 与 Node 的绑定关系写入 etcd。其核心原则是:“为每个 Pod 找到一个满足约束条件且资源最充裕的节点”。
关键设计理念:
- 可插拔策略: 调度策略(Predicates & Priorities)可通过配置文件动态加载,无需重新编译。
- 异步非阻塞: 调度周期独立运行,不阻塞 API Server 的其他操作。
- 乐观并发: 调度器假设资源充足,仅在绑定前做最终校验,减少锁竞争。
1.2 调度流程(核心三阶段)
一个 Pod 从创建到运行在节点上,经历以下三个阶段:
| 阶段 | 名称 | 核心动作 | 输出 |
|---|---|---|---|
| 1 | 过滤阶段(Predicates) | 遍历所有 Node,剔除不满足 Pod 约束的节点(如资源不足、端口冲突、污点不匹配)。 | 候选节点列表 |
| 2 | 打分阶段(Priorities) | 对候选节点按资源利用率、亲和性、拓扑分布等策略进行加权评分。 | 节点分数排序 |
| 3 | 绑定阶段(Bind) | 选择最高分节点,通过 API Server 将 Pod 与 Node 的绑定关系写入 etcd。 | Pod 绑定记录 |
优化切入点: 镜像拉取时间通常发生在绑定阶段之后(kubelet 开始创建容器时)。调度器本身不处理镜像拉取,但可以通过 节点亲和性 和 Pod 拓扑分布约束 将 Pod 调度到已缓存镜像的节点,从而减少拉取时间。
1.3 调度器架构组件解析
Kubernetes 调度器内部采用 “调度框架(Scheduling Framework)” 架构,将调度流程拆解为多个可扩展的扩展点(Extension Points)。下图展示了调度器的核心组件与交互关系:
1.4 调度框架扩展点详解
调度框架(Scheduling Framework)将调度周期拆分为多个扩展点,允许用户通过 调度插件(Scheduler Plugin) 在特定阶段注入自定义逻辑。以下是核心扩展点及其作用:
| 扩展点 | 所属阶段 | 典型插件示例 | 作用 |
|---|---|---|---|
| PreFilter | 过滤前 | NodeResourcesFit | 预处理 Pod 资源请求,检查集群整体容量 |
| Filter | 过滤 | NodeUnschedulable, TaintToleration | 剔除不满足硬约束的节点 |
| PostFilter | 过滤后 | DefaultPreemption | 无可用节点时触发抢占(Preemption) |
| PreScore | 打分前 | PodTopologySpread | 计算打分所需的全局拓扑信息 |
| Score | 打分 | NodeResourcesBalancedAllocation | 为每个候选节点生成分数(0-100) |
| NormalizeScore | 打分后 | ImageLocality | 对分数进行归一化或加权修正 |
| Reserve | 绑定前 | VolumeBinding | 预留资源,防止并发冲突 |
| Permit | 绑定前 | (自定义) | 批准或延迟绑定(如等待外部条件) |
| PreBind | 绑定前 | NodeAffinity | 执行绑定前的预处理(如挂载卷) |
| Bind | 绑定 | DefaultBinder | 将 Pod 绑定到 Node(写入 etcd) |
| PostBind | 绑定后 | (清理类) | 绑定完成后的清理或日志记录 |
镜像拉取关联:
ImageLocality 插件在 NormalizeScore 阶段根据节点上是否已缓存 Pod 所需的镜像来调整分数。默认权重较低(0.1),但在大规模集群中,开启并调高该权重可以显著减少 Pod 启动延迟。后续章节将详细讲解如何配置该插件。
1.5 调度器组件与数据流
调度器内部由以下核心组件协作完成调度任务:
- Scheduler Cache: 本地缓存 Node 和 Pod 状态,减少对 API Server 的频繁查询。通过 Watch 机制与 etcd 保持最终一致。
- Scheduler Queue: 管理待调度 Pod 的优先级队列。支持三种队列:ActiveQ(活跃)、BackoffQ(退避)、UnschedulableQ(不可调度)。
- Framework: 调度框架实例,负责按顺序调用注册的扩展点插件。
- Extenders: 外部调度扩展器(已逐步被调度框架替代),用于与第三方调度系统集成。
下图展示了调度器内部组件之间的数据流关系:
1.6 调度器关键配置参数
以下参数直接影响调度性能和镜像拉取优化策略:
| 参数 | 默认值 | 说明 | 优化建议 |
|---|---|---|---|
--kube-api-qps |
50 | 调度器与 API Server 通信的 QPS 上限 | 大规模集群可提升至 100-200 |
--kube-api-burst |
100 | 突发请求数 | 配合 QPS 调整,避免限流 |
--permit-wait-timeout |
0s | Permit 扩展点等待超时 | 镜像拉取等待场景可设为 30s |
--profiling |
true | 启用性能分析接口 | 生产环境建议开启用于排查 |