Kubernetes v1.33:Job 逐索引的回退限制进阶至 GA

在 Kubernetes v1.33 中,逐索引的回退限制特性进阶至 GA(正式发布)。本文介绍此特性及其优势。

关于逐索引的回退限制

当你在 Kubernetes 上运行工作负载时,必须考虑 Pod 失效可能影响工作负载完成的场景。理想情况下,你的工作负载应该能够容忍短暂的失效并继续运行。

为了在 Kubernetes Job 中容忍失效,你可以设置 spec.backoffLimit 字段。此字段指定容忍的失效总数。

但是,对于每个索引都被视为独立单元的工作负载,比如过易并行的工作负载,spec.backoffLimit 字段通常不够灵活。例如,你可以选择运行多个继承测试套件,将每个套件作为带索引的 Job内的某个索引。在这种情况下,快速失效的索引(测试套件)很可能消耗你全部的 Pod 失效容忍预算,你可能无法运行其他索引的 Pod。

为了解决这一限制,Kubernetes 引入了逐索引的回退限制,允许你控制逐索引的重试次数。

逐索引回退限制的工作原理

要在带索引的 Job 中使用逐索引的回退限制,可以通过 spec.backoffLimitPerIndex 字段指定每个索引允许的 Pod 失效次数。当你设置此字段后,Job 默认将执行所有索引。

另外,你可以通过以下方式微调错误处理:

  • 通过设置 spec.maxFailedIndexes 字段,指定失效索引总数的上限。超过此限制时,整个 Job 会被终止。
  • 通过 Pod 失效策略机制中的FailIndex 动作定义短路来检测失效的索引。

当超过容忍的失效次数时,Job 会将该索引标记为失效,并在 Job 的 status.failedIndexes 字段中列出该索引。

示例

下面的 Job 规约片段展示了如何将逐索引的回退限制与 Pod 失效策略特性结合使用:

completions: 10
parallelism: 10
completionMode: Indexed
backoffLimitPerIndex: 1
maxFailedIndexes: 5
podFailurePolicy:
  rules:
  - action: Ignore
    onPodConditions:
    - type: DisruptionTarget
  - action: FailIndex
    onExitCodes:
      operator: In
      values: [ 42 ]

在此例中,Job 对 Pod 失效的处理逻辑如下:

  • 忽略具有内置干扰状况 (称为 DisruptionTarget)的失效 Pod。这些 Pod 不计入 Job 的回退限制。
  • 如果失效的 Pod 中任何容器的退出码是 42,则基于匹配的 FailIndex 规则,将对应的索引标记为失效。
  • 除非索引因匹配的 FailIndex 规则失效,否则会重试该索引的首次失效。
  • 如果失效索引数量超过 5 个(由 spec.maxFailedIndexes 设置),则整个 Job 失效。

进一步了解

参与此工作

这项工作由 Kubernetes Batch Working Group(批处理工作组)负责,且与SIG Apps 社区密切协作。

如果你有兴趣参与此领域的新特性开发,建议订阅我们的Slack 频道,并参加定期社区会议。