1. 概述

在 Kubernetes 中,Pod 是最小的部署单元,用于承载一个或多个相关容器以及对应的资源。理解 Pod 的生命周期对于排查问题、优化调度和提高系统稳定性至关重要。

本文将深入讲解 Pod 从创建到终止的完整生命周期,并结合实际操作示例,帮助你更好地掌握其运行机制。

2. Pod 生命周期详解

2.1 Pod 创建

Pod 是 Kubernetes 的基础资源对象之一。创建 Pod 通常需要编写 YAML 或 JSON 格式的配置文件,声明其期望状态。例如:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: mycontainer
      image: nginx:latest

使用 kubectl 命令创建 Pod:

$ kubectl apply -f pod.yaml

创建后可以通过以下命令查看 Pod 状态:

$ kubectl get pods
NAME    READY   STATUS              RESTARTS   AGE
mypod   0/1     ContainerCreating   0          5s

稍等片刻,Pod 会进入 Running 状态:

$ kubectl get pods 
NAME    READY   STATUS    RESTARTS   AGE 
mypod   0/1     Running   0          13s

踩坑提醒:如果 Pod 长时间处于 PendingImagePullBackOff 状态,应检查镜像是否存在、节点资源是否充足。

2.2 调度(Scheduling)

Kubernetes 通过调度器将 Pod 分配到合适的节点上运行。调度过程受以下机制影响:

  • nodeSelector:根据节点标签筛选目标节点
  • Affinity/Anti-affinity:更复杂的调度策略,如偏好/排斥特定节点
  • Taint/Toleration:防止 Pod 被调度到某些节点,除非具备容忍
  • Pod Priority:设置 Pod 的优先级
  • 资源请求:指定 CPU 和内存需求

⚠️ 注意:Pod 一旦被调度到节点上,除非节点宕机或 Pod 被删除,否则不会重新调度。要实现高可用,建议使用控制器(如 Deployment)。

2.3 初始化(Initialization)

Pod 启动前会经历初始化阶段。如果有 initContainer,Kubernetes 会先运行这些初始化容器。初始化完成后,主容器才开始运行。

这个阶段确保主应用容器运行前的所有前置条件都已满足,比如:

  • 下载配置文件
  • 检查依赖服务是否就绪
  • 初始化数据库等

一旦所有初始化容器成功执行,Pod 才进入“就绪”状态。

2.4 容器状态与重启策略

每个容器在 Pod 中有三种状态:

  • Running:容器正在运行
  • Terminated:容器已完成或出错退出
  • Waiting:容器尚未启动或等待资源

通过以下命令可查看容器状态:

$ kubectl describe pod mypod
(...)
Containers:
  mycontainer:
    State: Running

Kubernetes 支持三种重启策略:

策略 说明
Always 容器退出后总是重启(默认)
OnFailure 仅在容器失败时重启
Never 从不重启容器

⚠️ 注意:Sidecar 容器忽略 Pod 级别的重启策略。

2.5 Pod 终止流程

删除 Pod 时,Kubernetes 会尝试优雅终止:

$ kubectl delete pod mypod
pod "mypod" deleted

Kubelet 会发送 SIGTERM 信号给容器,等待 terminationGracePeriodSeconds(默认 30 秒)后强制终止。

你也可以自定义终止行为,比如通过 preStop 钩子执行清理逻辑:

lifecycle:
  preStop:
    exec:
      command: ["sh", "-c", "echo PreStop hook running"]

如果在 grace period 内未完成终止,Kubelet 会强制杀掉容器。

3. PodStatus 对象详解

PodStatus 提供了 Pod 的实时状态信息,包括:

  • PodConditions:反映 Pod 的整体健康状态
  • ContainerStatuses:每个容器的详细状态
  • Phase:Pod 的生命周期阶段(Pending / Running / Succeeded / Failed / Unknown)

查看 PodStatus:

$ kubectl get pod mypod -o jsonpath='{.status}'
{
  "conditions": [
    {"type": "Initialized", "status": "True"},
    {"type": "Ready", "status": "True"},
    {"type": "PodScheduled", "status": "True"}
  ],
  "containerStatuses": [
    {
      "name": "mycontainer",
      "state": {"running": {"startedAt": "2023-12-29T17:40:24Z"}},
      "ready": true
    }
  ],
  "phase": "Running",
  "startTime": "2023-12-29T17:40:21Z"
}

4. 探针(Probes)机制

Kubernetes 提供三种探针用于监控容器状态:

4.1 Liveness Probe(存活探针)

判断容器是否存活,失败则重启容器:

livenessProbe:
  httpGet:
    path: /health
    port: 80
  initialDelaySeconds: 5
  periodSeconds: 10

4.2 Readiness Probe(就绪探针)

判断容器是否准备好接收流量,失败则停止流量分发:

readinessProbe:
  tcpSocket:
    port: 3306
  initialDelaySeconds: 5
  periodSeconds: 10

4.3 Startup Probe(启动探针)

用于判断容器应用是否已启动,其他探针会在其成功后才开始工作:

startupProbe:
  exec:
    command: ["cat", "/tmp/ready"]
  failureThreshold: 30
  periodSeconds: 10

踩坑提醒:合理设置 initialDelaySecondsperiodSeconds,避免容器尚未启动就触发失败判定。

5. PodConditions 状态监控

PodConditionsPodStatus 的一部分,用于描述 Pod 的关键状态:

条件名称 含义
PodScheduled Pod 是否已分配节点
Initialized 初始化容器是否完成
Ready Pod 是否已就绪接收流量
ContainersReady 所有容器是否已就绪

这些状态可用于自动化监控和报警。

6. 事件(Events)跟踪生命周期

Kubernetes 会记录 Pod 生命周期中的关键事件,帮助排查问题:

$ kubectl get events
LAST SEEN   TYPE     REASON      OBJECT      MESSAGE
28m         Normal   Scheduled   pod/mypod   Successfully assigned default/mypod to docker-desktop
26m         Normal   Pulling     pod/mypod   Pulling image "nginx:latest"
28m         Normal   Pulled      pod/mypod   Successfully pulled image "nginx:latest" in 1.22447429s
26m         Normal   Created     pod/mypod   Created container mycontainer
26m         Normal   Started     pod/mypod   Started container mycontainer

事件内容包括调度、镜像拉取、容器创建和启动等,是调试 Pod 状态异常的重要依据。

7. 总结

本文系统讲解了 Kubernetes Pod 的生命周期,包括创建、调度、初始化、运行、终止等阶段,并介绍了状态监控、探针机制和事件追踪等实用工具。

掌握 Pod 的生命周期有助于:

  • 更好地理解 Pod 行为
  • 快速定位调度或运行时问题
  • 构建健壮的容器化应用

Kubernetes 的生态在不断演进,建议持续关注官方文档和社区实践,进一步提升运维和开发能力。


原始标题:Understanding Pod Lifecycle in Kubernetes