4. Pod 生命周期与滚动更新机制:ReplicaSet、Deployment 滚动更新策略、maxSurge 与 maxUnavailable

在 Kubernetes 中,Pod 是最小的调度单元,但其生命周期是短暂的。为了实现证书轮换等关键操作的零停机部署,必须深入理解 Pod 的生命周期阶段以及 Deployment 如何通过 ReplicaSet 和滚动更新策略来管理 Pod 的替换过程。

4.1 Pod 生命周期阶段

Pod 从创建到终止会经历一系列明确的状态。理解这些状态是诊断部署问题和设计零停机策略的基础。

阶段(Phase) 描述 零停机关注点
Pending Pod 已被集群接受,但容器尚未完全启动(正在拉取镜像或等待调度)。 确保镜像拉取策略和资源配额不会导致长时间 Pending。
Running 至少一个容器正在运行,或正在启动/重启。 Pod 进入 Running 并不代表服务就绪,需配合 Readiness Probe。
Succeeded Pod 中的所有容器都已成功终止(通常用于 Job)。 证书轮换通常不涉及此状态。
Failed Pod 中至少一个容器以非零状态退出。 滚动更新中应避免因配置错误导致 Pod 快速进入 Failed。
Unknown 无法获取 Pod 状态,通常是由于节点通信故障。 需要节点级高可用保障。
关键实践: 在证书轮换场景中,应重点监控 Pod 从 Pending → Running → Ready 的转换时间。如果 Readiness Probe 配置不当,新 Pod 可能在未加载新证书的情况下就被加入 Service 端点,导致服务中断。

4.2 ReplicaSet:Pod 副本的守护者

ReplicaSet(RS)是 Kubernetes 中确保指定数量的 Pod 副本始终运行的控制器。它是 Deployment 实现滚动更新的底层机制。

  • 核心职责: 维持 Pod 副本数(replicas)的期望状态。当 Pod 因故障、节点宕机或主动删除而减少时,RS 会创建新的 Pod 进行补偿。
  • 选择器(Selector): RS 通过标签选择器(matchLabels)来管理其拥有的 Pod。每个 RS 只管理匹配其标签的 Pod。
  • 与 Deployment 的关系: Deployment 管理 ReplicaSet 的版本和数量。每次更新(如修改镜像版本或挂载新证书 Secret),Deployment 会创建一个新的 RS,并逐步增加新 RS 的副本数,同时缩减旧 RS 的副本数。
零停机要点: 在证书轮换时,Deployment 会创建新的 ReplicaSet。旧 RS 管理的 Pod 仍持有旧证书,新 RS 管理的 Pod 持有新证书。滚动更新过程就是新旧 RS 之间 Pod 数量的平滑转移。

4.3 Deployment 滚动更新策略

Deployment 的 strategy 字段定义了如何更新 Pod。对于零停机部署,必须使用 RollingUpdate 策略(默认策略)。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cert-renewal-app
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: app
        image: my-app:latest
        volumeMounts:
        - name: cert-volume
          mountPath: /etc/certs
      volumes:
      - name: cert-volume
        secret:
          secretName: tls-cert

4.4 maxSurge 与 maxUnavailable:滚动更新的核心参数

这两个参数直接决定了滚动更新的速度、资源消耗以及零停机的保障能力。

参数 含义 类型 零停机推荐值
maxSurge 滚动更新期间,允许超出期望副本数的最大 Pod 数量。可以是数字或百分比。 整数或百分比(默认 25%) 1 或 10%(控制资源突发)
maxUnavailable 滚动更新期间,允许相对于期望副本数不可用的最大 Pod 数量。可以是数字或百分比。 整数或百分比(默认 25%) 0(严格保障零停机)
重要警告: 如果设置 maxUnavailable: 1 且副本数为 3,则更新过程中可能只有 2 个 Pod 提供服务。对于证书轮换场景,如果旧证书即将过期,此时再减少一个 Pod 的容量,可能导致部分请求因证书验证失败而中断。因此,证书轮换场景强烈建议设置 maxUnavailable: 0。

4.5 滚动更新流程与零停机原理(SVG 图)

下图展示了 Deployment 在 maxSurge: 1 和 maxUnavailable: 0 配置下,从旧证书版本(v1)滚动更新到新证书版本(v2)的完整流程。

Deployment 滚动更新流程(maxSurge=1, maxUnavailable=0) 阶段 1:初始状态 RS-v1 (旧证书) Pod A (v1) Pod B (v1) Pod C (v1) 阶段 2:创建新 RS RS-v2 (新证书) Pod D (v2) (maxSurge=1,新增 1 Pod) 阶段 3:旧 Pod 下线 RS-v1 (旧证书) Pod A (v1) 终止中 Pod B (v1) Pod C (v1) 阶段 4:完成 RS-v2 (新证书) Pod D (v2) Pod E (v2) Pod F (v2) 说明:整个过程中,始终有 3 个 Pod 处于 Ready 状态提供服务(阶段 2 有 4 个 Pod,阶段 3 有 3 个 Pod)。 maxUnavailable=0 确保不会出现服务容量降级,是实现零停机证书轮换的关键配置。 滚动更新期间 Pod 数量变化 阶段 1: 旧 RS 3 Pod(全部 Ready) 阶段 2: 旧 RS 3 Pod + 新 RS 1 Pod(共 4 Pod,maxSurge=1) 阶段 3: 旧 RS 2 Pod + 新 RS 1 Pod(共 3 Pod,旧 Pod 终止中,maxUnavailable=0) 阶段 4: 新 RS 3 Pod(全部 Ready,旧 RS 副本数缩为 0)

4.6 证书轮换场景下的滚动更新策略配置建议

针对证书轮换这一特定场景,Deployment 的滚动更新参数需要精细调优:

  • maxUnavailable: 0:这是零停机的底线。确保在更新过程中,任何时候都有足够数量的 Pod 处理请求。
  • maxSurge: 1 或 10%:控制额外资源的消耗。对于证书轮换,通常不需要快速大规模并行更新,1 个 Pod 的 Surge 足以平滑过渡。
  • minReadySeconds: 30-60:新 Pod 启动后,等待一段时间再将其标记为 Ready。这给证书加载和应用程序预热留出时间。
  • Progress Deadline Seconds: 600:设置合理的进度超时时间,防止因证书配置错误导致滚动更新卡死。
最佳实践: 在证书轮换的 Deployment 中,结合 preStop 生命周期钩子,在 Pod 终止前优雅地关闭连接(如执行 sleep 10 或调用应用的健康检查接口),可以进一步降低连接中断的风险。