1. 调度器概述:Kubernetes 调度器的作用、调度流程、调度器架构组件
1.1 调度器在 Kubernetes 中的核心作用
Kubernetes 调度器(kube-scheduler)是控制平面的核心组件之一,负责将待调度的 Pod 绑定到最合适的节点上。其本质是一个资源匹配与约束满足系统,在集群资源碎片化、节点异构性、用户自定义约束等多维条件下,做出最优的调度决策。
| 维度 | 调度器职责 | 典型场景 |
|---|---|---|
| 资源匹配 | 确保节点剩余资源满足 Pod 的 requests 声明 | CPU、内存、GPU、临时存储 |
| 约束满足 | 执行 nodeSelector、亲和性、污点容忍等策略 | 专用 GPU 节点、合规区域部署 |
| 负载均衡 | 通过评分机制分散 Pod,避免节点过载 | 资源利用率均衡、故障域分散 |
| 拓扑感知 | 考虑节点拓扑分布,优化跨 AZ/Region 部署 | 高可用多副本、地域亲和 |
关键认知:调度器不负责运行 Pod,也不管理节点生命周期。它只做“绑定决策”——将 Pod 与 Node 的绑定关系写入 etcd,由 kubelet 在目标节点上完成实际创建。
1.2 调度流程:从 Pod 创建到绑定
调度流程分为两个阶段:过滤(Filtering) 和 评分(Scoring)。过滤阶段选出所有满足条件的候选节点;评分阶段对候选节点打分,选出最优节点。整个流程在调度器内部以“调度周期”为单位串行或并发执行。
- Pod 入队:kube-scheduler 通过 informer 监听 API Server,发现未调度(
spec.nodeName为空)的 Pod,将其加入调度队列。 - 过滤阶段(Predicates):对每个节点执行一系列预选策略,剔除不满足条件的节点。例如:端口冲突、资源不足、污点不匹配。
- 评分阶段(Priorities):对通过过滤的节点执行加权评分,计算每个节点的综合得分。
- 绑定阶段:选择得分最高的节点,通过 API Server 将 Pod 与 Node 的绑定关系写入 etcd。
- 异步确认:kubelet 监听到绑定事件后,在目标节点上启动 Pod。
性能要点:过滤阶段是“硬约束”,一旦节点不满足条件立即淘汰;评分阶段是“软约束”,通过权重组合选出最优节点。调优时优先优化过滤阶段的效率,减少不必要的评分计算。
1.3 调度器架构组件
kube-scheduler 内部采用插件化架构,核心组件包括调度队列、调度框架(Scheduling Framework)、缓存与绑定器。从代码层面看,调度器由以下模块构成:
| 组件 | 职责 | 关键数据结构 / 接口 |
|---|---|---|
| Scheduler Queue | 管理待调度 Pod 的优先级队列,支持重试、回退 | PriorityQueue、activeQ / backoffQ / unschedulableQ |
| Scheduling Framework | 定义插件扩展点(PreFilter、Filter、Score、Reserve 等) | Plugin 接口、CycleState、FrameworkHandle |
| Node Cache | 缓存集群节点最新资源状态,减少 API Server 请求 | NodeInfo、Resource、ImageStates |
| Binder | 将调度结果写入 API Server(Pod 与 Node 绑定) | Binding 子资源、异步更新 |
| Extender | 外部扩展调度逻辑,支持自定义过滤与评分 | HTTP/HTTPS 回调、JSON 格式 |
1.4 调度框架的扩展点
Kubernetes 1.19+ 引入的 Scheduling Framework 将调度流程拆分为多个扩展点,每个扩展点可以插入一个或多个插件。这种设计使得调度器的行为高度可定制,也是参数调优的核心入口。
- PreFilter / Filter:预选阶段,检查 Pod 与节点的基本兼容性。
- PostFilter:当所有节点都被过滤掉时执行,用于抢占或报错。
- Score / NormalizeScore:评分阶段,计算节点优先级。
- Reserve / Unreserve:预留资源,确保调度决策的原子性。
- Permit:允许或拒绝调度决策,常用于多调度器协调。
- PreBind / Bind / PostBind:绑定阶段,执行绑定操作及后续处理。
调优注意:调度器参数调优主要围绕 Filter 和 Score 插件展开。例如调整
NodeResourcesFit 的评分策略(LeastRequested / MostRequested)直接影响节点资源分配的均衡性。后续章节将深入每个插件的参数配置与效果分析。