下载工作台
项目运维与部署

滚动升级与回滚

试读上半部分 · 解锁后可读全文

第 4 章 · 滚动升级与回滚

本章目标:掌握 Kubernetes RollingUpdate、三类探针、PodDisruptionBudget 与数据库协同顺序;在 demo-mall prod 实现 15 分钟内回滚 SLA;能在小紫 应用部署 → 升级历史 完成 undo。

学时建议:2~2.5 小时(含 1.5 小时跟练)

前置ops-deploy ch03 产出镜像;小紫云计算 · 应用部署ch02 配置外置。


4.1 场景说明

项目内容
背景demo-api 1.4.2 稳定运行 prod;发布 1.4.3 后 5xx 升高
你的角色发布执行人 + 复核人,需在变更窗口内完成升级或回滚
本章任务配置滚动策略与探针;完成一次升级;模拟错误镜像 5 分钟内回滚
约束prod maxUnavailable: 0;readiness 不得深度依赖下游 DB(防雪崩)
成功标准MTTR < 15min;变更单含预写回滚命令

滚动 vs 蓝绿/金丝雀:本章是日常默认策略;高级策略见 ch09


4.2 学完你能

能力验收标准
解释 RollingUpdate说清 maxSurge / maxUnavailable 对可用性的影响
配置三类探针liveness / readiness / startup 各写一段 YAML
执行回滚CLI 与 应用部署 → 升级历史 → 回滚 两种方式
变更窗口填写 T-1 与 T+15min 检查清单
DB 协同说出加列/删列/不可逆迁移的发布顺序
PDB解释 minAvailable 对节点维护的意义

4.3 滚动升级原理

v1 Pod ──► v2 Ready ──► 流量切换 ──► 摘除 v1 ──► 全量 v2

Deployment 策略片段

spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # 升级期最多额外 1 个 Pod(或 25%)
      maxUnavailable: 0  # 不允许可用副本减少
  minReadySeconds: 15    # Ready 后再等 15s 才计为 Available
  revisionHistoryLimit: 10
参数生产推荐说明
maxSurge25% 或 1升级期额外 Pod,加快替换
maxUnavailable0大促保证可用副本不减少
minReadySeconds10~30防止就绪抖动立即接流量
progressDeadlineSeconds600超时标记 ProgressDeadlineExceeded

你应该看到kubectl rollout status deployment/demo-api -n prod-app 输出 successfully rolled out


4.4 逐步跟练 · 第一步:配置健康检查(约 30 分钟)

应用部署 → demo-api → 编辑 YAML 加入:

containers:
  - name: api
    livenessProbe:
      httpGet: { path: /healthz, port: 8080 }
      initialDelaySeconds: 30
      periodSeconds: 10
      failureThreshold: 3
    readinessProbe:
      httpGet: { path: /ready, port: 8080 }
      periodSeconds: 5
      failureThreshold: 3
    startupProbe:
      httpGet: { path: /healthz, port: 8080 }
      failureThreshold: 30
      periodSeconds: 10
探针失败后果典型误配
readiness不接 Service 流量path 查 DB 导致全 Pod Not Ready
livenesskubelet 重启容器initialDelay 过短 → 重启风暴
startup慢启动保护未配时 liveness 误杀 Java/Go 冷启动

原则:readiness 只检查本进程可服务;深度依赖检查放 /ready-deep 且仅 staging 启用。

你应该看到:新 Pod 先 startup 通过 → readiness True → 旧 Pod 终止;系统容器 无频繁 Restart。


4.5 逐步跟练 · 第二步:正常滚动升级(约 25 分钟)

场景:prod 从 1.4.21.4.3(staging 已验证同 tag)。

步骤 1 — 变更单 T-1

  • 备份(ch11)、回滚命令写入变更单
  • 运维 → 监控告警 打开 demo-api Dashboard

步骤 2 — 更新镜像

kubectl set image deployment/demo-api \
  demo-api=registry.devops.svc:5000/demo-api:143-b7e2a01 -n prod-app
kubectl rollout status deployment/demo-api -n prod-app --timeout=600s

应用部署 → 升级 → 选择新 tag

步骤 3 — T+15min 观察

  • 5xx 率无突增;P99 无翻倍;抽样下单 3 笔

你应该看到:ReplicaSet 新旧交替;Events 无 FailedMount;Grafana 发布标注线可对齐变更时间(ch07)。


4.6 逐步跟练 · 第三步:错误发布与回滚(约 30 分钟)

注入:部署已知坏镜像 demo-api:broken(或错误启动命令)。

步骤 1 — 发现

以下内容需解锁后阅读

试读已结束。解锁本章 ¥5.00,或开通年度会员畅读全部教程。
年度会员 ¥199.00/年; 小紫 AI 工作台有效会员 ¥99.00/年

正文仅在服务端鉴权后下发,未付费无法获取下半部分内容。