1. Kubernetes 调度概述:调度器工作原理、调度流程、调度器架构组件解析

Kubernetes 调度器(kube-scheduler)是控制平面中负责将 Pod 绑定到合适 Node 的核心组件。它不负责运行 Pod,而是通过一系列算法为每个待调度 Pod 选择最优的节点。理解调度器的工作原理、完整流程和内部架构,是进行调度优化和镜像拉取加速的前提。

1.1 调度器工作原理

调度器采用 “事件驱动 + 异步循环” 的工作模式。它通过监听 API Server 获取未调度的 Pod(spec.nodeName 为空),然后执行调度算法,最终将 Pod 与 Node 的绑定关系写入 etcd。其核心原则是:“为每个 Pod 找到一个满足约束条件且资源最充裕的节点”。

关键设计理念:
  • 可插拔策略: 调度策略(Predicates & Priorities)可通过配置文件动态加载,无需重新编译。
  • 异步非阻塞: 调度周期独立运行,不阻塞 API Server 的其他操作。
  • 乐观并发: 调度器假设资源充足,仅在绑定前做最终校验,减少锁竞争。

1.2 调度流程(核心三阶段)

一个 Pod 从创建到运行在节点上,经历以下三个阶段:

阶段 名称 核心动作 输出
1 过滤阶段(Predicates) 遍历所有 Node,剔除不满足 Pod 约束的节点(如资源不足、端口冲突、污点不匹配)。 候选节点列表
2 打分阶段(Priorities) 对候选节点按资源利用率、亲和性、拓扑分布等策略进行加权评分。 节点分数排序
3 绑定阶段(Bind) 选择最高分节点,通过 API Server 将 Pod 与 Node 的绑定关系写入 etcd。 Pod 绑定记录
优化切入点: 镜像拉取时间通常发生在绑定阶段之后(kubelet 开始创建容器时)。调度器本身不处理镜像拉取,但可以通过 节点亲和性 和 Pod 拓扑分布约束 将 Pod 调度到已缓存镜像的节点,从而减少拉取时间。

1.3 调度器架构组件解析

Kubernetes 调度器内部采用 “调度框架(Scheduling Framework)” 架构,将调度流程拆解为多个可扩展的扩展点(Extension Points)。下图展示了调度器的核心组件与交互关系:

Kubernetes 调度器架构组件图 Kubernetes 调度器架构组件 API Server 调度器主循环(Scheduling Cycle) 过滤阶段(Predicates) 资源检查 · 端口冲突 · 污点容忍 · 节点选择器 打分阶段(Priorities) 资源均衡 · 亲和性 · 拓扑分布 · 自定义权重 绑定阶段(Bind) etcd(持久化绑定) 扩展点:PreFilter · Filter · PostFilter · PreScore · Score · NormalizeScore · Reserve · Permit · PreBind · Bind · PostBind

1.4 调度框架扩展点详解

调度框架(Scheduling Framework)将调度周期拆分为多个扩展点,允许用户通过 调度插件(Scheduler Plugin) 在特定阶段注入自定义逻辑。以下是核心扩展点及其作用:

扩展点 所属阶段 典型插件示例 作用
PreFilter 过滤前 NodeResourcesFit 预处理 Pod 资源请求,检查集群整体容量
Filter 过滤 NodeUnschedulable, TaintToleration 剔除不满足硬约束的节点
PostFilter 过滤后 DefaultPreemption 无可用节点时触发抢占(Preemption)
PreScore 打分前 PodTopologySpread 计算打分所需的全局拓扑信息
Score 打分 NodeResourcesBalancedAllocation 为每个候选节点生成分数(0-100)
NormalizeScore 打分后 ImageLocality 对分数进行归一化或加权修正
Reserve 绑定前 VolumeBinding 预留资源,防止并发冲突
Permit 绑定前 (自定义) 批准或延迟绑定(如等待外部条件)
PreBind 绑定前 NodeAffinity 执行绑定前的预处理(如挂载卷)
Bind 绑定 DefaultBinder 将 Pod 绑定到 Node(写入 etcd)
PostBind 绑定后 (清理类) 绑定完成后的清理或日志记录
镜像拉取关联: ImageLocality 插件在 NormalizeScore 阶段根据节点上是否已缓存 Pod 所需的镜像来调整分数。默认权重较低(0.1),但在大规模集群中,开启并调高该权重可以显著减少 Pod 启动延迟。后续章节将详细讲解如何配置该插件。

1.5 调度器组件与数据流

调度器内部由以下核心组件协作完成调度任务:

  • Scheduler Cache: 本地缓存 Node 和 Pod 状态,减少对 API Server 的频繁查询。通过 Watch 机制与 etcd 保持最终一致。
  • Scheduler Queue: 管理待调度 Pod 的优先级队列。支持三种队列:ActiveQ(活跃)、BackoffQ(退避)、UnschedulableQ(不可调度)。
  • Framework: 调度框架实例,负责按顺序调用注册的扩展点插件。
  • Extenders: 外部调度扩展器(已逐步被调度框架替代),用于与第三方调度系统集成。

下图展示了调度器内部组件之间的数据流关系:

调度器内部组件数据流 调度器内部组件数据流 API Server Watch Pod/Node Scheduler Queue ActiveQ / BackoffQ / UnschedulableQ Scheduling Framework 扩展点插件链 Cache Node/Pod 同步状态 Bind Pod → Node 绑定结果写入 etcd

1.6 调度器关键配置参数

以下参数直接影响调度性能和镜像拉取优化策略:

参数 默认值 说明 优化建议
--kube-api-qps 50 调度器与 API Server 通信的 QPS 上限 大规模集群可提升至 100-200
--kube-api-burst 100 突发请求数 配合 QPS 调整,避免限流
--permit-wait-timeout 0s Permit 扩展点等待超时 镜像拉取等待场景可设为 30s
--profiling true 启用性能分析接口 生产环境建议开启用于排查