From c0749134595e768fb06a0fcef1ebccdbe153d5df Mon Sep 17 00:00:00 2001 From: 0xff-dev Date: Thu, 9 May 2024 17:55:12 +0800 Subject: [PATCH] [zh] sync/pods/pod-lifecycle.md --- .../concepts/workloads/pods/pod-lifecycle.md | 116 +++++++++++++++++- 1 file changed, 111 insertions(+), 5 deletions(-) diff --git a/content/zh-cn/docs/concepts/workloads/pods/pod-lifecycle.md b/content/zh-cn/docs/concepts/workloads/pods/pod-lifecycle.md index e533fbe698a91..e71e062813a7d 100644 --- a/content/zh-cn/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/zh-cn/docs/concepts/workloads/pods/pod-lifecycle.md @@ -288,6 +288,103 @@ the `Terminated` state. 如果容器配置了 `preStop` 回调,则该回调会在容器进入 `Terminated` 状态之前执行。 + + +## Pod 如何处理容器问题 {#container-restarts} + +Kubernetes 通过在 Pod `spec` 中定义的 [`restartPolicy`](#restart-policy) 管理 Pod 内容器出现的失效。 +该策略决定了 Kubernetes 如何对由于错误或其他原因而退出的容器做出反应,其顺序如下: + + + +1. **最初的崩溃**:Kubernetes 尝试根据 Pod 的 `restartPolicy` 立即重新启动。 +1. **反复的崩溃**:在最初的崩溃之后,Kubernetes 对于后续重新启动的容器采用指数级回退延迟机制, + 如 [`restartPolicy`](#restart-policy) 中所述。 + 这一机制可以防止快速、重复的重新启动尝试导致系统过载。 +1. **CrashLoopBackOff 状态**:这一状态表明,对于一个给定的、处于崩溃循环、反复失效并重启的容器, + 回退延迟机制目前正在生效。 +1. **回退重置**:如果容器成功运行了一定时间(如 10 分钟), + Kubernetes 会重置回退延迟机制,将新的崩溃视为第一次崩溃。 + +在实际部署中,`CrashLoopBackOff` 是在描述或列出 Pod 时从 `kubectl` 命令输出的一种状况或事件。 +当 Pod 中的容器无法正常启动,并反复进入尝试与失败的循环时就会出现。 + + +换句话说,当容器进入崩溃循环时,Kubernetes 会应用[容器重启策略](#restart-policy) +中提到的指数级回退延迟机制。这种机制可以防止有问题的容器因不断进行启动失败尝试而导致系统不堪重负。 + + +下列问题可以导致 `CrashLoopBackOff`: + +* 应用程序错误导致的容器退出。 +* 配置错误,如环境变量不正确或配置文件丢失。 +* 资源限制,容器可能没有足够的内存或 CPU 正常启动。 +* 如果应用程序没有在预期时间内启动服务,健康检查就会失败。 +* 容器的存活探针或者启动探针返回 `失败` 结果,如[探针部分](#container-probes)所述。 + + +要调查 `CrashLoopBackOff` 问题的根本原因,用户可以: + +1. **检查日志**:使用 `kubectl logs ` 检查容器的日志。 + 这通常是诊断导致崩溃的问题的最直接方法。 +1. **检查事件**:使用 `kubectl describe pod ` 查看 Pod 的事件, + 这可以提供有关配置或资源问题的提示。 +1. **审查配置**:确保 Pod 配置正确无误,包括环境变量和挂载卷,并且所有必需的外部资源都可用。 +1. **检查资源限制**: 确保容器被分配了足够的 CPU 和内存。有时,增加 Pod 定义中的资源可以解决问题。 +1. **调试应用程序**:应用程序代码中可能存在错误或配置不当。 + 在本地或开发环境中运行此容器镜像有助于诊断应用程序的特定问题。 + ## 容器重启策略 {#restart-policy} @@ -316,20 +417,25 @@ Pod 级别的 `restartPolicy` 字段:在 Kubernetes 中,Sidecar 被定义为 对于因错误而退出的 Init 容器,如果 Pod 级别 `restartPolicy` 为 `OnFailure` 或 `Always`, 则 kubelet 会重新启动 Init 容器。 +* `Always`:只要容器终止就自动重启容器。 +* `OnFailure`:只有在容器错误退出(退出状态非零)时才重新启动容器。 +* `Never`:不会自动重启已终止的容器。 + 当 kubelet 根据配置的重启策略处理容器重启时,仅适用于同一 Pod 内替换容器并在同一节点上运行的重启。当 Pod 中的容器退出时,`kubelet` -会按指数回退方式计算重启的延迟(10s、20s、40s、...),其最长延迟为 5 分钟。 -一旦某容器执行了 10 分钟并且没有出现问题,`kubelet` 对该容器的重启回退计时器执行重置操作。 +会以指数级回退延迟机制(10 秒、20 秒、40 秒......)重启容器, +上限为 300 秒(5 分钟)。一旦容器顺利执行了 10 分钟, +kubelet 就会重置该容器的重启延迟计时器。 [Sidecar 容器和 Pod 生命周期](/zh-cn/docs/concepts/workloads/pods/sidecar-containers/#sidecar-containers-and-pod-lifecycle)中解释了 `init containers` 在指定 `restartpolicy` 字段时的行为。