Kubernetes

K8s 滚动更新与发布策略

·4 分钟阅读·1434 字

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

📋 目录

K8s 滚动更新与发布策略

1. 📖 两个黄金参数

strategy:
  rollingUpdate:
    maxUnavailable: 1    # 最多允许多少个 Pod 不可用
    maxSurge: 1          # 最多允许超出期望副本数多少个

它们一起决定:一次更几个、先更后删还是先删后更、容灾能力。

1.1. maxUnavailable

定义:在升级过程中,最多允许多少个 Pod 处于不可用状态。

值行为风险
maxUnavailable=0先建新 Pod,旧 Pod 一个不删⭐ 最安全,回滚最快
maxUnavailable=1允许 1 个旧 Pod 被删后再建新 Pod⚠️ 适中
maxUnavailable=25%允许 25% 的 Pod 下线❌ 风险高

1.2. maxSurge

定义:在升级过程中,最多允许超出期望副本数的 Pod 数量。

值行为资源消耗
maxSurge=0先删旧 Pod,再建新 Pod零额外资源
maxSurge=1允许多建 1 个新 Pod少量额外资源
maxSurge=25%允许超量 25% 新建较多额外资源

1.3. 生产推荐配置

strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 30%
    maxUnavailable: 0
  • maxUnavailable=0:升级全程旧副本全部存活,是秒回滚的基石
  • maxSurge=30%:允许先扩容新 Pod,新旧同时在线

2. ⚡ 就绪探针(ReadinessProbe)

作用:控制 Pod 是否加入 Service Endpoint,只有探针成功后流量才接入。

readinessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 10
  failureThreshold: 3

3. 🔧 完整发布流程

1. 更新 Deployment 镜像版本
2. 创建新 ReplicaSet,按 maxSurge 启动新 Pod
3. 新 Pod 启动 → readinessProbe 探测
4. 新 Pod Ready → Endpoint 控制器加入 Pod IP
5. kube-proxy 更新转发规则
6. 按 maxUnavailable 删除旧 Pod
7. 重复直到全部替换

4. ⚙️ 秒级回滚方案

## 回滚到上一版本
kubectl rollout undo deployment/<name>

## 回滚到指定版本
kubectl rollout undo deployment/<name> --to-revision=<N>

## 查看版本历史
kubectl rollout history deployment/<name>

秒回滚的关键:

  • maxUnavailable=0 保证旧 Pod 全部存活
  • 旧镜像不删除,保留历史 revision
  • 回滚时直接拉起旧镜像,流量自动切回

关联文档

Yanche Blog

记录云原生、Linux、数据库等技术领域的学习心得,以及日常生活的思考与感悟。

© 2026 Yanche Blog. All rights reserved.

Powered by Astro