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 创建容器。
kube-scheduler 内部架构 API Server 调度队列 调度框架(扩展点) Filter → Score → Normalize → Reserve → Permit 调度缓存 绑定器 写入绑定结果

1.2 调度流程

调度器对每个待调度 Pod 执行两阶段决策:过滤(Filtering)与打分(Scoring)。过滤阶段筛选出满足 Pod 资源请求、亲和性、污点容忍等硬约束的节点集合;打分阶段对候选节点按优先级排序,选出最优节点。若打分结果出现平局,调度器会随机选择一个节点。

阶段 输入 输出 典型插件
过滤(Filter) 所有节点 + Pod 约束 可行节点列表 NodeResourcesFit、NodeName、NodeAffinity、TaintToleration
打分(Score) 可行节点列表 节点分数(0–100) NodeResourcesBalancedAllocation、ImageLocality、InterPodAffinity
绑定(Bind) 最高分节点 Pod → Node 绑定记录 DefaultBinder
性能提示:过滤阶段是“短路”设计——只要有一个插件返回不可行,该节点立即被排除,不再执行后续插件。因此,将计算量大的插件(如 PodTopologySpread)放在过滤阶段靠后的位置,可以减少不必要的计算开销。
Pod 调度流程(两阶段决策) 阶段一:过滤(Filtering) 输入:全部节点(N 个) → 执行 Filter 插件链 → 输出:可行节点(M 个,M ≤ N) 典型约束:资源足够、节点标签匹配、污点容忍、端口不冲突 阶段二:打分(Scoring) 输入:可行节点(M 个) → 执行 Score 插件链 → 输出:节点分数(0–100) 典型策略:资源均衡、镜像本地化、Pod 亲和性加分 阶段三:绑定(Binding) 选择最高分节点 → 写入 Pod.spec.nodeName → kubelet 开始创建容器 平局时随机选择,保证调度确定性

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 优先出队。