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)。整个流程可概括为以下步骤:
- Pod 入队:未调度的 Pod 进入调度队列,按优先级排序。
- 预选阶段:遍历所有 Node,执行 Predicates 插件(如
PodFitsResources、MatchNodeSelector),过滤出满足条件的节点列表。 - 优选阶段:对预选通过的节点执行 Priorities 插件(如
LeastRequestedPriority、BalancedResourceAllocation),计算每个节点的得分。 - 选择最优节点:取总分最高的节点作为目标;若存在多个同分节点,随机选择一个。
- 绑定:将 Pod 与 Node 的绑定关系写入 API Server。
性能要点: 预选阶段是 CPU 密集型操作,当集群节点数超过 1000 时,预选插件的执行效率会显著影响调度吞吐量。优选阶段则更关注资源均衡和调度质量。
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 或自定义权重的多级排序策略,从而优化调度队列的吞吐量和公平性。
1.6 调度器性能关键指标
在调优之前,需要明确衡量调度器性能的核心指标:
| 指标 | 定义 | 推荐阈值 |
|---|---|---|
| 调度吞吐量 | 单位时间内成功调度的 Pod 数量 | ≥ 100 Pods/sec(1000 节点集群) |
| 调度延迟 P99 | 99% 的 Pod 从入队到完成绑定的耗时 | ≤ 100ms |
| 预选耗时 | Predicates 阶段平均执行时间 | ≤ 5ms / 节点 |
| 优选耗时 | Priorities 阶段平均执行时间 | ≤ 2ms / 节点 |
| 队列等待时间 | Pod 在调度队列中的平均等待时间 | ≤ 50ms |