Kubernetes v1.35:Job Managed By 正式发布

发布: (2025年12月19日 GMT+8 02:30)
6 min read

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 控制器通常 不可行不实际,主要有两个原因:

  1. 受管控制平面 – 在许多云环境中,Kubernetes 控制平面被锁定,用户无法修改 controller‑manager 标志。
  2. 混合集群角色 – 用户常常需要一种 “混合” 模式,即 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 managedBy mechanism – Kubernetes 增强提案 (KEP) – Job 的 managedBy 机制
    • Overview: – 概述 –
    • Job‑status validation rules: – Job 状态验证规则 –
  • Kueue KEP – MultiKueue

实践指南

  • See how MultiKueue uses .spec.managedBy in the task guide for running Jobs across clusters – 查看 MultiKueue 在任务指南中如何使用 .spec.managedBy跨集群运行 Jobs

致谢

和任何 Kubernetes 功能一样,许多人通过设计讨论、审查、测试运行和错误报告帮助塑造了此功能。
我们特别想感谢:

参与贡献

此工作由 Kubernetes Batch Working Group 赞助,并与 SIG Apps 紧密合作,同时得到 SIG Scheduling 社区的强力支持。

如果您对批量调度、多集群解决方案或进一步改进 Job API 感兴趣,您可以:

Back to Blog

相关文章

阅读更多 »