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 的生命周期包含以下主要阶段:
- Pending:Pod 已被 API Server 接受,但尚未调度到节点,或正在拉取镜像。
- Running:Pod 已绑定到节点,所有容器已创建,至少有一个容器正在运行或正在启动。
- Succeeded:Pod 中的所有容器都已成功终止,且不会再重启(适用于 Job 类任务)。
- Failed:Pod 中至少有一个容器以非零状态退出。
- 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 之间的层级关系与协作流程:
2.5 滚动更新中的版本追踪机制
当 Deployment 触发更新时,Kubernetes 会创建新的 ReplicaSet,并逐步将旧 ReplicaSet 的副本数降为 0。下图展示了更新过程中新旧 ReplicaSet 的共存状态:
2.6 核心概念对比
| 概念 | 职责 | 与证书轮换的关系 |
|---|---|---|
| Deployment | 声明式更新、回滚、副本管理 | 检测到证书模板变更后,自动触发滚动更新流程 |
| ReplicaSet | 版本锚点、Pod 副本保活 | 新旧证书版本各对应一个 ReplicaSet,实现平滑过渡 |
| Pod | 运行容器、承载证书文件 | 通过 PreStop Hook 和健康检查确保连接不中断 |