Pod 的生命周期

本文深入讲解 Kubernetes 中 Pod 的生命周期管理,涵盖生命周期的各个阶段、健康检查探针、重启策略以及实际应用场景。

Pod 阶段(Phase)

Pod 的 status 字段包含一个 PodStatus 对象,其中的 phase 字段表示 Pod 在生命周期中的当前状态。

Pod 的阶段(phase)是对 Pod 在其生命周期中状态的高层次概括,并非容器或 Pod 状态的详细汇总。

阶段类型

Pod 的 phase 字段可能包含以下值:

阶段描述
Pending(挂起)Pod 已被 Kubernetes 接受,但一个或多个容器尚未创建完成。包括调度等待时间和镜像拉取时间
Running(运行中)Pod 已绑定到节点,所有容器已创建,至少有一个容器正在运行、启动或重启
Succeeded(成功)Pod 中所有容器已成功终止,且不会重启
Failed(失败)Pod 中所有容器已终止,至少有一个容器因失败而终止(退出码非零或被系统终止)
Unknown(未知)无法获取 Pod 状态,通常因与 Pod 所在节点通信失败导致

生命周期图示

下图展示了 Pod 生命周期中状态的变化流程:

Pod 的生命周期示意图(图片来自网络)
Pod 的生命周期示意图(图片来自网络)

Pod 状态(Status)

Pod 具有 PodStatus 对象,包含 PodCondition 数组。每个 PodCondition 包含:

  • type:条件类型,可能值包括:

    • PodScheduled:Pod 是否已被调度
    • Ready:Pod 是否准备好接收流量
    • Initialized:所有初始化容器是否成功完成
    • ContainersReady:Pod 中所有容器是否就绪
  • status:条件状态,值为 TrueFalseUnknown

容器探针(Probes)

探针是 kubelet 对容器执行的定期健康检查。kubelet 通过调用容器实现的处理程序来执行诊断。

探针类型

探针类型描述成功条件
ExecAction执行指定命令命令退出码为 0
TCPSocketActionTCP 端口检查端口可连接
HTTPGetActionHTTP GET 请求响应状态码 200-399

探测结果

每次探测返回以下结果之一:

  • Success(成功):容器通过诊断
  • Failure(失败):容器未通过诊断
  • Unknown(未知):诊断失败,不采取行动

探针种类

存活探针(Liveness Probe)

  • 用途:检测容器是否正在运行
  • 失败处理:kubelet 杀死容器,容器根据重启策略处理
  • 默认状态:如未配置,默认为 Success

就绪探针(Readiness Probe)

  • 用途:检测容器是否准备好接收流量
  • 失败处理:从所有匹配的 Service 端点中移除 Pod IP
  • 默认状态:如未配置,默认为 Success

启动探针(Startup Probe)

自 Kubernetes 1.16 起支持,用于检测容器是否已启动:

  • 用途:为慢启动容器提供更长的启动时间
  • 优先级:启动探针成功前,其他探针被禁用
  • 适用场景:遗留应用或启动时间较长的容器

探针使用指南

何时使用存活探针

  • 容器进程无法自行检测并恢复健康状态
  • 需要在探测失败时重启容器
  • 配合 restartPolicyAlwaysOnFailure 使用

何时使用就绪探针

  • 需要控制流量路由到健康的 Pod
  • 容器启动后需要加载数据或预热
  • 临时不可用时希望停止接收流量

何时使用启动探针

  • 容器启动时间超过 initialDelaySeconds + failureThreshold × periodSeconds
  • 需要为慢启动容器提供更长的启动窗口

探针配置示例

apiVersion: v1
kind: Pod
metadata:
  name: probe-example
spec:
  containers:
  - name: app
    image: nginx:1.20
    ports:
    - containerPort: 80
    startupProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 10
      periodSeconds: 5
      failureThreshold: 12  # 60 秒启动窗口
    livenessProbe:
      httpGet:
        path: /health
        port: 80
      initialDelaySeconds: 15
      periodSeconds: 10
      timeoutSeconds: 5
      failureThreshold: 3
    readinessProbe:
      httpGet:
        path: /ready
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5
      timeoutSeconds: 3
      successThreshold: 1
      failureThreshold: 3

就绪门控(Readiness Gates)

自 Kubernetes 1.14 起,支持扩展 Pod 就绪检测机制。

配置方式

在 PodSpec 中设置 readinessGates,指定额外的就绪条件:

apiVersion: v1
kind: Pod
metadata:
  name: readiness-gate-example
spec:
  readinessGates:
    - conditionType: "example.com/load-balancer-ready"
  containers:
  - name: app
    image: nginx:1.20
status:
  conditions:
    - type: Ready
      status: "True"
      lastTransitionTime: "2023-01-01T00:00:00Z"
    - type: "example.com/load-balancer-ready"
      status: "True"
      lastTransitionTime: "2023-01-01T00:00:00Z"

就绪条件

Pod 被认为就绪需要满足:

  1. 所有容器状态为 Ready
  2. 所有 readinessGates 条件为 True

重启策略(Restart Policy)

PodSpec 的 restartPolicy 字段控制容器重启行为:

策略描述适用场景
Always总是重启(默认值)长期运行的服务
OnFailure失败时重启批处理任务
Never从不重启一次性任务

重启行为

  • 重启延迟:指数退避算法(10s, 20s, 40s, 80s, 160s, 300s)
  • 重置条件:容器成功运行 10 分钟后重置延迟
  • 节点限制:容器只能在同一节点重启

Pod 生命周期管理

控制器类型

控制器适用场景重启策略要求
Deployment/ReplicaSet无状态应用Always
StatefulSet有状态应用Always
DaemonSet节点级服务Always
Job批处理任务OnFailure/Never
CronJob定时任务OnFailure/Never

生命周期事件

  1. 创建阶段

    • API Server 验证并存储 Pod 规格
    • 调度器选择合适节点
    • kubelet 拉取镜像并创建容器
  2. 运行阶段

    • 容器启动并运行
    • 探针持续检查健康状态
    • 根据检查结果更新 Pod 状态
  3. 终止阶段

    • 发送 SIGTERM 信号
    • 等待优雅终止期(默认 30 秒)
    • 发送 SIGKILL 强制终止

实际应用场景

场景 1:Web 应用部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: web
        image: nginx:1.20
        ports:
        - containerPort: 80
        livenessProbe:
          httpGet:
            path: /health
            port: 80
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"

场景 2:批处理任务

apiVersion: batch/v1
kind: Job
metadata:
  name: data-processing
spec:
  template:
    spec:
      restartPolicy: OnFailure
      containers:
      - name: processor
        image: data-processor:latest
        command: ["python", "process.py"]
        resources:
          requests:
            memory: "512Mi"
            cpu: "1"
          limits:
            memory: "1Gi"
            cpu: "2"

故障排查

常见问题

  1. Pod 一直处于 Pending 状态

    • 检查节点资源是否充足
    • 验证镜像是否可拉取
    • 确认 PVC 是否可用
  2. 容器频繁重启

    • 检查探针配置是否合理
    • 查看容器日志和事件
    • 验证资源限制设置
  3. Pod 无法接收流量

    • 检查就绪探针状态
    • 验证 Service 配置
    • 确认网络策略设置

调试命令

# 查看 Pod 状态
kubectl get pods -o wide

# 查看 Pod 详细信息
kubectl describe pod <pod-name>

# 查看 Pod 日志
kubectl logs <pod-name> -c <container-name>

# 查看 Pod 事件
kubectl get events --field-selector involvedObject.name=<pod-name>

# 进入容器调试
kubectl exec -it <pod-name> -c <container-name> -- /bin/bash

最佳实践

  1. 合理配置探针

    • 根据应用特性设置合适的超时和重试参数
    • 避免探针过于频繁或过于宽松
  2. 优化启动时间

    • 使用启动探针为慢启动应用提供缓冲
    • 优化镜像大小和启动流程
  3. 资源管理

    • 设置合理的资源请求和限制
    • 监控资源使用情况
  4. 优雅终止

    • 处理 SIGTERM 信号
    • 设置合适的 terminationGracePeriodSeconds

参考资料

文章导航

章节内容

这是章节的内容页面。

章节概览

评论区