已完成作业的自动清理

用于清理已完成执行的旧作业的生存时间机制。
特性状态: Kubernetes v1.23 [稳定版]

当你的 Job 完成后,将该 Job 保留在 API 中(而不是立即删除 Job)是很有用的,这样你可以知道 Job 是否成功或失败。

Kubernetes 的 TTL-after-finished 控制器提供了一种 TTL(生存时间)机制,以限制已完成执行的 Job 对象的生命周期。

清理已完成的 Job

TTL-after-finished 控制器仅支持 Job。你可以通过指定 Job 的 .spec.ttlSecondsAfterFinished 字段来自动清理已完成的 Job(CompleteFailed),如本示例所示。

TTL-after-finished 控制器假设 Job 在完成后经过 TTL 秒后有资格被清理。计时器在 Job 的状态条件变为显示 Job 为 CompleteFailed 时开始;一旦 TTL 过期,该 Job 就有资格进行级联删除。当 TTL-after-finished 控制器清理 Job 时,它将级联删除它,也就是说它将同时删除它的依赖对象。

Kubernetes 遵守 Job 上的对象生命周期保证,例如等待终结器

你可以随时设置 TTL 秒数。以下是一些设置 Job 的 .spec.ttlSecondsAfterFinished 字段的示例

  • 在 Job 清单中指定此字段,以便 Job 可以在完成一段时间后自动清理。
  • 手动设置现有、已完成的 Job 的此字段,以便它们有资格进行清理。
  • 使用变更准入 Webhook在 Job 创建时动态设置此字段。集群管理员可以使用它来强制执行已完成作业的 TTL 策略。
  • 使用变更准入 Webhook在 Job 完成后动态设置此字段,并根据作业状态、标签选择不同的 TTL 值。对于这种情况,Webhook 需要检测 Job 的 .status 的更改,并且仅当 Job 被标记为已完成时才设置 TTL。
  • 编写你自己的控制器来管理与特定选择算符匹配的 Job 的清理 TTL。

注意事项

更新已完成的 Job 的 TTL

你可以在 Job 创建后或完成后修改 TTL 周期,例如 Job 的 .spec.ttlSecondsAfterFinished 字段。如果你在现有的 ttlSecondsAfterFinished 周期过期后延长 TTL 周期,Kubernetes 不保证保留该 Job,即使延长 TTL 的更新返回成功的 API 响应。

时间偏差

由于 TTL-after-finished 控制器使用存储在 Kubernetes 作业中的时间戳来确定 TTL 是否已过期,因此此功能对集群中的时间偏差敏感,这可能导致控制平面在错误的时间清理 Job 对象。

时钟并不总是正确的,但差异应该很小。在设置非零 TTL 时,请注意这种风险。

下一步

上次修改时间为 2024 年 10 月 14 日下午 3:21 PST:修复 selector-selector 的拼写错误 (4d9b8d0c8c)