2. Kubernetes Deployment 基础回顾:ReplicaSet、滚动更新策略、Pod 模板与版本管理

Deployment 是 Kubernetes 中用于声明式管理无状态工作负载的核心资源。它通过控制 ReplicaSet 来确保期望的 Pod 副本数始终运行,并提供了声明式的滚动更新与回滚能力。理解 Deployment 的底层组件与更新机制,是后续校准版本漂移与优化灰度发布参数的前提。

2.1 核心组件:Deployment → ReplicaSet → Pod

Deployment 并不直接管理 Pod,而是通过 ReplicaSet 实现间接控制。三者构成一个清晰的层级关系:

  • Deployment:定义期望状态(副本数、Pod 模板、更新策略),负责版本管理与发布流程。
  • ReplicaSet:确保指定数量的 Pod 副本运行,每个 ReplicaSet 对应一个特定的 Pod 模板版本。
  • Pod:实际运行容器的工作负载实例,由 ReplicaSet 创建与回收。
关键概念: 每次 Deployment 的 Pod 模板(spec.template)发生变更时,Kubernetes 会创建一个新的 ReplicaSet,并逐步将流量从旧 ReplicaSet 迁移到新 ReplicaSet。旧 ReplicaSet 不会立即删除,而是保留以支持回滚。
Deployment → ReplicaSet → Pod 层级关系 Deployment → ReplicaSet → Pod 层级关系 Deployment ReplicaSet (v1) Pod (A) Pod (B) Pod (C) Deployment 控制 ReplicaSet,ReplicaSet 控制 Pod 副本;每个 ReplicaSet 对应一个 Pod 模板版本

2.2 滚动更新策略(RollingUpdate)

Deployment 默认使用 RollingUpdate 策略,通过两个关键参数控制更新速率与可用性:

参数 默认值 含义 典型场景
maxSurge 25% 更新期间允许超出期望副本数的最大 Pod 数量(值或百分比) 快速发布时适当增大,如 50%
maxUnavailable 25% 更新期间允许不可用 Pod 的最大数量(值或百分比) 关键服务建议设为 0 或 1
优化建议: 对于高可用要求严格的生产服务,建议将 maxUnavailable 设为 0,确保更新过程中始终有足够的 Pod 处理请求;同时适当增大 maxSurge 以加速发布。

2.3 Pod 模板与版本管理

Deployment 的 spec.template 定义了 Pod 的完整规范,包括容器镜像、环境变量、资源限制、探针等。当 spec.template 内容发生变化时,Kubernetes 会将其视为一次新的版本变更:

  • 版本标识:Deployment 的 spec.template 的哈希值作为版本标识,存储在 ReplicaSet 的 metadata.ownerReferences 和 spec.selector 中。
  • 版本历史:Deployment 默认保留最近 10 个 ReplicaSet 版本(可通过 spec.revisionHistoryLimit 调整)。
  • 回滚机制:通过 kubectl rollout undo 回退到指定版本,本质上是将 Deployment 的 spec.template 恢复为历史 ReplicaSet 的模板。
版本变更与 ReplicaSet 演进 版本变更与 ReplicaSet 演进 ReplicaSet v1 镜像: app:v1.0 ReplicaSet v2 镜像: app:v2.0 ReplicaSet v3 镜像: app:v3.0 每次 Pod 模板变更生成新 ReplicaSet;旧版本保留用于回滚(默认保留 10 个版本) kubectl rollout undo → 回退到 v1

2.4 版本漂移的根源

版本漂移(Version Drift)是指实际运行的 Pod 版本与 Deployment 期望版本不一致的现象。常见原因包括:

原因 说明 影响
手动修改 Pod 直接通过 kubectl edit pod 或 kubectl patch 修改运行中的 Pod Pod 与 ReplicaSet 模板不一致,下次滚动更新时被覆盖
回滚操作 回滚后旧 ReplicaSet 重新接管,但新 ReplicaSet 仍保留 多个 ReplicaSet 同时存在,版本混乱
外部控制器干扰 HPA、VPA 或其他 Operator 修改了 Pod 的资源规格 Pod 模板与 Deployment 定义不一致
手动扩缩容 直接修改 ReplicaSet 的副本数而非通过 Deployment Deployment 的期望状态与实际状态脱节
实践警示: 版本漂移是灰度发布参数优化中需要重点校准的问题。如果 Deployment 的 spec.template 与当前运行的 Pod 模板不一致,滚动更新策略的参数(如 maxSurge、maxUnavailable)将无法正确生效,导致发布行为不可预测。

2.5 关键命令速查

# 查看 Deployment 状态与版本历史
kubectl rollout status deployment/<name>
kubectl rollout history deployment/<name>

# 查看特定版本的详细信息
kubectl rollout history deployment/<name> --revision=2

# 回滚到上一个版本
kubectl rollout undo deployment/<name>

# 回滚到指定版本
kubectl rollout undo deployment/<name> --to-revision=3

# 暂停/恢复滚动更新
kubectl rollout pause deployment/<name>
kubectl rollout resume deployment/<name>