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 个版本),用于快速回滚。
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%)。
滚动更新的执行流程如下:
- 用户修改 Deployment 的 Pod 模板(如镜像版本)。
- Deployment 控制器创建一个新的 ReplicaSet,初始副本数为 0。
- 根据
maxSurge和maxUnavailable计算每批次可创建的 Pod 数量。 - 逐步在新 ReplicaSet 中创建 Pod,同时在旧 ReplicaSet 中删除 Pod。
- 当新 ReplicaSet 的 Pod 全部达到 Ready 状态,且旧 ReplicaSet 副本数降为 0 时,更新完成。
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 并执行滚动更新。