K8S 生命周期和探针
1. Pod 的生命周期
备注Pod 遵循预定义的生命周期,起始于
Pending阶段, 如果至少其中有一个主要容器正常启动,则进入Running,之后取决于 Pod 中是否有容器以失败状态结束而进入Succeeded或者Failed阶段。当一个 Pod 被删除时,执行一些 kubectl 命令会展示这个 Pod 的状态为
Terminating(终止)。 这个Terminating状态并不是 Pod 阶段之一。
| 描述 | |
|---|---|
Pending(悬决) |
Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。 |
Running(运行中) |
Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。 |
Succeeded(成功) |
Pod 中的所有容器都已成功终止,并且不会再重启。 |
Failed(失败) |
Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止,且未被设置为自动重启。 |
Unknown(未知) |
因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。 |


2. 容器的状态
Kubernetes 会跟踪 Pod 中每个容器的状态,就像它跟踪 Pod 生命周期一样。
一旦调度器将 Pod 分派给某个节点,kubelet 就通过容器运行时开始为 Pod 创建容器。容器的状态有三种:Waiting(等待)、Running(运行中)和 Terminated(已终止)。要检查 Pod 中容器的状态,可以使用 kubectl describe pod <pod 名称>。 其输出中包含 Pod 中每个容器的状态。
每种状态都有特定的含义:
2.1 Waiting (等待)
如果容器并不处在 Running 或 Terminated 状态之一,它就处在 Waiting 状态。 处于 Waiting 状态的容器仍在运行它完成启动所需要的操作:例如, 从某个容器镜像仓库拉取容器镜像,或者向容器传递并应用 ConfigMap、Secret 数据等等。
2.2 Running(运行中)
Running 状态表明容器正在执行状态并且没有问题发生。
2.3 Terminated(已终止)
处于 Terminated 状态的容器已经开始执行并且或者正常结束或者因为某些原因失败。
3. Pod 异常场景
Pod 在其生命周期的许多时间点可能发生不同的异常,按照 Pod 容器是否运行为标志点,可以将异常场景大致分为两类:
- 在 Pod 进行调度并创建容器过程中发生异常,此时 Pod 将卡在 Pending 阶段。
- Pod 容器运行中发生异常,此时 Pod 按照具体场景处在不同阶段。

4. 容器探针
probe 是由 kubelet 对容器执行的定期诊断。 要执行诊断,kubelet 既可以在容器内执行代码,也可以发出一个网络请求。
4.1 存活探针livenessProbe
4.1.1 什么是存活态探针?
存活探针决定何时重启容器。 例如,当应用在运行但无法取得进展时,存活探针可以捕获这类死锁。
如果一个容器的存活探针失败多次,kubelet 将重启该容器。如果存活态探测失败,则 kubelet 会杀死容器, 并且容器将根据其重启策略决定后续动作。如果容器不提供存活探针, 则默认状态为 Success。
存活探针不会等待就绪探针成功。 如果想在执行存活探针前等待,可以定义 initialDelaySeconds,或者使用启动探针。
4.1.2 何时该使用存活态探针?
如果容器中的进程能够在遇到问题或不健康的情况下自行崩溃,则不一定需要存活态探针; kubelet 将根据 Pod 的 restartPolicy 自动执行修复操作。
如果希望容器在探测失败时被杀死并重新启动,那么请指定一个存活态探针, 并指定 restartPolicy 为 “Always” 或 “OnFailure"。
4.2 就绪探针readinessProbe
4.2.1 什么是就绪探针?
就绪探针决定何时容器准备好开始接受流量。 这种探针在等待应用执行耗时的初始任务时非常有用,例如建立网络连接、加载文件和预热缓存。
如果就绪探针返回的状态为失败,Kubernetes 会将该 Pod 从所有对应服务的端点中移除。
就绪探针在容器的整个生命期内持续运行。
4.2.2 何时该使用就绪态探针?
如果要仅在探测成功时才开始向 Pod 发送请求流量,请指定就绪态探针。 在这种情况下,就绪态探针可能与存活态探针相同,但是规约中的就绪态探针的存在意味着 Pod 将在启动阶段不接收任何数据,并且只有在探针探测成功后才开始接收数据。
如果希望容器能够自行进入维护状态,也可以指定一个就绪态探针, 检查某个特定于就绪态的因此不同于存活态探测的端点。
如果应用程序对后端服务有严格的依赖性,可以同时实现存活态和就绪态探针。 当应用程序本身是健康的,存活态探针检测通过后,就绪态探针会额外检查每个所需的后端服务是否可用。 这可以帮助避免将流量导向只能返回错误信息的 Pod。
如果容器需要在启动期间加载大型数据、配置文件或执行迁移, 可以使用启动探针。 然而,如果想区分已经失败的应用和仍在处理其启动数据的应用,可能更倾向于使用就绪探针。
4.3 启动探针startupProbe
4.3.1 什么是启动探针?
启动探针检查容器内的应用是否已启动。 启动探针可以用于对慢启动容器进行存活性检测,避免它们在启动运行之前就被 kubelet 杀掉。
如果配置了这类探针,它会禁用存活检测和就绪检测,直到启动探针成功为止。
这类探针仅在启动时执行,不像就绪探针那样周期性地运行。
4.3.2 何时该使用启动探针?
对于所包含的容器需要较长时间才能启动就绪的 Pod 而言,启动探针是有用的。 不再需要配置一个较长的存活态探测时间间隔,只需要设置另一个独立的配置选定, 对启动期间的容器执行探测,从而允许使用远远超出存活态时间间隔所允许的时长。
如果容器启动时间通常超出 initialDelaySeconds + failureThreshold × periodSeconds 总值,应该设置一个启动探测,对存活态探针所使用的同一端点执行检查。 periodSeconds 的默认值是 10 秒。应该将其 failureThreshold 设置得足够高, 以便容器有充足的时间完成启动,并且避免更改存活态探针所使用的默认值。 这一设置有助于减少死锁状况的发生。
4.4 探针的执行
| 探针 | 操作对象 | 操作动作 | 操作结果 | 运行时间 |
|---|---|---|---|---|
| 存活探针 | 容器本身 | 重启容器 | 容器重新启动 | 容器整个生命周期 |
| 就绪探针 | 容器对应的端点 | 删除端点 | 从所有对应服务的端点中移除,不接收流量 | 容器整个生命周期 |
| 启动探针 | 容器本身 | 重启容器 | 容器重新启动 | 容器 Running 后执行一次 |
4.5 探针的使用
使用探针来检查容器有四种不同的方法。 每个探针都必须准确定义为这四种机制中的一种:
| 探针类型 | 描述 |
|---|---|
exec |
在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。 |
tcpSocket |
对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。 如果远程系统(容器)在打开连接后立即将其关闭,这算作是健康的。 |
httpGet |
对容器的 IP 地址上指定端口和路径执行 HTTP GET 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的。 |
grpc |
使用 gRPC 执行一个远程过程调用。 目标应该实现 gRPC 健康检查。 如果响应的状态是 “SERVING”,则认为诊断成功。 |
| 探针参数 | 描述 |
|---|---|
initialDelaySeconds |
容器启动后要等待多少秒后才启动启动、存活和就绪探针。 如果定义了启动探针,则存活探针和就绪探针的延迟将在启动探针已成功之后才开始计算。 如果 periodSeconds 的值大于 initialDelaySeconds,则 initialDelaySeconds 将被忽略。默认是 0 秒,最小值是 0。 |
periodSeconds |
执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。 |
timeoutSeconds |
探测的超时后等待多少秒。默认值是 1 秒。最小值是 1。 |
successThreshold |
探针在失败后,被视为成功的最小连续成功数。默认值是 1。 存活和启动探针的这个值必须是 1。最小值是 1。 |
failureThreshold |
探针连续失败了 failureThreshold 次之后, Kubernetes 认为总体上检查已失败:容器状态未就绪、不健康、不活跃。 默认值为 3,最小值为 1。 对于启动探针或存活探针而言,如果至少有 failureThreshold 个探针已失败, Kubernetes 会将容器视为不健康并为这个特定的容器触发重启操作。 kubelet 遵循该容器的 terminationGracePeriodSeconds 设置。 对于失败的就绪探针,kubelet 继续运行检查失败的容器,并继续运行更多探针; 因为检查失败,kubelet 将 Pod 的 Ready 状况设置为 false。 |
terminationGracePeriodSeconds |
为 kubelet 配置从为失败的容器触发终止操作到强制容器运行时停止该容器之前等待的宽限时长。 默认值是继承 Pod 级别的 terminationGracePeriodSeconds 值(如果不设置则为 30 秒),最小值为 1。Kubernetes v1.25 以上版本新增,只对启动探针和存活探针有效。 |
4.6 示例
|
|
4.7 实操展示
4.8 流程分析

