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 不会立即删除,而是保留以支持回滚。
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 的模板。
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>