2. Deployment 基础回顾:核心概念与滚动更新原理

在集群升级前,理解 Deployment 的工作机制是设计灰度迁移与容量基线的基石。Deployment 是 Kubernetes 中最常用的工作负载控制器,它通过管理 ReplicaSet 来确保 Pod 的期望数量与版本,并提供了声明式的滚动更新能力。

2.1 核心概念:Deployment → ReplicaSet → Pod

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

  • Deployment:声明式控制器,负责定义 Pod 模板、副本数、更新策略。它只负责创建/更新/回滚 ReplicaSet。
  • ReplicaSet:副本控制器,确保指定数量的 Pod 副本始终运行。每个 ReplicaSet 对应一个特定的 Pod 模板版本。
  • Pod:最小调度单元,承载容器化应用。由 ReplicaSet 创建和管理。
关键认知: 每次 Deployment 更新(如镜像版本变更)都会创建一个新的 ReplicaSet,旧的 ReplicaSet 保留但不删除(默认保留 10 个版本),用于快速回滚。
Deployment → ReplicaSet → Pod 层级关系 Deployment → ReplicaSet → Pod 层级关系 Deployment ReplicaSet Pod (v1.0) Pod (v1.0) Pod (v1.0) Deployment 管理 ReplicaSet 的版本与数量,ReplicaSet 确保 Pod 副本数始终符合期望

2.2 ReplicaSet 与 Pod 的关系

ReplicaSet 通过标签选择器(Label Selector)与 Pod 建立关联。每个 ReplicaSet 的 Pod 模板中包含一组固定的标签,ReplicaSet 的 spec.selector.matchLabels 必须与 Pod 标签匹配。

组件 职责 关键字段
ReplicaSet 确保 Pod 副本数恒定,支持扩缩容 replicas、selector、template
Pod 运行容器实例,拥有独立 IP 和状态 labels、status.phase
标签匹配 ReplicaSet 通过 matchLabels 关联 Pod app: nginx、version: v1
实践要点: 不要手动修改由 ReplicaSet 创建的 Pod 标签,否则会导致 ReplicaSet 失去对 Pod 的控制,产生“孤儿 Pod”。

2.3 滚动更新策略原理

滚动更新(Rolling Update)是 Deployment 默认的更新策略,它通过逐步替换旧版本 Pod 为新版本 Pod,实现零停机发布。核心参数由 spec.strategy.rollingUpdate 控制:

  • maxSurge:更新期间允许超出期望副本数的最大 Pod 数量。可以是数或百分比(默认 25%)。
  • maxUnavailable:更新期间允许不可用 Pod 的最大数量。可以是数或百分比(默认 25%)。

滚动更新的执行流程如下:

  1. 用户修改 Deployment 的 Pod 模板(如镜像版本)。
  2. Deployment 控制器创建一个新的 ReplicaSet,初始副本数为 0。
  3. 根据 maxSurge 和 maxUnavailable 计算每批次可创建的 Pod 数量。
  4. 逐步在新 ReplicaSet 中创建 Pod,同时在旧 ReplicaSet 中删除 Pod。
  5. 当新 ReplicaSet 的 Pod 全部达到 Ready 状态,且旧 ReplicaSet 副本数降为 0 时,更新完成。
滚动更新流程示意图 滚动更新流程示意图(maxSurge=1, maxUnavailable=1) 阶段 1:更新前 RS-old (3 Pods) 阶段 2:创建新 Pod RS-old (2 Pods) RS-new (1 Pod) 阶段 3:逐步替换 RS-old (1 Pod) RS-new (2 Pods) 阶段 4:更新完成 RS-new (3 Pods) 滚动更新保证:更新期间始终有 2 个 Pod 可用(replicas=3, maxUnavailable=1) 最多同时存在 4 个 Pod(replicas=3, maxSurge=1),不会超过集群资源限制 新 Pod 通过 Readiness Probe 确认就绪后,才会继续下一批次

2.4 滚动更新策略参数对比

参数 默认值 含义 对容量的影响
maxSurge 25% 更新期间允许超出期望副本数的最大 Pod 数 增加临时资源消耗,需确保集群有额外容量
maxUnavailable 25% 更新期间允许不可用 Pod 的最大数量 降低最小可用容量,可能影响服务吞吐
replicas 1 期望运行的 Pod 副本数 决定基线容量和冗余度
升级前必查: 如果集群资源紧张,maxSurge 设置过大可能导致 Pod 调度失败;如果服务对容量敏感,maxUnavailable 设置过大会造成请求超时或错误率上升。建议在升级前根据实际负载调整这两个参数。

2.5 回滚机制

Deployment 的滚动更新是可逆的。每次更新都会在 ReplicaSet 历史中保留记录(默认保留 10 个版本)。回滚操作会创建一个新的 ReplicaSet(或复用历史版本),并重新执行滚动更新流程。

# 查看 Deployment 更新历史
kubectl rollout history deployment/nginx-deployment

# 回滚到上一个版本
kubectl rollout undo deployment/nginx-deployment

# 回滚到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2

回滚时,Deployment 控制器会对比当前 ReplicaSet 与目标版本的 Pod 模板,如果模板一致则直接调整副本数;否则创建新的 ReplicaSet 并执行滚动更新。