4. 默认调度器与多调度器:kube-scheduler 默认行为、多调度器架构、指定调度器名称
Kubernetes 调度器是控制平面中负责将 Pod 绑定到合适 Node 的核心组件。默认情况下,集群中运行的是 kube-scheduler,它通过一系列预选、优选和绑定算法完成调度决策。然而,在实际生产环境中,不同工作负载可能对调度策略有截然不同的要求——例如,AI 训练任务需要 GPU 拓扑感知调度,而 Web 服务更关注资源利用率均衡。Kubernetes 通过多调度器架构允许用户在同一集群中运行多个调度器实例,并通过 schedulerName 字段让 Pod 选择特定的调度器。
4.1 kube-scheduler 默认行为
默认调度器 kube-scheduler 以插件化架构运行,其调度周期分为三个阶段:
- 调度队列:监听 API Server,将待调度的 Pod 按优先级和等待时间排序入队。
- 调度周期:执行预选(Filter)和优选(Score)插件,选出最优 Node。
- 绑定周期:将 Pod 与 Node 的绑定关系写入 etcd。
默认调度器的行为可通过 kube-scheduler --config 配置文件调整,包括启用/禁用插件、修改插件权重、设置调度策略等。但所有 Pod 如果不显式指定调度器,都会由默认调度器处理。
4.2 多调度器架构
Kubernetes 支持在同一集群中部署多个调度器实例,每个调度器独立运行、独立决策。多调度器架构的核心组件包括:
| 组件 | 角色 | 说明 |
|---|---|---|
| 默认调度器 | 通用调度 | 处理未指定 schedulerName 的 Pod |
| 自定义调度器 | 专用调度 | 处理指定了对应 schedulerName 的 Pod |
| 调度器扩展器 | 外部决策 | 通过 HTTP/HTTPS 扩展默认调度器能力 |
| 调度器 Webhook | 准入控制 | 在调度前修改 Pod 调度约束 |
多调度器架构的典型部署方式是将自定义调度器作为独立 Deployment 运行在集群中,使用与默认调度器相同的 ServiceAccount 权限,但监听不同的调度器名称。
--scheduler-name 参数启动,避免与默认调度器冲突。建议在命名上体现调度策略,如 gpu-scheduler、network-aware-scheduler。
4.3 指定调度器名称:schedulerName
Pod 的 spec.schedulerName 字段决定了由哪个调度器负责该 Pod 的调度决策。该字段是一个字符串,默认值为 default-scheduler。当设置为其他名称时,只有同名的调度器实例才会处理该 Pod。
以下是一个指定 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 的分配策略,可以实现精细化的资源管理和性能优化。