首页 / Kubernetes (k8s) 入门教程 / 调度器工作原理

Kubernetes (k8s) 入门教程

调度器工作原理

本教程共 65 篇 · 第 38 篇 · 更新于 2026-08-14 · 约 9 分钟阅读

Kubernetes调度器kube-scheduler调度框架过滤打分

本节目标:搞懂调度器 kube-scheduler 到底干啥,理解一次调度分”调度周期”和”绑定周期”两个阶段,认识过滤、打分等关键扩展点,建立调度流程的整体印象。

你写好 Pod 提交给集群,它怎么落到某台具体节点上?这件事由调度器(kube-scheduler)负责。它是控制平面里一个独立的组件,专职给还没安排家的 Pod 找合适的节点。

可以把调度器想成一个”分配员”:手里一堆待分配的 Pod,面前一排候选节点,它的任务是一对一对上,且尽量公平、合理。

38-1 调度器看什么

调度器做决定时主要看两边:一边是 Pod 的需求,比如要多少 CPU 内存、想靠近哪种节点、能容忍什么污点;另一边是节点的现状,比如还剩多少资源、打了哪些标签、有没有污点。

它尽量不把 Pod 堆到资源不够的节点上,也会参考亲和性、污点这些规则。但注意:调度器不管 Pod 启动后的事,那是 kubelet 的活。

Note

调度器默认只做”初次放置”。Pod 已经在节点上跑着之后资源变了,调度器不会主动把它搬走。真要重调度,得上 Descheduler 这类额外工具。

38-2 两个周期:调度与绑定

每次尝试调度一个 Pod,框架把它拆成两个阶段:

  • 调度周期:给 Pod 选出一个候选节点。这一步串行执行,同一时刻一个 Pod 走完才算下一个。
  • 绑定周期:把”选好了”这个结果写到集群(让 Pod 和节点绑上)。这一步可以并发。

这两段合起来叫一个”调度上下文”。如果中途发现 Pod 根本没节点可去,或者出了内部错误,这次调度中止,Pod 退回队列等下次重试。

38-3 调度框架的扩展点

调度器内部是一套插件架构,叫”调度框架”。它定义了一串扩展点,插件在各自的点被调用。关键的有这些:

  1. QueueSort:给待调度队列里的 Pod 排个序。
  2. PreFilter:调度前预处理,检查集群或 Pod 必须满足的前提。
  3. Filter(过滤):逐个节点筛,把放不下这个 Pod 的节点淘汰掉。比如资源不够、有不可容忍的污点,就过滤掉。
  4. PostFilter:过滤完一个可行节点都没剩时触发,典型用途是抢占——踢掉低优先级 Pod 给高优先级腾地方。
  5. Score(打分):对剩下的节点打分排名,分高者优先。
  6. Reserve:正式绑定前先”占座”,防止竞争。
  7. Permit:最后一道闸门,可批准、拒绝或让 Pod 等一会。
  8. PreBind / Bind / PostBind:真正执行绑定并收尾。
Tip

过滤阶段是”能不能放”,打分阶段是”放哪更好”。先淘汰不行的,再从剩下的里挑最优,这是调度器的基本套路。

38-4 过滤与打分具体在干嘛

过滤插件并行检查每个节点。任一过滤插件说”不行”,这个节点直接出局,后面插件不用再跑。常见过滤器会看:节点资源够不够、节点选择器匹不匹配、污点能不能容忍、端口冲突没有。

打分插件给通过过滤的节点算分数。比如”最少资源占用""节点亲和偏好""跨拓扑均匀散布”都能成为打分项。各插件分数按权重合并,总分最高的节点胜出。

Note

从 v1.33 起,特性门控 StorageCapacityScoring 取代了旧的 VolumeCapacityPriority,让调度器在打分时也考虑各节点存储容量(含动态制备的 CSI 卷)。这影响带存储需求的 Pod 的落点。

38-5 为什么这套设计好

把调度逻辑拆成插件,好处是核心保持轻量,新功能(比如新的打分策略)可以独立写成插件编译进去,不必改调度器主干。你还可以在调度器配置里开关插件,甚至定义多套”调度方案(profile)“分别服务不同工作负载。

Warning

默认插件在 v1.18 之后基本都开着。如果你自定义调度器配置,误关了某个关键插件(如负责绑定的插件),会导致 Pod 全部调度失败。动配置前先读懂每个插件干啥。

理解调度流程后,后面几章讲的节点选择器、亲和性、污点,本质都是往这套框架里”加规则”。它们只是在不同阶段影响过滤和打分而已。