在 Kubernetes v1.35 中,通过 .spec.managedBy 指定外部 Job 控制器的能力升级为正式可用(GA)。
该特性允许外部控制器对 Job 的调谐(reconciliation)承担完全责任,从而解锁更强大的调度模式, 例如借助 MultiKueue 进行跨多集群派发。
该特性的主要动机是支持多集群批处理调度架构,例如 MultiKueue。
MultiKueue 架构区分“管理集群(Management Cluster)”与一组“工作集群(Worker Clusters)”:
.spec.managedBy。通过使用 .spec.managedBy,管理集群上的 MultiKueue 控制器可以接管某个 Job 的调谐。
它会将工作集群中运行的“镜像(mirror)Job”的状态复制回管理集群。
为什么不直接禁用 Job 控制器?理论上可以通过完全禁用内置 Job 控制器来实现, 但这通常不可行或不现实,原因主要有两点:
.spec.managedBy 让这种粒度可以按 Job 逐个控制。.spec.managedBy 的工作机制.spec.managedBy 字段用于指示由哪个控制器负责该 Job。
具体而言,它有两种工作模式:
kubernetes.io/job-controller,
内置 Job 控制器会像往常一样调谐该 Job(标准行为)。为防止出现孤儿 Pod 或资源泄漏,该字段是不可变的(immutable)。 你不能将一个正在运行的 Job 从一个控制器转移到另一个控制器。
如果你计划实现一个外部控制器,请注意你的控制器需要符合 Job API 的定义。
为确保这种一致性,这项工作的一个重要部分是引入了一套完善且严格的 Job 状态校验规则。
更多细节请参阅如何进一步了解?一节。
.spec.managedBy 字段正在快速成为 Kubernetes 批处理生态中委派控制的标准接口。
多种自定义工作负载控制器正在加入该字段(或等效字段), 以便让 MultiKueue 接管它们的调谐并在多集群之间进行编排:
虽然理论上可以用 .spec.managedBy 从零实现一个自定义 Job 控制器,
但我们尚未观察到这种用法。该特性更明确地面向委派模式(例如 MultiKueue)而设计,
以避免重复造轮子。
如果你想进一步深入了解:
阅读面向用户的文档:
深入了解设计历程:
也可以通过任务指南了解 MultiKueue 在实践中如何使用 .spec.managedBy:
跨集群运行 Job。
与任何 Kubernetes 特性一样,这项特性也由许多人一起塑造: 他们参与设计讨论、评审、试运行与缺陷报告等工作。
我们特别感谢:
这项工作由 Kubernetes 的 Batch Working Group 发起, 并与 SIG Apps 紧密协作, 同时也得到了 SIG Scheduling 社区的强力支持与投入。
如果你对批处理调度、多集群解决方案或进一步改进 Job API 感兴趣: