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

Kubernetes 调度器(kube-scheduler)是控制平面的核心组件之一,负责将待调度的 Pod 绑定到最合适的 Node 上。调度决策不仅影响集群的资源利用率,还直接关系到应用的启动速度、稳定性和运维成本。本章从调度器的工作原理、完整调度流程以及内部架构组件三个维度展开,为后续优化容器镜像拉取与架构环境配置奠定基础。

1.1 调度器工作原理

调度器本质上是一个“资源匹配与约束满足”引擎。它监听 API Server 中未调度的 Pod(spec.nodeName 为空),通过一系列过滤和打分算法,从所有可用 Node 中选出最优节点,并将绑定结果写回 API Server。整个过程遵循“谓词-优先级”两阶段决策模型:

  • 过滤阶段(Predicates / Filtering):排除不满足 Pod 约束条件的 Node,例如资源不足、端口冲突、节点污点不匹配、节点选择器不满足等。
  • 打分阶段(Priorities / Scoring):对通过过滤的 Node 进行多维度评分,最终选择总分最高的 Node 作为调度目标。
关键认知:调度器不直接启动容器,也不拉取镜像。它只负责“决策”,真正的执行由 kubelet 完成。理解这一分工,是后续优化镜像拉取的前提——调度策略决定了 Pod 落在哪个节点,而镜像拉取效率取决于节点本地缓存与网络条件。

1.2 调度流程详解

一个 Pod 从创建到运行在目标 Node 上,经历以下完整调度流程:

  1. Pod 创建:用户通过 kubectl 或 API 创建 Pod,API Server 将其写入 etcd,此时 spec.nodeName 为空。
  2. 调度器监听:kube-scheduler 通过 Informer 机制监听未调度的 Pod 队列。
  3. 过滤(Filter):调度器运行一组谓词插件,筛选出满足条件的 Node 列表。
  4. 打分(Score):对候选 Node 运行优先级插件,计算每个 Node 的最终得分。
  5. 绑定(Bind):选择最高分 Node,通过 API Server 将 Pod 的 spec.nodeName 设置为该 Node 名称。
  6. kubelet 执行:目标 Node 上的 kubelet 监听到绑定事件,开始拉取镜像、创建容器。
性能关键点:调度流程中,过滤和打分阶段是可扩展的。Kubernetes 1.23+ 默认使用调度框架(Scheduling Framework),允许用户通过插件机制自定义调度逻辑。镜像拉取优化通常发生在第 6 步,但调度策略(如节点亲和性、拓扑分布约束)可以提前将 Pod 调度到已缓存目标镜像的节点,从而减少拉取时间。
Pod 调度完整流程时序图 用户 / kubectl API Server Scheduler etcd kubelet ① 创建 Pod ② 存储 ③ Watch ④ Filter(过滤) ⑤ Score(打分) ⑥ Bind(绑定) 写回绑定 ⑦ 通知调度结果 ⑧ 拉取镜像 说明:调度器只负责 ①~⑥,镜像拉取与容器启动由 kubelet 在 ⑧ 阶段执行

1.3 调度器架构组件解析

Kubernetes 调度器采用插件化架构(Scheduling Framework),内部由多个协同工作的组件构成。下表列出核心组件及其职责:

组件名称 类型 核心职责 可扩展性
调度队列(Scheduling Queue) 内部模块 管理待调度的 Pod,支持优先级排序、重试、背压 可通过 QueueSort 插件定制排序
过滤插件(Filter Plugins) 扩展点 执行节点过滤,如 NodeResourcesFit、NodeName、NodeUnschedulable 可自定义谓词插件
打分插件(Score Plugins) 扩展点 对候选节点评分,如 SelectorSpread、LeastRequestedPriority 可自定义评分算法
绑定插件(Bind Plugins) 扩展点 将 Pod 绑定到选定 Node,默认通过 API Server 写入 可自定义绑定逻辑(如多集群调度)
预过滤/预打分(PreFilter/PreScore) 扩展点 在过滤/打分前执行预处理,如缓存计算、数据准备 用于性能优化
预留插件(Reserve Plugins) 扩展点 在绑定前预留节点资源,防止并发冲突 用于资源预订场景
Permit 插件 扩展点 批准或拒绝调度结果,支持等待/超时机制 用于准入控制
常见误区:很多运维人员认为调度器直接管理容器运行时。实际上,调度器只操作 API 对象(Pod/Node 的元数据),不接触容器运行时、镜像仓库或 CNI 网络。镜像拉取优化需要从调度策略(如节点亲和性、镜像缓存感知调度)和 kubelet 配置两个层面协同入手。
kube-scheduler 内部架构组件图 调度队列 调度主循环 Scheduling Framework 扩展点 PreFilter 插件 Filter 插件 PostFilter 插件 PreScore 插件 Score 插件 NormalizeScore 插件 Reserve 插件 Permit 插件 Bind 插件 每个扩展点可注册多个插件,按配置顺序执行;插件可启用/禁用/调整权重

1.4 调度器关键配置参数

调度器的行为可以通过启动参数和配置文件调整。以下列出与调度性能和镜像拉取优化相关的核心参数:

参数名 默认值 作用说明 镜像拉取关联
--kubeconfig /etc/kubernetes/scheduler.conf 指定 kubeconfig 文件路径 —
--leader-elect true 启用领导者选举,保证高可用 —
--profiling true 启用性能分析接口(/debug/pprof) 用于诊断调度延迟
--config "" 指定调度器配置文件(KubeSchedulerConfiguration) 可配置插件列表与权重
--v 2 日志级别,建议生产环境设为 3~4 用于调试 排查调度失败原因
实践建议:在调度器配置文件中,可以通过 profiles 字段定义多个调度 profile,每个 profile 绑定不同的插件集合。例如,为 GPU 工作负载单独配置一个 profile,启用 NodeResourcesFit 和 NodeAffinity 插件,同时禁用不必要的默认插件,从而减少调度延迟。

1.5 调度器与镜像拉取的关联

虽然调度器不直接参与镜像拉取,但调度决策对镜像拉取效率有显著影响:

  • 节点亲和性(NodeAffinity):将 Pod 调度到已缓存目标镜像的节点,避免从远程仓库拉取大镜像。
  • Pod 反亲和性(PodAntiAffinity):避免将大量需要相同镜像的 Pod 集中调度到同一节点,防止镜像拉取并发过高导致 I/O 瓶颈。
  • 拓扑分布约束(TopologySpreadConstraints):将 Pod 均匀分布到不同可用区,利用各节点的本地镜像缓存。
  • 污点与容忍(Taints & Tolerations):将镜像拉取慢的节点标记为特殊污点,仅调度容忍该污点的 Pod。