1. K8s 调度器概述:调度器架构、调度流程、调度器组件(kube-scheduler)工作原理

1.1 调度器在 Kubernetes 集群中的定位

Kubernetes 调度器(kube-scheduler)是控制平面的核心组件之一,负责将待调度的 Pod 绑定到最合适的 Node 上。它不负责运行 Pod,而是做出“调度决策”——即从集群中选择一个满足 Pod 资源需求、约束条件且负载相对合理的节点。

关键职责: 监听未调度的 Pod(spec.nodeName 为空),通过一系列过滤和打分算法,选出最优节点,并将绑定结果写回 API Server。

1.2 调度器架构

kube-scheduler 采用插件化架构,核心分为三个逻辑层:调度队列、调度框架(Scheduling Framework)和 绑定循环。调度框架通过扩展点(Extension Points)允许用户注入自定义插件,实现灵活的调度策略。

kube-scheduler 架构图 API Server 调度队列 调度框架 绑定循环 扩展点 QueueSort · PreFilter Filter · PostFilter Score · NormalizeScore Reserve · Permit · PreBind 内置插件 NodeResourcesFit NodeSelector TaintToleration InterPodAffinity 说明: 调度器从 API Server 获取未调度的 Pod,放入调度队列;调度框架按扩展点顺序执行插件;绑定循环将最终选中的 Node 写回 API Server。

1.3 调度流程(两阶段模型)

kube-scheduler 对每个待调度 Pod 执行两个核心阶段:过滤(Filtering) 和 打分(Scoring)。过滤阶段选出所有满足条件的节点(可行节点集),打分阶段对可行节点进行排序,选出最优节点。

阶段 名称 作用 典型插件
1 过滤(Filter) 排除不满足 Pod 约束的节点(资源不足、端口冲突、污点不匹配等) NodeResourcesFit, NodeSelector, TaintToleration
2 打分(Score) 对剩余节点按策略评分(资源利用率、亲和性、拓扑分布等) NodeResourcesBalancedAllocation, InterPodAffinity
3 绑定(Bind) 将 Pod 与最优节点绑定,更新 spec.nodeName DefaultBinder
性能提示: 过滤阶段是“硬约束”,一旦节点被过滤掉,后续打分阶段不会再考虑该节点。因此,合理配置过滤插件可以减少打分阶段的计算量,提升调度吞吐量。

1.4 调度器组件工作原理

kube-scheduler 作为一个独立的二进制进程运行,内部通过 Informer 机制 监听 API Server 中的 Pod 和 Node 变化。其核心工作循环如下:

  1. Watch & Queue: 通过 Informer 监听未调度的 Pod(spec.nodeName == ""),将其加入调度队列。
  2. Dequeue & Schedule: 从队列中取出 Pod,依次执行过滤、打分、预留(Reserve)等扩展点。
  3. Bind: 调用 API Server 的 Binding 接口,将 Pod 绑定到选中的 Node。
  4. Cache Update: 更新内部缓存(Scheduler Cache),避免重复调度。
kube-scheduler 工作循环 Watch Pod/Node 调度队列 过滤 + 打分 绑定 更新缓存 循环说明: Watch → Queue → Schedule → Bind → Cache Update → 回到 Watch,形成闭环。调度器通过 Informer 保持与 API Server 的状态同步。

1.5 调度器组件关键配置

kube-scheduler 的配置通过 KubeSchedulerConfiguration 对象定义,支持以下核心参数:

配置项 类型 说明 默认值
profiles []SchedulerProfile 定义多个调度配置文件,每个 profile 可绑定不同的插件集 默认 profile
extenders []Extender 外部调度扩展,通过 HTTP 调用自定义过滤/打分逻辑 空
percentageOfNodesToScore int32 打分阶段扫描节点的百分比(0 表示使用自适应算法) 50
podInitialBackoffSeconds int64 Pod 调度失败后的初始重试退避时间(秒) 1
podMaxBackoffSeconds int64 Pod 调度失败后的最大重试退避时间(秒) 10
注意: 在大型集群(>1000 节点)中,percentageOfNodesToScore 的默认值可能导致调度延迟。建议根据集群规模适当调整该参数,或启用 NodeResourcesFit 插件的 ScarceResourceAvoidance 策略来优化性能。

1.6 调度器扩展点与插件机制

调度框架定义了多个扩展点,插件可以在这些扩展点注册并执行自定义逻辑。以下是主要扩展点及其用途:

  • QueueSort: 定义调度队列中 Pod 的排序顺序(默认按优先级)。
  • PreFilter: 在过滤前执行,用于预处理 Pod 信息或提前排除明显不合适的节点。
  • Filter: 核心过滤逻辑,排除不满足条件的节点。
  • PostFilter: 过滤后执行,可用于处理“无可行节点”的情况(如抢占)。
  • PreScore: 打分前执行,用于计算打分所需的全局信息。
  • Score: 对每个可行节点打分(0-100),分数越高越优先。
  • NormalizeScore: 对分数进行归一化处理。
  • Reserve: 预留节点资源,防止并发调度冲突。
  • Permit: 批准或延迟绑定(可用于实现多调度器协调)。
  • PreBind: 绑定前执行,如动态创建存储卷。
  • Bind: 执行绑定操作。
  • PostBind: 绑定后执行,用于清理或通知。
调优切入点: 在实际业务场景中,最常见的调优手段是调整 Score 插件权重 和 Filter 插件顺序。例如,对于 CPU 密集型应用,可以增大 NodeResourcesBalancedAllocation 的权重;对于 IO 密集型应用,可以启用 NodeResourcesLeastAllocated 并降低 NodeResourcesFit 的阈值。