使用 `restartPolicy = "OnFailure"` 和健康节点是否会达到作业退避限制?

lGS*_*SMl 4 kubernetes

根据 k8s 文档:

https://kubernetes.io/docs/concepts/workloads/controllers/job/#pod-backoff-failure-policy

注意:如果您的作业具有 restartPolicy = "OnFailure",请记住,一旦达到作业退避限制,运行作业的 Pod 将被终止。这会使调试作业的可执行文件变得更加困难。我们建议在调试作业或使用日志系统时设置 restartPolicy =“Never”,以确保失败作业的输出不会无意中丢失。

我对这个注释很困惑:

  1. 如果我理解正确的话,退避计数只会随着失败的 Pod 而增加,而不是失败的容器。那么restartPolicy = "OnFailure"Pod 中的相同容器将在无限循环中重新启动,除非节点失败,否则永远不会增加退避计数?

  2. 如果 #1 是正确的 - 那么这个脚注就没有意义,因为与restartPolicy = "OnFailure"或没有区别restartPolicy = "Never"- 最后一个 Pod 无论如何都会因节点故障而丢失。

  3. 脚注在并行执行的情况下可能有意义 - 例如,如果有 2 个 Pod,并且restartPolicy = "OnFailure"退避限制设置为 2。因此,如果第一个 pod 处于错误循环中,并且第二个 pod 由于节点问题失败了 2 次,则第一个 pod 会被终止通过作业控制器退出错误循环。这就是这个脚注的内容吗?对我来说,这似乎是一个极其遥远的机会。

我觉得 Pod 生命周期中有一些更简单的逻辑原因导致了这种行为,但仍然无法指出它。

Von*_*onC 5

  1. 如果我理解正确的话,退避计数只会随着失败的 Pod 而增加,而不是失败的容器。

是的,退避计数仅在 Pod 失败时增加,而容器失败时则不会增加。如果容器发生故障但 Pod 正常(例如,节点问题),则使用restartPolicy = "OnFailure",Pod 内的容器将无限期地重新启动,而不会增加退避计数。只要 Pod 本身没有失败,就不会达到 Job 的退避限制。

  1. restartPolicy = "OnFailure"如果 #1 是正确的 - 那么这个脚注就没有意义,因为与或没有区别restartPolicy = "Never"

主要区别在于restartPolicy = "OnFailure",使用 时,如果失败,容器将在同一个 Pod 内继续重新启动,而使用 时restartPolicy = "Never",容器不会重新启动。如果 Pod 失败,这两种策略都会导致作业控制器跟踪失败以达到退避限制。

你说得对,在这两种情况下节点故障都会导致最后一个 Pod 丢失。

  1. 脚注在并行执行的情况下可能有意义

脚注似乎更关注使用时的调试困难restartPolicy = "OnFailure",因为容器的不断重新启动可能会导致日志丢失或使检查失败容器的状态变得更具挑战性。

这更多的是关于调试的最佳实践,而不是描述 Pod 生命周期中的特定边缘情况。出于调试目的,使用它restartPolicy = "Never"可以更轻松地检查失败的容器,而无需重新启动它们,这可能有助于故障排除。


如果这一切还不够令人困惑,您还可以对每个索引进行退避限制(alpha,K8s 1.28+),这特别影响索引作业,其中每个作业Pod对应一个索引,并允许对每个索引的故障处理进行更细粒度的控制指数。


我觉得 Pod 生命周期中有一些更简单的逻辑原因导致了这种行为,但仍然无法指出它。

这种混乱可能源于明显的矛盾,即设置restartPolicy = "OnFailure" 可能会导致作业在达到退避限制时终止,即使此策略会在 Pod 本身没有失败的情况下无限期地重新启动容器。

因此,Pod 生命周期中导致此行为的“更简单的逻辑原因”是 PodrestartPolicy与容器和 Pod 状态的交互方式。它涉及管理重启的范围和级别(容器与 Pod),以及这些设置如何影响调试和控制Job执行的能力。