K8s 滚动更新与发布策略
📖 两个黄金参数
strategy:
rollingUpdate:
maxUnavailable: 1 # 最多允许多少个 Pod 不可用
maxSurge: 1 # 最多允许超出期望副本数多少个
它们一起决定:一次更几个、先更后删还是先删后更、容灾能力。
maxUnavailable
定义:在升级过程中,最多允许多少个 Pod 处于不可用状态。
| 值 | 行为 | 风险 |
|---|---|---|
maxUnavailable=0 | 先建新 Pod,旧 Pod 一个不删 | ⭐ 最安全,回滚最快 |
maxUnavailable=1 | 允许 1 个旧 Pod 被删后再建新 Pod | ⚠️ 适中 |
maxUnavailable=25% | 允许 25% 的 Pod 下线 | ❌ 风险高 |
maxSurge
定义:在升级过程中,最多允许超出期望副本数的 Pod 数量。
| 值 | 行为 | 资源消耗 |
|---|---|---|
maxSurge=0 | 先删旧 Pod,再建新 Pod | 零额外资源 |
maxSurge=1 | 允许多建 1 个新 Pod | 少量额外资源 |
maxSurge=25% | 允许超量 25% 新建 | 较多额外资源 |
生产推荐配置
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 30%
maxUnavailable: 0
maxUnavailable=0:升级全程旧副本全部存活,是秒回滚的基石maxSurge=30%:允许先扩容新 Pod,新旧同时在线
⚡ 就绪探针(ReadinessProbe)
作用:控制 Pod 是否加入 Service Endpoint,只有探针成功后流量才接入。
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
failureThreshold: 3
🔧 完整发布流程
1. 更新 Deployment 镜像版本
2. 创建新 ReplicaSet,按 maxSurge 启动新 Pod
3. 新 Pod 启动 → readinessProbe 探测
4. 新 Pod Ready → Endpoint 控制器加入 Pod IP
5. kube-proxy 更新转发规则
6. 按 maxUnavailable 删除旧 Pod
7. 重复直到全部替换
⚙️ 秒级回滚方案
## 回滚到上一版本
kubectl rollout undo deployment/<name>
## 回滚到指定版本
kubectl rollout undo deployment/<name> --to-revision=<N>
## 查看版本历史
kubectl rollout history deployment/<name>
秒回滚的关键:
maxUnavailable=0保证旧 Pod 全部存活- 旧镜像不删除,保留历史 revision
- 回滚时直接拉起旧镜像,流量自动切回
关联文档 -故障排查K8s 发布故障排查 — 发布卡住/流量不切排查
- ../network/K8s Ingress 详解 — 七层灰度发布
- ../core/K8s 核心概念 — Deployment 基础概念
关联文档