Docker KubernetesNotes

第 20 章:发布回滚

zjc 于 2026-01-20 发布

这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Kubernetes 支持声明式发布,但稳定发布依赖镜像不可变、探针合理、策略清晰和回滚预案。

20.1 Deployment 更新

kubectl set image deployment/order-service \
  app=registry.example.com/shop/order-service:1.3.0

kubectl rollout status deployment/order-service

历史:

kubectl rollout history deployment/order-service

回滚:

kubectl rollout undo deployment/order-service
kubectl rollout undo deployment/order-service --to-revision=3

20.2 滚动策略

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
参数 含义
maxUnavailable 更新时最多不可用副本数
maxSurge 最多临时超出期望副本数

0 / 1 更稳但速度较慢;1 / 0 快但可能短暂降容量。

20.3 发布前检查

1. 镜像 tag 不可变
2. 数据库迁移兼容新旧版本
3. 配置和 Secret 就绪
4. 资源 requests / limits 足够
5. 探针正确
6. 日志指标可见
7. 服务依赖可用
8. 回滚预案明确

20.4 数据库变更

推荐 expand / migrate / contract:

第一阶段:新增兼容字段和表
第二阶段:双写或迁移数据
第三阶段:应用切换新逻辑
第四阶段:确认稳定后删除旧结构

不要让新旧应用依赖不兼容的表结构。

20.5 流量发布策略

策略 特点
Rolling 默认,逐批替换
Blue/Green 双环境切换
Canary 小流量验证
A/B 按用户特征分流
Feature Flag 业务逻辑开关

简单服务用 Deployment 滚动;核心链路可叠加网关灰度和监控自动回滚。

20.6 发布失败判断

观察:

  1. rollout 状态;
  2. Pod ready 数;
  3. HTTP 5xx;
  4. P95/P99 延迟;
  5. 核心业务成功率;
  6. 日志错误;
  7. 依赖资源指标。

本章小结

发布是版本、配置、数据、流量和观测的组合动作。Kubernetes 提供滚动和回滚能力,业务稳定性还需要兼容性设计、灰度和自动判断。

思考题

  1. maxSurge 和 maxUnavailable 如何权衡?
  2. 为什么镜像 tag 要不可变?
  3. 数据库兼容发布如何设计?
  4. 金丝雀发布观察哪些指标?
  5. 回滚是否总是能解决数据结构问题?