Kubernetes

K8s 滚动更新与发布策略

·4 分钟阅读·1449 字

Deployment 滚动更新完整原理:maxSurge/maxUnavailable/就绪探针/灰度发布/回滚

📋 目录

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 基础概念

关联文档