Kubernetes v1.35:Job Managed By 正式发布
Source: Kubernetes Blog
这意味着什么
- 全权负责 Job reconciliation 现在可以委派给外部控制器。
- 支持高级调度模式,例如 multi‑cluster dispatching。
示例用例
The MultiKueue 项目利用此功能在多个集群之间编排 Job。
欲了解更多细节,请参阅官方 Kubernetes v1.35 发行说明。
为什么需要委托 Job 调和?
此功能的主要动机是支持 多集群批量调度架构,例如 MultiKueue。
架构概览
MultiKueue 将集群区分为两类:
| 集群 | 角色 |
|---|---|
| Management Cluster | 调度 Job,但 不 执行它们。它接受 Job 对象以跟踪状态,同时跳过 Pod 的创建和执行。 |
| Worker Clusters | 接收已调度的 Job 并运行实际的 Pods。 |
- 用户通常与 Management Cluster 交互。
- 由于状态会自动向回传播,用户可以 实时 观察 Job 的进度,而无需访问 Worker Clusters。
- 在 Worker Clusters 中,调度的 Job 作为由内置 Job 控制器管理的普通 Job 运行,不 设置
.spec.managedBy字段。
.spec.managedBy 的作用
通过设置 .spec.managedBy,Management Cluster 上的 MultiKueue 控制器可以 接管 Job 的调和。它会将运行在 Worker Cluster 上的 “镜像” Job 的状态复制回 Management Cluster。
为什么不直接禁用 Job 控制器?
完全禁用内置 Job 控制器通常 不可行 或 不实际,主要有两个原因:
- 受管控制平面 – 在许多云环境中,Kubernetes 控制平面被锁定,用户无法修改 controller‑manager 标志。
- 混合集群角色 – 用户常常需要一种 “混合” 模式,即 Management Cluster 将重负载调度到远程集群 并且 仍在本地运行较小或与控制平面相关的 Job。
.spec.managedBy在 每个 Job 级别提供了必要的细粒度控制。
.spec.managedBy 的工作原理
.spec.managedBy 字段指示哪个控制器负责 Job。它支持两种运行模式:
| 模式 | 值 | 行为 |
|---|---|---|
| Standard | 未设置 或 kubernetes.io/job-controller(保留) | 内置 Job 控制器照常对 Job 进行调和。 |
| Delegation | 任何其他字符串 | 内置 Job 控制器 跳过 对该 Job 的调和。 |
注意: 此字段是 不可变 的。您不能将正在运行的 Job 从一个控制器转移到另一个控制器,这有助于防止出现孤立的 Pod 或资源泄漏。
实现外部控制器
如果您计划实现外部控制器,请确保它符合 Job API 规范。合规性通过大量的 Job 状态验证规则来强制执行。
生态系统采用
.spec.managedBy 字段正迅速成为 Kubernetes 批处理生态系统中委派控制的标准接口。
各种自定义工作负载控制器正在添加此字段(或等价字段),以允许 MultiKueue 接管它们的调和并在集群间进行编排:
虽然可以使用 .spec.managedBy 从头实现自定义 Job 控制器,但我们尚未观察到这种情况。该特性专门设计用于支持委派模式——如 MultiKueue——而无需重复造轮子。
如何了解更多?
文档
- Jobs –
- Delegation of managing a Job object to an external controller – 将 Job 对象的管理委托给外部控制器 –
- MultiKueue –
设计历史
- Kubernetes Enhancement Proposal (KEP) – Job’s
managedBymechanism – Kubernetes 增强提案 (KEP) – Job 的managedBy机制- Overview: – 概述 –
- Job‑status validation rules: – Job 状态验证规则 –
- Kueue KEP – MultiKueue –
实践指南
- See how MultiKueue uses
.spec.managedByin the task guide for running Jobs across clusters – 查看 MultiKueue 在任务指南中如何使用.spec.managedBy来 跨集群运行 Jobs –
致谢
和任何 Kubernetes 功能一样,许多人通过设计讨论、审查、测试运行和错误报告帮助塑造了此功能。
我们特别想感谢:
- Maciej Szulik – 感谢其指导、导师角色和审阅。
- Filip Křepinský – 感谢其指导、导师角色和审阅。
参与贡献
此工作由 Kubernetes Batch Working Group 赞助,并与 SIG Apps 紧密合作,同时得到 SIG Scheduling 社区的强力支持。
如果您对批量调度、多集群解决方案或进一步改进 Job API 感兴趣,您可以:
- 加入我们的 Batch WG 和 SIG Apps 会议。
- 订阅 WG Batch Slack 频道。