4. Pod 调度原理:kube-scheduler 调度流程详解,调度算法(过滤、打分)与节点选择

在 Kubernetes 集群节点扩容场景中,kube-scheduler 是决定新 Pod 最终运行在哪个节点上的核心组件。理解其调度流程与算法,是进行资源调度与容量规划协同的基础。调度过程并非随机选择,而是遵循一套严格的“过滤 → 打分 → 绑定”三步走机制。

4.1 调度整体流程:从 Pod 创建到节点绑定

kube-scheduler 以“调度器循环(Scheduling Cycle)”和“绑定循环(Binding Cycle)”两个阶段协同工作。当一个新的 Pod 被创建且未指定 nodeName 时,调度器会立即介入。

核心流程: 调度器通过 Informer 机制监听 API Server 中未调度的 Pod,将其加入调度队列。随后,调度器从队列中取出 Pod,依次执行过滤、打分、绑定操作。
kube-scheduler 调度流程总览 Pod 创建(未调度) 调度队列(Scheduling Queue) 过滤阶段(Predicates) 打分阶段(Priorities) 绑定到最优节点

4.2 过滤阶段(Predicates):节点硬性条件筛选

过滤阶段的目标是快速排除不满足 Pod 运行基本要求的节点。调度器会并行执行一组预置的“谓词(Predicates)”检查,只有通过所有检查的节点才能进入下一阶段。

过滤策略 检查内容 典型场景
PodFitsResources 节点剩余 CPU、内存是否满足 Pod 的 requests 节点资源不足时直接过滤
PodFitsHostPorts Pod 请求的端口(hostPort)是否已被占用 避免端口冲突
PodSelectorMatches 节点标签是否匹配 Pod 的 nodeSelector 定向调度到特定节点池
NodeAffinity 检查节点是否满足 requiredDuringScheduling 亲和性规则 强制调度到特定区域或硬件类型
TaintToleration 节点污点(Taints)是否被 Pod 容忍(Tolerations) 隔离专用节点(如 GPU 节点)
CheckNodeDiskPressure 节点磁盘压力是否过高 避免调度到磁盘 I/O 瓶颈节点
实践提示: 在节点扩容时,如果大量 Pod 因资源不足而处于 Pending 状态,应优先检查 PodFitsResources 过滤结果。可以通过 kubectl describe pod <pod-name> 查看调度事件中的过滤失败原因。

4.3 打分阶段(Priorities):节点软性优选排序

通过过滤的节点进入打分阶段。调度器会运行一组优先级函数(Priority Functions),为每个节点计算一个综合得分(0-100 分),最终选择得分最高的节点。如果多个节点得分相同,则随机选择一个。

打分策略 计算逻辑 权重影响
LeastRequestedPriority 优先选择资源利用率最低的节点(CPU + 内存) 默认权重 1,促进负载均衡
BalancedResourceAllocation 优先选择 CPU 与内存使用率最均衡的节点 默认权重 1,避免资源碎片
NodePreferAvoidPods 根据节点注解避免调度特定 Pod 权重较低,用于软性约束
TaintTolerationPriority 根据 Pod 容忍的污点数量打分,容忍越多得分越低 鼓励调度到无污点节点
ImageLocalityPriority 优先选择已缓存 Pod 所需镜像的节点 减少镜像拉取时间

4.4 节点选择与绑定:最终决策

打分完成后,调度器选择得分最高的节点作为目标节点。随后进入绑定循环:调度器通过 API Server 创建一个 Binding 对象,将 Pod 与目标节点绑定。kubelet 监听到绑定信息后,会在该节点上启动 Pod。

注意: 绑定操作是异步的。如果绑定失败(例如节点突然不可用),调度器会重新将 Pod 加入调度队列,再次执行完整的过滤与打分流程。这保证了调度的高可用性。

4.5 调度算法与节点扩容的协同关系

在集群节点扩容时,理解调度算法有助于优化资源分配:

  • 资源预留: 新节点加入集群后,调度器会自动将其纳入过滤与打分范围。如果新节点资源充足且无污点,它将成为高优先级目标。
  • 负载均衡: LeastRequestedPriority 策略会优先将 Pod 调度到资源利用率较低的节点,这天然支持扩容后的负载均衡。
  • 亲和性影响: 如果扩容节点带有特定标签(如 node-role.kubernetes.io/new-pool),可以通过 nodeAffinity 或 nodeSelector 引导 Pod 调度到新节点。
调度算法决策树:过滤 → 打分 → 选择 集群所有节点 过滤阶段:资源、端口、污点、亲和性 通过节点(候选集) 淘汰节点(不满足条件) 打分阶段:负载均衡、镜像、亲和性 选择最高分节点

4.6 调度器扩展与自定义策略

对于复杂的容量规划场景,Kubernetes 支持通过 Scheduler Framework 扩展调度器行为。你可以编写自定义的过滤插件或打分插件,例如:

  • 自定义过滤插件: 检查节点是否属于特定的扩容节点池(通过标签或注解)。
  • 自定义打分插件: 优先选择新扩容的节点,加速新节点资源利用。
关键命令: 查看当前调度器使用的策略配置:
kubectl get pods -n kube-system -l component=kube-scheduler -o yaml | grep -A 20 "command"
通过修改 kube-scheduler 的 --config 参数,可以启用自定义调度策略。