2. K8s 调度基础回顾:调度器组件架构、调度流程与默认调度器工作原理
在深入污点与容忍度之前,必须重新理解 Kubernetes 调度器的核心机制。调度器是 kube-controller-manager 之外另一个关键的控制循环组件,它负责将新创建的 Pod 分配到最合适的 Node 上。本章将拆解调度器的内部架构、三阶段调度流程以及默认调度器的工作模式。
2.1 调度器组件架构
Kubernetes 默认调度器 kube-scheduler 采用插件化架构,核心组件包括调度队列、调度框架(Scheduling Framework)以及缓存模块。调度器通过 API Server 监听未调度的 Pod(spec.nodeName 为空),并基于 Node 信息执行调度决策。
架构要点:调度器本身不直接管理 Node 资源,而是通过 Informer 机制从 API Server 缓存 Node 状态、Pod 状态和 PVC/PV 信息,避免每次调度都请求 API Server。
调度器内部维护三个主要队列:activeQ(活跃 Pod)、backoffQ(重试 Pod)和 unschedulableQ(不可调度 Pod)。默认调度器通过事件驱动和周期性重试,确保 Pod 最终被调度。
2.2 调度流程:过滤 → 打分 → 绑定
调度器对每个 Pod 执行一个确定的三阶段流水线。理解这三个阶段是分析调度瓶颈和污点容忍行为的前提。
| 阶段 | 名称 | 核心行为 | 输出 |
|---|---|---|---|
| 1 | 过滤 (Filter) | 遍历所有 Node,执行预选策略(如 Pod 资源请求、端口冲突、污点容忍、节点选择器) | 候选 Node 列表(满足条件的 Node) |
| 2 | 打分 (Score) | 对候选 Node 执行优选策略(如资源余量、亲和性、污点容忍加分) | 每个 Node 的得分(0-100) |
| 3 | 绑定 (Bind) | 选择得分最高的 Node,通过 API Server 将 Pod 的 spec.nodeName 写入 |
Pod 与 Node 的绑定关系 |
关键理解:污点(Taint)在过滤阶段起作用——如果 Pod 没有对应的容忍度(Toleration),Node 会被直接过滤掉,不会进入打分阶段。这是污点实现“排斥”的核心机制。
2.3 默认调度器工作原理
默认调度器(DefaultScheduler)基于调度框架实现,其工作流程可以概括为以下步骤:
- Pod 入队:通过 Informer 监听
spec.nodeName为空的 Pod,将其加入调度队列(activeQ)。 - 出队调度:调度器从 activeQ 中取出 Pod,开始一次调度周期。
- 过滤阶段:按顺序执行注册的 Filter 插件(如 NodeResourcesFit、NodeUnschedulable、TaintToleration、NodeSelector 等)。
- 打分阶段:对过滤后的 Node 执行 Score 插件(如 NodeResourcesBalancedAllocation、ImageLocality、TaintToleration 等),加权求和得到最终得分。
- 绑定阶段:选择得分最高的 Node,通过 API Server 创建 Binding 对象。
- 异步绑定确认:调度器不等待 Pod 实际启动,绑定成功后立即处理下一个 Pod。
调度瓶颈提示:默认调度器是串行处理 Pod 的(一个调度周期只处理一个 Pod)。当集群规模较大(Node > 1000)或 Pod 密度高时,过滤阶段的 Node 遍历会成为性能瓶颈。污点容忍的过滤逻辑虽然轻量,但大量 Pod 带有复杂容忍度规则时,仍可能增加过滤耗时。
2.4 调度器插件体系
调度框架将调度流程拆分为多个扩展点(Extension Points),每个扩展点可以注册多个插件。以下是默认调度器中与污点容忍相关的关键插件:
| 扩展点 | 插件名称 | 作用 |
|---|---|---|
| Filter | TaintToleration | 检查 Pod 是否容忍 Node 上的所有 Taint;不满足则过滤该 Node |
| Filter | NodeUnschedulable | 检查 Node 是否被标记为 unschedulable |
| Filter | NodeResourcesFit | 检查 Node 剩余资源是否满足 Pod 请求 |
| Score | TaintToleration | 根据 Pod 对 Taint 的容忍程度给予加分(容忍越多,得分越高) |
| Score | NodeResourcesBalancedAllocation | 优先选择资源分配更均衡的 Node |
污点容忍的双重作用:TaintToleration 插件同时出现在 Filter 和 Score 扩展点。Filter 阶段决定 Node 是否可用;Score 阶段则对容忍更多 Taint 的 Pod 给予加分,鼓励将 Pod 调度到带有特殊 Taint 的 Node 上(如专用 GPU 节点)。