重要
Kubernetes 默认调度器 kube-scheduler 按 CPU/内存请求 + 节点亲和性做 Pod 放置。当需要 GPU 拓扑感知、成本优先、实时性优先等自定义调度策略时,通过 Scheduler Framework 插入自定义逻辑。
Scheduler Framework 将调度拆成多个扩展点,每个扩展点可以注册多个插件,插件之间按权重协作。
环境说明
- Kubernetes v1.26+
1.简介
Kube-scheduler 的每一个调度决策可以拆成两阶段:
| 阶段 | 操作 | 关键扩展点 |
|---|---|---|
| 调度周期(Scheduling Cycle) | 为 Pod 选定一个 Node | QueueSort → Filter → Score → Reserve |
| 绑定周期(Binding Cycle) | 将 Pod 绑定到选定的 Node | Permit → Bind → PostBind |
调度周期是同步串行的(一次只处理一个 Pod),绑定周期是异步并行的。
2.说明
2.1 架构总览
| |
每个扩展点可以注册多个插件,调度器在每个阶段依次调用,Score 阶段各插件分数加权求和。
2.2 关键扩展点
| 扩展点 | 输入 | 输出 | 用途 |
|---|---|---|---|
QueueSort | 待调度 Pods 列表 | 排序后的队列 | 优先级调度 |
Filter | Pod + Node 信息 | Success or Unschedulable | 硬件筛选(GPU 型号)、拓扑约束 |
Score | Pod + Node 信息 | 0~100 分 | 成本优选、装箱率优选 |
Reserve | Pod + 选定 Node | Reserve / Unreserve | GPU 拓扑感知预留 |
Permit | Pod + 选定 Node | Approve / Deny / Wait | 等待外部条件(如 license) |
Bind | Pod + 选定 Node | 绑定结果 | 自定义绑定逻辑 |
2.3 插件注册
| |
注册插件——在 main() 中用 runtime.Registry 注册:
| |
2.4 配置示例
通过 KubeSchedulerConfiguration 启用自定义插件并配置权重:
| |
| 配置项 | 说明 |
|---|---|
schedulerName | 使用此 Profile 的 Pod 需声明 schedulerName: custom-scheduler |
enabled | 启用插件,disabled 可禁用默认插件 |
weight | Score 阶段权重,最终得分加权求和决定选中 Node |
pluginConfig | 向插件传入自定义参数 |
2.5 多 Profile
一个 kube-scheduler 实例可以加载多个 Profile,每个 Profile 有自己的一套启用插件 + 配置。不同业务通过 Pod 的 schedulerName 字段路由到不同 Profile。
| |
3.总结
- Scheduler Framework 是 K8s 调度层的扩展接口,将调度拆成多个扩展点;
- Filter 做裁剪,Score 做优选,Permit 做阻塞控制——三者覆盖大部分自定义调度需求;
- 多 Profile 让同一集群内不同业务使用不同调度策略,无需部署多个调度器实例。