1. Kubernetes 调度器概述
Kubernetes 调度器(kube-scheduler)是控制平面中负责 Pod 与节点绑定 的核心组件。它监听尚未分配节点的 Pod,根据一系列调度策略与约束条件,为每个待调度 Pod 选择最合适的 Worker 节点,并将绑定结果写入 API Server。调度器不直接管理 Pod 生命周期,而是专注于“将 Pod 放到哪里”这一决策问题。
1.1 调度器在 K8s 架构中的位置
在 Kubernetes 控制平面中,调度器位于 API Server 与 kubelet 之间,是 Pod 生命周期中“调度阶段”的决策中枢。下图展示了调度器在集群中的逻辑位置与交互关系:
关键交互链路: 调度器不直接与 kubelet 或容器运行时通信。所有调度状态(Pod 待调度、节点资源、绑定结果)均通过 API Server 读写,保证了控制平面的一致性与可审计性。
1.2 调度器核心职责
调度器的职责可以归纳为以下四个核心维度:
| 职责维度 | 说明 | 典型场景 |
|---|---|---|
| 资源匹配 | 确保所选节点满足 Pod 的 CPU、内存、GPU 等资源请求 | Pod 声明 2 核 4Gi,调度器过滤掉资源不足的节点 |
| 约束满足 | 执行 nodeSelector、亲和性/反亲和性、污点容忍等调度约束 | Pod 必须调度到带有 disk=ssd 标签的节点 |
| 负载均衡 | 通过评分算法将 Pod 分散到不同节点,避免热点 | 优先选择已分配资源比例最低的节点 |
| 拓扑感知 | 考虑节点地域、可用区、机架等拓扑信息,优化网络与容灾 | 将 Pod 调度到同一可用区以减少跨区延迟 |
调度器 vs. 控制器: 控制器(如 Deployment Controller)负责确保 Pod 副本数符合期望,而调度器负责为每个 Pod 选择具体节点。两者分工明确,协作完成 Pod 的完整生命周期管理。
1.3 调度器工作流程简介
Kubernetes 调度器采用 两阶段调度 架构:过滤(Filtering) 与 评分(Scoring)。整体流程如下:
- 监听与排队: 调度器通过 Informer 机制监听 API Server 中
spec.nodeName为空的 Pod,将其加入内部调度队列。 - 过滤阶段(Predicates): 遍历所有节点,逐一执行预选策略(如资源充足、端口不冲突、满足亲和性等),生成候选节点列表。
- 评分阶段(Priorities): 对候选节点执行多维度评分(如资源利用率、Pod 分布均匀度),计算每个节点的综合得分。
- 绑定阶段: 选择得分最高的节点,将 Pod 的
spec.nodeName更新为该节点名称,完成绑定。 - 异步确认: 目标节点的 kubelet 监听到绑定事件后,拉取镜像并启动容器。若启动失败,调度器不会重新调度,而是由控制器负责处理。
下图展示了调度器内部的核心工作流程:
注意: 调度器默认使用 抢占式调度(Priority & Preemption)。当高优先级 Pod 无法调度时,调度器可以驱逐低优先级 Pod 以释放资源。这一机制在过滤阶段之后、评分阶段之前触发,属于调度流程的扩展路径。