4. 默认调度器与多调度器:kube-scheduler 默认行为、多调度器架构、指定调度器名称

Kubernetes 调度器是控制平面中负责将 Pod 绑定到合适 Node 的核心组件。默认情况下,集群中运行的是 kube-scheduler,它通过一系列预选、优选和绑定算法完成调度决策。然而,在实际生产环境中,不同工作负载可能对调度策略有截然不同的要求——例如,AI 训练任务需要 GPU 拓扑感知调度,而 Web 服务更关注资源利用率均衡。Kubernetes 通过多调度器架构允许用户在同一集群中运行多个调度器实例,并通过 schedulerName 字段让 Pod 选择特定的调度器。

4.1 kube-scheduler 默认行为

默认调度器 kube-scheduler 以插件化架构运行,其调度周期分为三个阶段:

  1. 调度队列:监听 API Server,将待调度的 Pod 按优先级和等待时间排序入队。
  2. 调度周期:执行预选(Filter)和优选(Score)插件,选出最优 Node。
  3. 绑定周期:将 Pod 与 Node 的绑定关系写入 etcd。
关键默认插件:NodeResourcesFit(资源匹配)、NodeName(节点名检查)、PodTopologySpread(拓扑分布)、InterPodAffinity(亲和性)、DefaultBinder(绑定)。

默认调度器的行为可通过 kube-scheduler --config 配置文件调整,包括启用/禁用插件、修改插件权重、设置调度策略等。但所有 Pod 如果不显式指定调度器,都会由默认调度器处理。

4.2 多调度器架构

Kubernetes 支持在同一集群中部署多个调度器实例,每个调度器独立运行、独立决策。多调度器架构的核心组件包括:

组件 角色 说明
默认调度器 通用调度 处理未指定 schedulerName 的 Pod
自定义调度器 专用调度 处理指定了对应 schedulerName 的 Pod
调度器扩展器 外部决策 通过 HTTP/HTTPS 扩展默认调度器能力
调度器 Webhook 准入控制 在调度前修改 Pod 调度约束

多调度器架构的典型部署方式是将自定义调度器作为独立 Deployment 运行在集群中,使用与默认调度器相同的 ServiceAccount 权限,但监听不同的调度器名称。

最佳实践:自定义调度器应使用独立的 --scheduler-name 参数启动,避免与默认调度器冲突。建议在命名上体现调度策略,如 gpu-scheduler、network-aware-scheduler。
多调度器架构示意图 API Server 默认调度器 schedulerName: default-scheduler GPU 调度器 schedulerName: gpu-scheduler 网络感知调度器 schedulerName: net-scheduler Pod 调度队列 schedulerName 匹配 → 对应调度器消费 调度器选择逻辑 Pod 通过 spec.schedulerName 指定调度器;未指定时由 default-scheduler 处理

4.3 指定调度器名称:schedulerName

Pod 的 spec.schedulerName 字段决定了由哪个调度器负责该 Pod 的调度决策。该字段是一个字符串,默认值为 default-scheduler。当设置为其他名称时,只有同名的调度器实例才会处理该 Pod。

注意事项:如果指定的调度器名称在集群中不存在,Pod 将永远处于 Pending 状态,不会回退到默认调度器。务必确保自定义调度器已正确部署并运行。

以下是一个指定 GPU 调度器的 Pod 配置示例:

apiVersion: v1
kind: Pod
metadata:
  name: gpu-training-job
spec:
  schedulerName: gpu-scheduler
  containers:
  - name: trainer
    image: nvidia/cuda:12.0-base
    resources:
      limits:
        nvidia.com/gpu: 2
  nodeSelector:
    accelerator: nvidia-tesla

多调度器场景下的 Pod 调度流程如下表所示:

步骤 操作 涉及组件
1 Pod 创建并写入 etcd API Server
2 所有调度器监听 Pod 变更 默认调度器 + 自定义调度器
3 调度器检查 Pod.spec.schedulerName 是否匹配自身名称 各调度器实例
4 匹配的调度器执行预选、优选、绑定 匹配的调度器
5 绑定结果写入 etcd,Pod 调度完成 API Server

4.4 多调度器部署实践

部署自定义调度器时,需要关注以下关键配置:

  • 调度器名称:通过 --scheduler-name 参数指定,必须与 Pod 的 schedulerName 一致。
  • 权限配置:自定义调度器需要 ClusterRole 权限,包括对 Pod、Node、Binding 资源的读写。
  • 高可用:多副本部署时,同一名称的调度器实例之间通过 leader election 避免重复调度。
  • 监控与日志:为每个调度器配置独立的监控指标和日志输出,便于问题排查。
生产建议:在大型集群中,建议将自定义调度器部署在独立的命名空间,并设置资源配额限制。同时,为每个调度器配置 --lock-object-namespace 参数,避免锁冲突。

多调度器架构为 Kubernetes 提供了极大的调度灵活性,使得不同工作负载可以拥有专属的调度策略,而无需修改核心调度器代码。通过合理设计 schedulerName 的分配策略,可以实现精细化的资源管理和性能优化。