1. K8s 调度器架构总览

Kubernetes 调度器(kube-scheduler)是控制平面中负责将 Pod 绑定到合适 Node 的核心组件。它通过监听未调度的 Pod,基于集群资源状态和调度策略,为每个 Pod 选择最优节点。理解调度器的整体架构、组件分工和调度流程,是后续进行性能调优和多队列排序优化的基础。

1.1 调度器在 K8s 中的角色

调度器在 Kubernetes 集群中扮演“资源分配决策者”的角色,其核心职责包括:

  • 监听未调度 Pod:通过 API Server 的 Watch 机制,实时获取 spec.nodeName 为空的 Pod。
  • 过滤可行节点:从集群所有 Node 中筛选出满足 Pod 资源请求、亲和性、端口冲突等硬性约束的节点。
  • 评分优选节点:对过滤后的节点进行多维度打分,选择总分最高的节点作为最终目标。
  • 绑定决策结果:将 Pod 与选定 Node 的绑定关系写入 API Server,触发 kubelet 创建容器。
关键指标: 调度器性能直接影响集群的 Pod 启动延迟和资源利用率。在生产集群中,调度吞吐量(Pods/sec)和调度延迟(P99)是核心监控指标。

1.2 核心组件:kube-scheduler

kube-scheduler 是一个独立的二进制进程,内部采用插件化架构。其核心组件包括:

组件 职责 说明
Scheduling Framework 调度框架,定义插件生命周期和扩展点 K8s v1.19+ 引入,支持自定义调度插件
Queue 管理待调度 Pod 的优先级队列 支持多级排序(PrioritySort、QoS、优先级)
Cache 缓存集群 Node 和 Pod 的实时状态 减少对 API Server 的直接访问,提升性能
Algorithm 调度算法执行引擎 调用预选(Predicates)和优选(Priorities)插件
Binder 将调度结果写入 API Server 异步绑定,支持批量提交优化

1.3 调度流程:Predicates & Priorities

调度器对每个 Pod 执行两阶段决策:预选(Predicates) 和 优选(Priorities)。整个流程可概括为以下步骤:

  1. Pod 入队:未调度的 Pod 进入调度队列,按优先级排序。
  2. 预选阶段:遍历所有 Node,执行 Predicates 插件(如 PodFitsResources、MatchNodeSelector),过滤出满足条件的节点列表。
  3. 优选阶段:对预选通过的节点执行 Priorities 插件(如 LeastRequestedPriority、BalancedResourceAllocation),计算每个节点的得分。
  4. 选择最优节点:取总分最高的节点作为目标;若存在多个同分节点,随机选择一个。
  5. 绑定:将 Pod 与 Node 的绑定关系写入 API Server。
性能要点: 预选阶段是 CPU 密集型操作,当集群节点数超过 1000 时,预选插件的执行效率会显著影响调度吞吐量。优选阶段则更关注资源均衡和调度质量。
kube-scheduler 核心架构与调度流程 API Server Watch / Bind Scheduling Queue 多级排序 / 优先级 Predicates 过滤可行节点 Priorities 评分优选节点 Node 1 Node 2 Node 3 Node N Scheduler Cache Node / Pod 状态 Watch Pod/Node 读取 Node 状态 评分结果 绑定结果回写 调度周期 入队→预选→优选→绑定

1.4 调度器工作模式

kube-scheduler 支持多种工作模式,以适应不同规模和场景的集群需求:

模式 描述 适用场景
单实例模式 集群中运行单个 kube-scheduler 实例 中小规模集群(节点 < 500)
高可用模式 多个 kube-scheduler 实例通过 leader election 选主 生产集群,保证调度器高可用
多调度器模式 集群中运行多个不同的调度器实例,Pod 通过 schedulerName 选择 需要自定义调度策略的混合工作负载
扩展调度器模式 通过调度框架扩展点(Extender)集成外部调度逻辑 对接第三方资源调度系统
注意: 多调度器模式下,不同调度器实例独立运行,不会共享调度队列和缓存。这可能导致资源竞争和调度冲突,需要仔细规划调度策略的隔离性。

1.5 调度框架扩展点

Kubernetes v1.19 引入的 Scheduling Framework 定义了多个扩展点,允许开发者在不修改核心代码的情况下定制调度行为:

  • QueueSort:定义 Pod 在调度队列中的排序逻辑。
  • PreFilter:在预选前执行,用于预处理 Pod 信息或进行快速拒绝。
  • Filter:对应 Predicates 阶段,过滤不满足条件的节点。
  • PostFilter:在 Filter 后执行,用于处理无可用节点的情况(如抢占)。
  • PreScore:在评分前执行,用于计算评分所需的全局数据。
  • Score:对应 Priorities 阶段,对节点进行打分。
  • NormalizeScore:对评分结果进行归一化处理。
  • Reserve:在绑定前预留节点资源,防止并发冲突。
  • Permit:允许或拒绝调度决策,支持等待/超时机制。
  • PreBind / Bind / PostBind:绑定阶段的前置、执行和后置处理。
调优切入点: 多队列排序主要涉及 QueueSort 和 PreFilter 扩展点。通过自定义 QueueSort 插件,可以实现基于优先级、QoS 或自定义权重的多级排序策略,从而优化调度队列的吞吐量和公平性。
Scheduling Framework 扩展点流程 QueueSort PreFilter Filter PostFilter PreScore Score NormalizeScore Reserve Permit PreBind Bind PostBind 调度周期(Scheduling Cycle) 绑定周期(Binding Cycle)

1.6 调度器性能关键指标

在调优之前,需要明确衡量调度器性能的核心指标:

指标 定义 推荐阈值
调度吞吐量 单位时间内成功调度的 Pod 数量 ≥ 100 Pods/sec(1000 节点集群)
调度延迟 P99 99% 的 Pod 从入队到完成绑定的耗时 ≤ 100ms
预选耗时 Predicates 阶段平均执行时间 ≤ 5ms / 节点
优选耗时 Priorities 阶段平均执行时间 ≤ 2ms / 节点
队列等待时间 Pod 在调度队列中的平均等待时间 ≤ 50ms