kubernetes(k8s)-pod生命周期

Pod 的生命周期是k8s最核心的概念之一,理解它对于部署、调试和管理应用至关重要。

Pod 的生命周期被定义为一系列 阶段(Phase)状态(Condition) ,并伴随着一系列可配置的 探针(Probe)回调(Hook)

一、Pod 的相位

Pod 的 status.phase 字段是一个简单的、高层次的总结,表示 Pod 在其生命周期中所处的阶段。主要有以下几个值:

1、Pending(挂起)

  • 含义:Pod 已被 Kubernetes 系统接受,但有一个或多个容器镜像尚未创建或无法被调度。
  • 常见原因:正在下载容器镜像、等待调度(如节点资源不足)、配置持久卷等。

2、Running(运行中)

  • 含义:Pod 已经绑定到了一个节点,并且所有容器都已被创建。至少有一个容器正在运行,或者正在启动或重启。
  • 注意 :处于 Running 状态的 Pod 不一定就能正常提供服务(例如,应用可能还在启动或已经崩溃)。

3、Succeeded(成功)

  • 含义 :Pod 中的所有容器都已成功终止,并且不会再重启
  • 典型场景:运行批处理任务(Job/CronJob)的 Pod。任务完成后,Pod 就会处于这个状态。

4、Failed(失败)

  • 含义 :Pod 中的所有容器都已终止,并且至少有一个容器是失败终止(即容器以非 0 状态退出)。
  • 典型场景:应用程序崩溃、镜像错误、资源不足(OOMKilled)等。

5、Unknown(未知)

  • 含义 :通常是由于无法与 Pod 所在节点上的 kubelet 通信导致的,节点的状态本身可能就是 Unknown
  • 常见原因:节点网络故障、kubelet 进程僵死等。

二、容器的状态

在 Pod 内部,每个容器都有更细粒度的状态,定义在 status.containerStatuses 中。主要有三种状态:

1、Waiting(等待)

  • 容器正在等待执行某些操作,尚未启动。
  • 通常会有一个 reason 字段说明原因,如 ContainerCreating(正在创建容器)、ImagePullBackOff(拉取镜像失败)等。

2、Running(运行中)

  • 容器正在正常执行。
  • 包含容器启动时间的详细信息。

3、Terminated(已终止)

  • 容器执行完毕并已退出。
  • 包含退出代码、信号、开始和结束时间等信息。
  • 如果退出码不为 0,通常表示容器执行失败。

三、容器重启策略

spec.restartPolicy 定义了当容器退出时,kubelet 应该如何做。它适用于 Pod 中的所有容器。

  • Always:总是重启。这是默认值,适用于需要长期运行的服务(如 Web 服务器)。
  • OnFailure:仅在容器以非 0 状态退出(失败)时重启。适用于批处理任务。
  • Never:从不重启。

kubelet 会以指数退避延迟(10s, 20s, 40s...)的方式重启容器,最多延迟 5 分钟。

四、Pod 的生命周期事件:探针和回调

这是最核心的部分,它决定了 Kubernetes 如何感知和管理你的应用。

1、生命周期回调

这是在容器生命周期的特定时间点触发的命令或 HTTP 请求。

启动后钩子(postStart)

  • 作用 :在容器启动后立即 执行。如果钩子执行失败(返回非 0 状态码),容器会被杀死,并根据 restartPolicy 决定是否重启。
  • 用途 :用于执行一些在主应用启动之前必须完成的准备工作,例如向注册中心注册、迁移数据库、或等待依赖服务就绪。

终止前钩子(preStop)

  • 作用 :在容器被杀死之前(收到 TERM <终止>信号之前)执行。这是一个阻塞式的调用,钩子执行完毕后才会发送 TERM <终止>信号。
  • 用途:用于执行优雅关闭的逻辑,例如保存状态、通知其他服务、关闭网络连接、让 Pod 从负载均衡器中平滑移除等。

2. 容器探针

探针是由 kubelet 定期对容器执行的诊断,用以了解容器的健康状况。

存活探针(LivenessProbe)

  • 目的 :判断容器是否正在运行 。如果探测失败,kubelet 会杀死 容器,然后根据 restartPolicy 来重启它。
  • 用途 :解决应用程序运行但内部已死锁或僵死(无法继续服务)的情况。这是确保应用高可用的关键探针。

就绪探针(ReadinessProbe)

  • 目的 :判断容器是否已准备好接收流量 。如果探测失败,Endpoints 控制器会将该 Pod 的 IP 从与 Service 关联的 Endpoints 对象中移除
  • 用途 :解决应用程序正在运行,但暂时无法处理请求的情况(例如,正在加载大量数据、依赖的服务未就绪)。这是确保流量只被发送到健康 Pod 的关键探针。

启动探针(StartupProbe)

  • 目的 :**判断容器内的应用程序是否已启动。**在启动探针成功之前,其他所有探针都会被禁用。
  • 用途:解决启动非常缓慢的旧应用(如 Java 应用)的问题。如果不使用启动探针,存活探针可能会在应用完成启动前就因多次失败而杀死容器,导致无限重启。启动探针成功后,其使命就结束了,之后由存活和就绪探针接手。

五、Pod 的生命周期图示与流程

下图清晰地展示了 Pod 和其内部容器的生命周期流程,以及各种钩子和探针的触发时机:

总结

理解 Pod 的生命周期对于在 Kubernetes 上成功运行应用至关重要:

  • 相位和状态 让你能快速判断 Pod 的整体健康状况。
  • 重启策略 定义了容器失败后的恢复行为。
  • 生命周期回调 让你有机会在容器启动和关闭时执行自定义逻辑,实现优雅启停。
  • 容器探针 是 Kubernetes 的"眼睛",它通过存活探针确保应用实例的可用性,通过就绪探针确保流量的正确路由,通过启动探针保护慢启动应用。

合理配置这些机制,是构建健壮、可观测、自愈的云原生应用的基础。

相关推荐
IT界的奇葩2 小时前
代码规范 spring-javaformat使用
java·spring·代码规范
披着羊皮不是狼2 小时前
多用户跨学科交流系统(4)参数校验+分页搜索全流程的实现
java·spring boot
终端行者2 小时前
K8s常用排障调试工具 入侵排查 kubectl debug 命令详解
云原生·容器·kubernetes
fie88892 小时前
Kubernetes(k8s)高可用性集群的构建详细步骤
云原生·容器·kubernetes
qq_316837753 小时前
华为CCE k8s 使用nfs-subdir-external-provisioner 创建pvc时自动创建pv
windows·华为·kubernetes
KevinPedri3 小时前
API创建指定版本k8s集群
容器·云计算
奋斗的蛋黄3 小时前
K8s Ingress 与 Ingress API 全解析:外部访问集群的统一入口
云原生·容器·kubernetes
小池先生3 小时前
Gradle vs Maven 详细对比
java·maven
q***23923 小时前
基于SpringBoot和PostGIS的云南与缅甸的千里边境线实战
java·spring boot·spring