From 6838c7e932fc0fd4b8d93888219b9ca163858bc0 Mon Sep 17 00:00:00 2001 From: "xin.li" Date: Sun, 18 Aug 2024 10:46:22 +0800 Subject: [PATCH] [zh-cn] sync controllers/job.md Signed-off-by: xin.li --- .../concepts/workloads/controllers/job.md | 204 ++++++++++++++---- 1 file changed, 167 insertions(+), 37 deletions(-) diff --git a/content/zh-cn/docs/concepts/workloads/controllers/job.md b/content/zh-cn/docs/concepts/workloads/controllers/job.md index ad3cec065ad62..067c058057749 100644 --- a/content/zh-cn/docs/concepts/workloads/controllers/job.md +++ b/content/zh-cn/docs/concepts/workloads/controllers/job.md @@ -573,9 +573,7 @@ multiple pods running at once. Therefore, your pods must also be tolerant of con 为此,你的 Pod 也必须能够处理并发性问题。 -当[特性门控](/zh-cn/docs/reference/command-line-tools-reference/feature-gates/) -`PodDisruptionConditions` 和 `JobPodFailurePolicy` 都被启用且 `.spec.podFailurePolicy` 字段被设置时, +当你指定了 `.spec.podFailurePolicy` 字段, Job 控制器不会将终止过程中的 Pod(已设置 `.metadata.deletionTimestamp` 字段的 Pod)视为失效 Pod, 直到该 Pod 完全终止(其 `.status.phase` 为 `Failed` 或 `Succeeded`)。 但只要终止变得显而易见,Job 控制器就会创建一个替代的 Pod。一旦 Pod 终止,Job 控制器将把这个刚终止的 @@ -741,19 +738,35 @@ kubectl get -o yaml job job-backoff-limit-per-index-example succeeded: 5 # 每 5 个成功的索引有 1 个成功的 Pod failed: 10 # 每 5 个失败的索引有 2 个失败的 Pod(1 次重试) conditions: + - message: Job has failed indexes + reason: FailedIndexes + status: "True" + type: FailureTarget - message: Job has failed indexes reason: FailedIndexes status: "True" type: Failed ``` + +Job 控制器添加 `FailureTarget` Job 状况来触发 [Job 终止和清理](#job-termination-and-cleanup)。 +当所有 Job Pod 都终止时,Job 控制器会添加 `Failed` 状况, +其 `reason` 和 `message` 的值与 `FailureTarget` Job 状况相同。 +有关详细信息,请参阅 [Job Pod 的终止](#termination-of-job-pods)。 + -此外,你可能想要结合使用逐索引回退与 [Pod 失败策略](#pod-failure-policy)。 +此外,你可能想要结合使用逐索引回退与 [Pod 失效策略](#pod-failure-policy)。 在使用逐索引回退时,有一个新的 `FailIndex` 操作可用,它让你避免就某个索引进行不必要的重试。 ### Pod 失效策略 {#pod-failure-policy} -{{< feature-state for_k8s_version="v1.26" state="beta" >}} - -{{< note >}} - -只有你在集群中启用了 -`JobPodFailurePolicy` [特性门控](/zh-cn/docs/reference/command-line-tools-reference/feature-gates/), -你才能为某个 Job 配置 Pod 失效策略。 -此外,建议启用 `PodDisruptionConditions` 特性门控以便在 Pod 失效策略中检测和处理 Pod 干扰状况 -(参考:[Pod 干扰状况](/zh-cn/docs/concepts/workloads/pods/disruptions#pod-disruption-conditions))。 -这两个特性门控都是在 Kubernetes {{< skew currentVersion >}} 中提供的。 -{{< /note >}} +{{< feature-state feature_gate_name="JobPodFailurePolicy" >}} -自 Kubernetes v1.28 开始,当使用 Pod 失败策略时,Job 控制器仅在这些 Pod 达到终止的 +自 Kubernetes v1.28 开始,当使用 Pod 失效策略时,Job 控制器仅在这些 Pod 达到终止的 `Failed` 阶段时才会重新创建终止中的 Pod。这种行为类似于 `podReplacementPolicy: Failed`。 细节参阅 [Pod 替换策略](#pod-replacement-policy)。 {{< /note >}} + +当你使用了 `podFailurePolicy`,并且 Pod 因为与 `FailJob` +操作的规则匹配而失败时,Job 控制器会通过添加 +`FailureTarget` 状况来触发 Job 终止流程。 +更多详情,请参阅 [Job 的终止和清理](#job-termination-and-cleanup)。 + @@ -1036,7 +1042,7 @@ Here is a manifest for a Job with `successPolicy`: In the example above, both `succeededIndexes` and `succeededCount` have been specified. Therefore, the job controller will mark the Job as succeeded and terminate the lingering Pods when either of the specified indexes, 0, 2, or 3, succeed. -The Job that meets the success policy gets the `SuccessCriteriaMet` condition. +The Job that meets the success policy gets the `SuccessCriteriaMet` condition with a `SuccessPolicy` reason. After the removal of the lingering Pods is issued, the Job gets the `Complete` condition. Note that the `succeededIndexes` is represented as intervals separated by a hyphen. @@ -1044,7 +1050,7 @@ The number are listed in represented by the first and last element of the series --> 在上面的例子中,`succeededIndexes` 和 `succeededCount` 都已被指定。 因此,当指定的索引 0、2 或 3 中的任意一个成功时,Job 控制器将 Job 标记为成功并终止剩余的 Pod。 -符合成功策略的 Job 会被标记 `SuccessCriteriaMet` 状况。 +符合成功策略的 Job 会被标记 `SuccessCriteriaMet` 状况,且状况的原因为 `SuccessPolicy`。 在剩余的 Pod 被移除后,Job 会被标记 `Complete` 状况。 请注意,`succeededIndexes` 表示为以连字符分隔的数字序列。 @@ -1152,6 +1158,132 @@ and `.spec.backoffLimit` result in a permanent Job failure that requires manual 换言之,由 `.spec.activeDeadlineSeconds` 和 `.spec.backoffLimit` 所触发的 Job 终结机制都会导致 Job 永久性的失败,而这类状态都需要手工干预才能解决。 + +### Job 终止状况 {#terminal-job-conditions} + +一个 Job 有两种可能的终止状况,每种状况都有相应的 Job 状况: + +* Succeeded:Job `Complete` 状况 +* Failed:Job `Failed` 状况 + + +Job 失败的原因如下: + +- Pod 失败数量超出了 Job 规约中指定的 `.spec.backoffLimit`, + 详情请参见 [Pod 回退失效策略](#pod-backoff-failure-policy)。 +- Job 运行时间超过了指定的 `.spec.activeDeadlineSeconds`。 +- 使用 `.spec.backoffLimitPerIndex` 的索引 Job 出现索引失败。 + 有关详细信息,请参阅[逐索引的回退限制](#backoff-limit-per-index)。 +- Job 中失败的索引数量超出了指定的 `spec.maxFailedIndexes` 值, + 详情见[逐索引的回退限制](#backoff-limit-per-index)。 +- 失败的 Pod 匹配了 `.spec.podFailurePolicy` 中定义的一条规则,该规则的动作为 FailJob。 + 有关 Pod 失效策略规则如何影响故障评估的详细信息,请参阅 [Pod 失效策略](#pod-failure-policy)。 + + +Pod 成功的原因如下: + +- 成功的 Pod 的数量达到了指定的 `.spec.completions` 数量。 +- `.spec.successPolicy` 中指定的标准已满足。详情请参见[成功策略](#success-policy)。 + + +在 Kubernetes v1.31 及更高版本中,Job 控制器会延迟添加终止状况 `Failed` 或 +`Complete`,直到所有 Job Pod 都终止。 + +在 Kubernetes v1.30 及更早版本中,一旦触发 Job 终止过程并删除所有 +Pod 终结器,Job 控制器就会给 Job 添加 `Complete` 或 `Failed` 终止状况。 +然而,在添加终止状况时,一些 Pod 仍会运行或处于终止过程中。 + + +在 Kubernetes v1.31 及更高版本中,控制器仅在所有 Pod 终止后添加 Job 终止状况。 +你可以使用 `JobManagedBy` 或 `JobPodReplacementPolicy`(默认启用) +启用此行为的[特性门控](/zh-cn/docs/reference/command-line-tools-reference/feature-gates/)。 + + +### Job Pod 的终止 + +Job 控制器将 `FailureTarget` 状况或 `SuccessCriteriaMet` 状况添加到 +Job,以便在 Job 满足成功或失败标准后触发 Pod 终止。 + + +诸如 `terminationGracePeriodSeconds` 之类的因素可能会增加从 +Job 控制器添加 `FailureTarget` 状况或 `SuccessCriteriaMet` 状况到所有 +Job Pod 终止并且 Job 控制器添加[终止状况](#terminal-job-conditions)(`Failed` 或 `Complete`)的这段时间量。 + +你可以使用 `FailureTarget` 或 `SuccessCriteriaMet` +状况来评估 Job 是否失败或成功,而无需等待控制器添加终止状况。 + + +例如,你可能想要决定何时创建 Job 来替代某个已失败 Job。 +如果在出现 `FailureTarget` 状况时替换失败的 Job,则替换 Job 启动得会更早, +但可能会导致失败的 Job 和替换 Job 的 Pod 同时处于运行状态,进而额外耗用计算资源。 + +或者,如果你的集群资源容量有限,你可以选择等到 Job 上出现 `Failed` 状况后再执行替换操作。 +这样做会延迟替换 Job 的启动,不过通过等待所有失败的 Pod 都被删除,可以节省资源。 + ### 弹性索引 Job {#elastic-indexed-jobs} -{{< feature-state for_k8s_version="v1.27" state="beta" >}} +{{< feature-state feature_gate_name="ElasticIndexedJob" >}} 你可以通过同时改变 `.spec.parallelism` 和 `.spec.completions` 来扩大或缩小带索引 Job, 从而满足 `.spec.parallelism == .spec.completions`。 -当 [API 服务器](/zh-cn/docs/reference/command-line-tools-reference/kube-apiserver/) -上的 `ElasticIndexedJob` 特性门控被禁用时,`.spec.completions` 是不可变的。 +缩减规模时,Kubernetes 会删除具有更高索引的 Pod。 + 弹性索引 Job 的使用场景包括需要扩展索引 Job 的批处理工作负载,例如 MPI、Horovord、Ray 和 PyTorch 训练作业。 @@ -1795,11 +1925,11 @@ See [Pod failure policy](#pod-failure-policy) to learn more about Pod failure po --> 你可以选择仅在终止过程中的 Pod 完全终止(具有 `status.phase: Failed`)时才创建替换 Pod。 为此,可以设置 `.spec.podReplacementPolicy: Failed`。 -默认的替换策略取决于 Job 是否设置了 `podFailurePolicy`。对于没有定义 Pod 失败策略的 Job, +默认的替换策略取决于 Job 是否设置了 `podFailurePolicy`。对于没有定义 Pod 失效策略的 Job, 省略 `podReplacementPolicy` 字段相当于选择 `TerminatingOrFailed` 替换策略: 控制平面在 Pod 删除时立即创建替换 Pod(只要控制平面发现该 Job 的某个 Pod 被设置了 `deletionTimestamp`)。 -对于设置了 Pod 失败策略的 Job,默认的 `podReplacementPolicy` 是 `Failed`,不允许其他值。 -请参阅 [Pod 失败策略](#pod-failure-policy)以了解更多关于 Job 的 Pod 失败策略的信息。 +对于设置了 Pod 失效策略的 Job,默认的 `podReplacementPolicy` 是 `Failed`,不允许其他值。 +请参阅 [Pod 失效策略](#pod-failure-policy)以了解更多关于 Job 的 Pod 失效策略的信息。 ```yaml kind: Job