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 上,经历以下完整调度流程:
- Pod 创建:用户通过 kubectl 或 API 创建 Pod,API Server 将其写入 etcd,此时
spec.nodeName为空。 - 调度器监听:kube-scheduler 通过 Informer 机制监听未调度的 Pod 队列。
- 过滤(Filter):调度器运行一组谓词插件,筛选出满足条件的 Node 列表。
- 打分(Score):对候选 Node 运行优先级插件,计算每个 Node 的最终得分。
- 绑定(Bind):选择最高分 Node,通过 API Server 将 Pod 的
spec.nodeName设置为该 Node 名称。 - kubelet 执行:目标 Node 上的 kubelet 监听到绑定事件,开始拉取镜像、创建容器。
性能关键点:调度流程中,过滤和打分阶段是可扩展的。Kubernetes 1.23+ 默认使用调度框架(Scheduling Framework),允许用户通过插件机制自定义调度逻辑。镜像拉取优化通常发生在第 6 步,但调度策略(如节点亲和性、拓扑分布约束)可以提前将 Pod 调度到已缓存目标镜像的节点,从而减少拉取时间。
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 配置两个层面协同入手。
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。