NexaGrid技术博客

NexaGrid技术博客

Kubernetes从基础到实战应用(Pod Lifecycle)

2025-06-24
Kubernetes从基础到实战应用(Pod Lifecycle)

生命周期(Pod Lifecycle)

[Pod Lifecycle|Kubernetes] https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/

本页面讲述 Pod 的生命周期。 Pod 遵循预定义的生命周期,起始于 Pending 阶段, 如果至少其中有一个主要容器正常启动,则进入 Running,之后取决于 Pod 中是否有容器以失败状态结束而进入 Succeeded 或者 Failed 阶段。

容器状态

  • Waiting(等待中): 如果容器并不处在 Running 或 Terminated 状态之一,它就处在 Waiting 状态。 处于 Waiting 状态的容器仍在运行它完成启动所需要的操作:例如, 从某个容器镜像仓库拉取容器镜像,或者向容器应用 Secret 数据等等。 当你使用 kubectl 来查询包含 Waiting 状态的容器的 Pod 时,你也会看到一个 Reason 字段,其中给出了容器处于等待状态的原因。

  • Running(运行中): Running 状态表明容器正在执行状态并且没有问题发生。 如果配置了 postStart 回调,那么该回调已经执行且已完成。 如果你使用 kubectl 来查询包含 Running 状态的容器的 Pod 时, 你也会看到关于容器进入 Running 状态的信息。

  • Terminated(已终止): 处于 Terminated 状态的容器开始执行后,或者运行至正常结束或者因为某些原因失败。 如果你使用 kubectl 来查询包含 Terminated 状态的容器的 Pod 时, 你会看到容器进入此状态的原因、退出代码以及容器执行期间的起止时间。如果容器配置了 preStop 回调,则该回调会在容器进入 Terminated 状态之前执行。

回调钩子

postStart钩子

postStart钩子是 Pod 生命周期管理的重要特性,允许你在容器启动后立即执行特定操作。

HTTPGet方式
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
  - name: myapp-container
    image: myapp:1.0
    ports:
    - containerPort: 8080
    lifecycle:
      postStart:
        httpGet:
          path: /init
          port: 8080
          scheme: HTTP
Exec方式
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
  - name: myapp-container
    image: myapp:1.0
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo '容器启动后执行' > /log/init.log"]

preStop钩子

preStop钩子级别:
  • 容器级别:在容器终止之前执行,用于容器内部的清理工作。

  • Pod级别:在Pod中的所有容器终止之前执行,用于跨容器的清理工作。

作用:
  1. 提供了一个优雅机制来确保容器在终止之前执行必要的清理操作,例如保存数据、关闭连接、释放资源等。

  2. 增加了容器的可靠性和稳定性,避免了突然终止容器可能导致的数据丢失或资源泄漏等问题。

使用场景:
  1. 数据持久化:在容器终止之前,可以使用preStop钩子将容器内的数据保存到持久化存储中,以确保数据不会丢失。

  2. 连接关闭:在容器终止之前,可以使用preStop钩子关闭容器内的连接,以确保连接资源能够正常释放。

  3. 资源释放:在容器终止之前,可以使用preStop钩子释放容器所占用的资源,例如关闭文件描述符、停止子进程等。

注意

terminationGracePeriodSeconds 是容器被杀死的最大宽限时间,即使preStop未完成或者容器内进程未来得及停止仍会被杀死。