2. Kubernetes Deployment 基础:Deployment 的概念、ReplicaSet 的作用、Pod 的生命周期

在深入证书轮换的零停机策略之前,必须牢固掌握 Kubernetes 中三个最核心的抽象:Deployment、ReplicaSet 和 Pod。这三者构成了无状态工作负载的声明式管理基石,也是滚动更新得以实现的基础。

2.1 Deployment:声明式应用管理

Deployment 是 Kubernetes 中最常用的工作负载 API 对象,它提供了声明式的更新能力。你只需描述“目标状态”(例如:运行 3 个副本,镜像版本为 v2),Deployment 控制器便会自动驱动当前状态向目标状态收敛。

Deployment 的核心职责包括:

  • 定义副本数量:通过 replicas 字段指定期望运行的 Pod 副本数。
  • 管理 Pod 模板:包含 Pod 的容器镜像、端口、环境变量、挂载卷(包括证书)等定义。
  • 触发滚动更新:当 Pod 模板(如镜像标签或证书 ConfigMap)发生变化时,自动执行更新策略。
  • 支持回滚:保留历史版本记录,允许快速回退到上一个稳定版本。
关键认知: Deployment 不直接管理 Pod,而是通过管理 ReplicaSet 来间接控制 Pod。这种分层设计使得版本追踪和回滚变得简单且可靠。

2.2 ReplicaSet:副本保活与版本锚点

ReplicaSet 是 Deployment 与 Pod 之间的中间层。它的唯一使命是确保指定数量的 Pod 副本始终处于运行状态。当 Pod 因节点故障、资源耗尽或人为误删而消失时,ReplicaSet 会立即创建新的 Pod 进行替换。

ReplicaSet 在滚动更新中的关键作用:

特性 说明
版本锚点 每次 Deployment 更新 Pod 模板时,都会创建一个新的 ReplicaSet,旧的 ReplicaSet 保留但不缩放。
回滚目标 回滚操作本质上是将目标 ReplicaSet 的副本数调高,同时将当前 ReplicaSet 的副本数调低。
独立扩缩 在滚动更新过程中,新旧两个 ReplicaSet 同时存在,各自负责一部分流量。
实践提示: 证书轮换时,更新挂载证书的 ConfigMap 或 Secret 会触发 Pod 模板变更,Deployment 会据此创建新的 ReplicaSet,从而启动包含新证书的 Pod。

2.3 Pod 生命周期:从创建到终结

Pod 是 Kubernetes 中最小的调度和运行单元。理解 Pod 的生命周期阶段,对于设计零停机更新策略至关重要。

Pod 的生命周期包含以下主要阶段:

  1. Pending:Pod 已被 API Server 接受,但尚未调度到节点,或正在拉取镜像。
  2. Running:Pod 已绑定到节点,所有容器已创建,至少有一个容器正在运行或正在启动。
  3. Succeeded:Pod 中的所有容器都已成功终止,且不会再重启(适用于 Job 类任务)。
  4. Failed:Pod 中至少有一个容器以非零状态退出。
  5. Unknown:API Server 无法获取 Pod 的状态,通常是由于节点通信故障。

在滚动更新场景中,我们最关注的是 Pod 从 Running 到 Terminating 的过渡过程:

  • PreStop Hook:容器在收到 SIGTERM 信号前执行的钩子,常用于优雅关闭(如从负载均衡器注销、完成正在处理的请求)。
  • terminationGracePeriodSeconds:Kubernetes 等待容器优雅关闭的最长时间,超时后强制杀死。
  • 生命周期钩子:postStart 和 preStop 是保证零停机的重要工具。
证书轮换陷阱: 如果旧 Pod 在证书轮换期间被强制杀死(未设置 preStop 或 grace period 过短),正在使用旧证书建立的 TLS 连接可能会被突然中断,导致客户端报错。

2.4 三者的协作关系

下面的 SVG 图展示了 Deployment、ReplicaSet 和 Pod 之间的层级关系与协作流程:

Deployment、ReplicaSet 与 Pod 的层级关系 Deployment → ReplicaSet → Pod 层级关系 Deployment ReplicaSet (v2) Pod A (Running) Pod B (Running) Pod C (Running) Pod 生命周期关键阶段 Pending → Running → (PreStop Hook) → Terminating → 删除 terminationGracePeriodSeconds 控制优雅关闭等待时间

2.5 滚动更新中的版本追踪机制

当 Deployment 触发更新时,Kubernetes 会创建新的 ReplicaSet,并逐步将旧 ReplicaSet 的副本数降为 0。下图展示了更新过程中新旧 ReplicaSet 的共存状态:

滚动更新中的新旧 ReplicaSet 共存 滚动更新:新旧 ReplicaSet 版本共存 ReplicaSet (v1) — 旧证书 ReplicaSet (v2) — 新证书 Pod v1-1 Pod v1-2 Pod v2-1 Pod v2-2 滚动更新方向 滚动更新过程中的版本共存策略 • 旧 ReplicaSet 逐步缩容:副本数从 3 → 2 → 1 → 0 • 新 ReplicaSet 逐步扩容:副本数从 0 → 1 → 2 → 3 • 整个过程中始终有 Pod 提供服务,实现零停机

2.6 核心概念对比

概念 职责 与证书轮换的关系
Deployment 声明式更新、回滚、副本管理 检测到证书模板变更后,自动触发滚动更新流程
ReplicaSet 版本锚点、Pod 副本保活 新旧证书版本各对应一个 ReplicaSet,实现平滑过渡
Pod 运行容器、承载证书文件 通过 PreStop Hook 和健康检查确保连接不中断