1. Kubernetes 调度器概述

Kubernetes 调度器(kube-scheduler)是控制平面中负责将 Pod 分配到合适 Node 的核心组件。它不直接参与 Pod 的运行,而是通过一系列策略和算法,为每个待调度的 Pod 选择最匹配的工作节点。理解调度器的位置、流程和默认策略,是掌握调度优化的基础。

1.1 调度器在 K8s 架构中的位置

在 Kubernetes 控制平面中,调度器位于 API Server 与 kubelet 之间,作为独立的二进制组件运行。下图展示了调度器在集群中的核心位置及其与周边组件的交互关系。

Kubernetes 调度器在架构中的位置 API Server kube-scheduler etcd Node 1 kubelet Node 2 kubelet Node 3 kubelet Watch Pod Bind Pod 调度器通过 API Server 监听未调度的 Pod,决策后写入绑定记录,kubelet 负责实际启动容器

关键要点:调度器不直接与 kubelet 通信,所有交互都通过 API Server 完成。调度器将 Pod 与 Node 的绑定关系写入 etcd,kubelet 通过 Watch 机制感知并执行。

1.2 调度流程:过滤 → 打分 → 绑定

Kubernetes 调度器采用三段式调度流程,确保每个 Pod 被分配到最合适的节点。整个流程在调度器内部以“调度周期”和“绑定周期”两个阶段执行。

阶段 名称 说明 输出
1 过滤(Filter) 遍历所有 Node,排除不满足 Pod 硬性要求的节点 候选节点列表
2 打分(Score) 对候选节点按优先级规则评分,选出最优节点 最高分节点
3 绑定(Bind) 将 Pod 与选定 Node 的绑定关系写入 API Server 绑定记录

下面通过流程图展示调度器处理一个待调度 Pod 的完整路径:

调度流程:过滤 → 打分 → 绑定 待调度 Pod 阶段 1:过滤(Filter) 排除不满足硬性约束的节点 候选节点列表 阶段 2:打分(Score) 按优先级规则评分,选出最优节点 阶段 3:绑定(Bind)

调度周期 vs 绑定周期:过滤和打分属于“调度周期”(Scheduling Cycle),在调度器内部串行执行;绑定属于“绑定周期”(Binding Cycle),可以与其他 Pod 的调度周期并行执行,提升吞吐量。

1.3 默认调度策略简介

Kubernetes 内置了丰富的调度策略,分为过滤策略(Predicates)和打分策略(Priorities)。以下列出默认启用的核心策略:

1.3.1 默认过滤策略(Predicates)

策略名称 作用
PodFitsResources 检查 Node 剩余 CPU、内存是否满足 Pod 请求
PodFitsHostPorts 检查 Node 上请求的端口是否已被占用
PodMatchNodeSelector 检查 Node 标签是否匹配 Pod 的 nodeSelector
NoDiskConflict 检查 Pod 挂载的卷是否与 Node 上已有卷冲突
CheckNodeCondition 排除处于 NetworkUnavailable、NotReady 等异常状态的 Node
PodToleratesNodeTaints 检查 Pod 的容忍度是否匹配 Node 的污点

1.3.2 默认打分策略(Priorities)

策略名称 权重 作用
LeastRequestedPriority 1 优先选择资源利用率低的节点,实现负载均衡
BalancedResourceAllocation 1 优先选择 CPU 和内存使用率最均衡的节点
NodePreferAvoidPods 10000 优先避开设置了 AvoidPods 注解的节点
SelectorSpreadPriority 1 优先将同一 Service/ReplicaSet 的 Pod 分散到不同节点
InterPodAffinityPriority 1 优先满足 Pod 间亲和性与反亲和性规则
NodeAffinityPriority 1 优先满足 Node 亲和性规则

注意:默认打分策略的权重值在 Kubernetes 1.22+ 版本中已调整为更均衡的配置。实际生产环境中,建议根据业务负载特征调整权重或自定义调度策略。

1.4 调度器扩展机制

Kubernetes 调度器支持多种扩展方式,允许用户在不修改核心代码的情况下定制调度行为:

  • Scheduler Extender:通过 HTTP/HTTPS 回调,在过滤和打分阶段注入外部逻辑。
  • Scheduler Framework:Kubernetes 1.19+ 引入的插件化架构,支持在调度周期的各个扩展点注册自定义插件。
  • Multiple Schedulers:在同一集群中部署多个调度器实例,为不同工作负载指定不同的调度器。