From 2559d033b1636877e6965aecb7248c6c429d696a Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 27 Apr 2023 21:49:14 +0800 Subject: [PATCH] [zh] sync pod-failure-policy.md --- .../docs/tasks/job/pod-failure-policy.md | 181 ++++++++++++++++++ .../job-pod-failure-policy-config-issue.yaml | 19 ++ 2 files changed, 200 insertions(+) create mode 100644 content/zh-cn/examples/controllers/job-pod-failure-policy-config-issue.yaml diff --git a/content/zh-cn/docs/tasks/job/pod-failure-policy.md b/content/zh-cn/docs/tasks/job/pod-failure-policy.md index ead7515131..435564891d 100644 --- a/content/zh-cn/docs/tasks/job/pod-failure-policy.md +++ b/content/zh-cn/docs/tasks/job/pod-failure-policy.md @@ -49,6 +49,13 @@ You should already be familiar with the basic use of [Job](/docs/concepts/worklo {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + +确保[特性门控](/zh-cn/docs/reference/command-line-tools-reference/feature-gates/) +`PodDisruptionConditions` 和 `JobPodFailurePolicy` 在你的集群中均已启用。 + 集群自动清理 Pod。 + +## 基于自定义 Pod 状况使用 Pod 失效策略避免不必要的 Pod 重试 {#avoid-pod-retries-based-on-custom-conditions} + +根据以下示例,你可以学习如何基于自定义 Pod 状况使用 Pod 失效策略避免不必要的 Pod 重启。 + +{{< note >}} + +以下示例自 v1.27 起开始生效,因为它依赖于将已删除的 Pod 从 `Pending` 阶段过渡到终止阶段 +(参阅 [Pod 阶段](/zh-cn/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase))。 +{{< /note >}} + + +1. 首先基于配置创建一个 Job: + + {{< codenew file="/controllers/job-pod-failure-policy-config-issue.yaml" >}} + + + 执行以下命令: + + ```sh + kubectl create -f job-pod-failure-policy-config-issue.yaml + ``` + + + 请注意,镜像配置不正确,因为该镜像不存在。 + + +2. 通过执行以下命令检查任务 Pod 的状态: + + ```sh + kubectl get pods -l job-name=job-pod-failure-policy-config-issue -o yaml + ``` + + + 你将看到类似以下输出: + + ```yaml + containerStatuses: + - image: non-existing-repo/non-existing-image:example + ... + state: + waiting: + message: Back-off pulling image "non-existing-repo/non-existing-image:example" + reason: ImagePullBackOff + ... + phase: Pending + ``` + + + 请注意,Pod 依然处于 `Pending` 阶段,因为它无法拉取错误配置的镜像。 + 原则上讲这可能是一个暂时问题,镜像还是会被拉取。然而这种情况下, + 镜像不存在,因为我们通过一个自定义状况表明了这个事实。 + + +3. 添加自定义状况。执行以下命令先准备补丁: + + ```sh + cat < patch.yaml + status: + conditions: + - type: ConfigIssue + status: "True" + reason: "NonExistingImage" + lastTransitionTime: "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" + EOF + ``` + + + 其次,执行以下命令选择通过任务创建的其中一个 Pod: + + ``` + podName=$(kubectl get pods -l job-name=job-pod-failure-policy-config-issue -o jsonpath='{.items[0].metadata.name}') + ``` + + + 随后执行以下命令将补丁应用到其中一个 Pod 上: + + ```sh + kubectl patch pod $podName --subresource=status --patch-file=patch.yaml + ``` + + + 如果被成功应用,你将看到类似以下的一条通知: + + ```sh + pod/job-pod-failure-policy-config-issue-k6pvp patched + ``` + + +4. 执行以下命令删除此 Pod 将其过渡到 `Failed` 阶段: + + ```sh + kubectl delete pods/$podName + ``` + + +5. 执行以下命令查验 Job 的状态: + + ```sh + kubectl get jobs -l job-name=job-pod-failure-policy-config-issue -o yaml + ``` + + + 在 Job 状态中,看到任务 `Failed` 状况的 `reason` 字段等于 `PodFailurePolicy`。 + 此外,`message` 字段包含了与 Job 终止相关的更多详细信息,例如: + `Pod default/job-pod-failure-policy-config-issue-k6pvp has condition ConfigIssue matching FailJob rule at index 0`。 + +{{< note >}} + +在生产环境中,第 3 和 4 步应由用户提供的控制器进行自动化处理。 +{{< /note >}} + + +### 清理 + +删除你创建的 Job: + +```sh +kubectl delete jobs/job-pod-failure-policy-config-issue +``` + + +集群自动清理 Pod。 +