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 的"眼睛",它通过存活探针确保应用实例的可用性,通过就绪探针确保流量的正确路由,通过启动探针保护慢启动应用。

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

相关推荐
咩咩啃树皮16 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚17 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白18 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司19 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地20 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415920 小时前
TCP超时重传机制是为了解决什么问题?
java
莫逸风1 天前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
生活爱好者!1 天前
我把NAS当作下载机,docker一键部署qb
运维·docker·容器
z123456789861 天前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin5211231 天前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python