1. K8s 调度基础:调度器架构、调度流程、调度策略概述
Kubernetes 调度器(kube-scheduler)是控制平面中负责将待调度 Pod 绑定到合适工作节点的核心组件。调度决策直接影响集群的资源利用率、应用性能与运维稳定性。本节从架构、流程与策略三个维度建立调度知识体系。
1.1 调度器架构
kube-scheduler 以独立进程运行在控制平面节点上,通过 API Server 监听未调度的 Pod(spec.nodeName 为空),经过调度算法选出最优节点后,将绑定结果写回 API Server。其内部采用“插件化”架构,调度框架(Scheduling Framework)定义了扩展点,允许用户注入自定义调度逻辑。
核心组件:
- 调度队列(Scheduling Queue):按优先级、QoS 类别和等待时间对 Pod 排序,支持抢占与回退。
- 调度框架(Scheduling Framework):定义 Filter、Score、Normalize、Reserve、Permit 等扩展点,插件可注册到任意扩展点。
- 缓存(Scheduler Cache):维护节点与 Pod 的快照,减少对 API Server 的实时查询压力。
- 绑定器(Binder):将最终选定的节点写入 Pod 的
spec.nodeName,触发 kubelet 创建容器。
1.2 调度流程
调度器对每个待调度 Pod 执行两阶段决策:过滤(Filtering)与打分(Scoring)。过滤阶段筛选出满足 Pod 资源请求、亲和性、污点容忍等硬约束的节点集合;打分阶段对候选节点按优先级排序,选出最优节点。若打分结果出现平局,调度器会随机选择一个节点。
| 阶段 | 输入 | 输出 | 典型插件 |
|---|---|---|---|
| 过滤(Filter) | 所有节点 + Pod 约束 | 可行节点列表 | NodeResourcesFit、NodeName、NodeAffinity、TaintToleration |
| 打分(Score) | 可行节点列表 | 节点分数(0–100) | NodeResourcesBalancedAllocation、ImageLocality、InterPodAffinity |
| 绑定(Bind) | 最高分节点 | Pod → Node 绑定记录 | DefaultBinder |
性能提示:过滤阶段是“短路”设计——只要有一个插件返回不可行,该节点立即被排除,不再执行后续插件。因此,将计算量大的插件(如 PodTopologySpread)放在过滤阶段靠后的位置,可以减少不必要的计算开销。
1.3 调度策略概述
Kubernetes 提供多种内置调度策略,覆盖资源、拓扑、亲和性与负载均衡四大维度。策略通过调度器配置(KubeSchedulerConfiguration)启用、禁用或调整权重。
| 策略类别 | 代表插件 | 作用 | 适用场景 |
|---|---|---|---|
| 资源策略 | NodeResourcesFit、NodeResourcesBalancedAllocation | 确保节点满足 Pod 的 CPU/内存请求,并尽量均衡各节点资源利用率 | 通用工作负载、资源密集型应用 |
| 拓扑策略 | PodTopologySpread、NodeAffinity | 将 Pod 分散到不同拓扑域(节点、可用区),或强制部署到特定区域 | 高可用部署、多可用区集群 |
| 亲和性策略 | InterPodAffinity、NodeAffinity | 将 Pod 调度到与特定 Pod 或节点靠近的位置,减少网络延迟 | 微服务调用链优化、缓存与计算同节点 |
| 负载策略 | VolumeBinding、ImageLocality | 优先调度到已有数据卷或容器镜像的节点,减少数据迁移 | 有状态应用、大镜像服务 |
常见误区:不要将“资源策略”等同于“资源限制”。
NodeResourcesFit 检查的是 Pod 的 requests 而非 limits。如果只设置 limits 而不设置 requests,调度器会默认使用 limits 值作为调度依据,可能导致节点过载。
1.4 调度器配置示例
以下是一个自定义调度器配置片段,展示如何调整插件权重与启用抢占策略:
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: custom-scheduler
plugins:
score:
disabled:
- name: NodeResourcesBalancedAllocation
enabled:
- name: NodeResourcesLeastAllocated
weight: 3
- name: ImageLocality
weight: 2
podInitialBackoffSeconds: 1
podMaxBackoffSeconds: 10
percentageOfNodesToScore: 50
关键参数说明:
- percentageOfNodesToScore:控制参与打分的节点比例(默认 50%),大集群中可降低调度延迟。
- podInitialBackoffSeconds / podMaxBackoffSeconds:调度失败后的重试退避时间,避免频繁重试压垮 API Server。
- weight:Score 插件的权重,最终分数 = 各插件分数 × 权重之和。
生产建议:在超过 100 节点的集群中,将
percentageOfNodesToScore 设为 30–50,可在调度质量与速度之间取得平衡。对于延迟敏感型 Pod,可启用 PrioritySort 插件确保高优先级 Pod 优先出队。