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。
Kubernetes 调度器组件架构 kube-scheduler 组件架构 API Server Informer (Node/Pod/PVC 缓存) 调度队列 (PriorityQueue / unschedulableQ) 调度框架 (Scheduling Framework) Filter 插件链 Score 插件链 Bind 插件 Pod Binding 写入 核心组件 调度队列:存储待调度 Pod 调度框架:执行过滤/打分/绑定

调度器内部维护三个主要队列: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 会被直接过滤掉,不会进入打分阶段。这是污点实现“排斥”的核心机制。
调度三阶段流程 调度三阶段流程:过滤 → 打分 → 绑定 阶段 1:过滤 Predicates / Filter 插件 排除不满足条件的 Node 阶段 2:打分 Priorities / Score 插件 对候选 Node 计算得分 阶段 3:绑定 选择最优 Node 写入 Binding 对象 污点容忍在过滤阶段生效 Pod 没有对应容忍度 → Node 被过滤 → 不进入打分阶段

2.3 默认调度器工作原理

默认调度器(DefaultScheduler)基于调度框架实现,其工作流程可以概括为以下步骤:

  1. Pod 入队:通过 Informer 监听 spec.nodeName 为空的 Pod,将其加入调度队列(activeQ)。
  2. 出队调度:调度器从 activeQ 中取出 Pod,开始一次调度周期。
  3. 过滤阶段:按顺序执行注册的 Filter 插件(如 NodeResourcesFit、NodeUnschedulable、TaintToleration、NodeSelector 等)。
  4. 打分阶段:对过滤后的 Node 执行 Score 插件(如 NodeResourcesBalancedAllocation、ImageLocality、TaintToleration 等),加权求和得到最终得分。
  5. 绑定阶段:选择得分最高的 Node,通过 API Server 创建 Binding 对象。
  6. 异步绑定确认:调度器不等待 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 节点)。