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)允许用户注入自定义插件,实现灵活的调度策略。
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 变化。其核心工作循环如下:
- Watch & Queue: 通过 Informer 监听未调度的 Pod(
spec.nodeName == ""),将其加入调度队列。 - Dequeue & Schedule: 从队列中取出 Pod,依次执行过滤、打分、预留(Reserve)等扩展点。
- Bind: 调用 API Server 的 Binding 接口,将 Pod 绑定到选中的 Node。
- Cache Update: 更新内部缓存(Scheduler Cache),避免重复调度。
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 的阈值。