首页/开发/CI/CD 与发布速查/不可变基础设施与发布
发布策略60 条

不可变基础设施与发布

服务器不原地打补丁,而是整体替换:镜像或虚机模板作为制品构建与版本化;发布=替换实例,回滚=用上一版制品重新拉起。

CI/CD 与发布速查开发更新于 2026-10-13

不可变基础设施与发布

服务器不原地打补丁,而是整体替换:镜像或虚机模板作为制品构建、版本化;发布=替换实例,回滚=用上一版制品重新拉起。好处是环境与制品一一对应、漂移消失;代价是对构建、配置注入与替换流程的工程化要求更高:构建、镜像仓库、编排与回滚链路都要成体系。

基本信息

原则改动产生新制品,不修改运行中的实例
制品容器镜像、虚机模板等版本化产物
发布新实例替换旧实例
回滚重新部署上一版本制品
配置环境差异走配置与密钥注入,制品保持同一份

典型使用场景

  • 容器化部署:镜像即制品
  • 虚机镜像流水线:定期烘焙新模板
  • 批量替换升级:滚动替换整体版本
  • 快速回滚:换回旧制品即可
  • 消除漂移:不再登机器改配置
  • 合规审计:每个实例对应可查的制品版本,审计时直接引用

替换式发布

替换式发布
docker build -t registry.example.com/app:1.9.0 .   # 制品带版本
docker push registry.example.com/app:1.9.0
kubectl set image deployment/app app=registry.example.com/app:1.9.0
# 回滚:把镜像指回上一版本制品
kubectl rollout undo deployment/app

与原地修改对比

维度不可变原地修改
变更方式替换实例登入改配置、就地升级
漂移基本消除随时间积累
回滚换制品手工回退难
与配置注入配合:环境差异走配置与密钥,制品本身保持同一份。
旧实例别留恋:确认流量切走、观察期过后再销毁,保留窗口覆盖回滚需求。
制品也要清理:旧镜像与旧模板按保留策略回收,别让仓库无限膨胀。
渐进采用:先容器化、再替换虚机,不必一步到位;关键是「改动不落到运行实例」。
环境晋级同一制品:同一版本依次经预发到生产,晋级只改引用不重构建;标签用语义化版本或提交号,禁止 :latest 上线,否则回滚时找不到确切内容。

易错点

  • 热修直接改生产实例:下次替换后修复消失,问题复发
  • 制品不版本化:回滚时找不到上一版的确切内容
  • 替换时数据没外置:实例销毁数据一起没,有状态部分必须外置到数据库或对象存储
  • 构建与运行环境漂移:镜像构建环境和运行环境不一致,制品行为对不上
  • 没有回滚预案就替换:新版本起不来才知道回不去,先保旧实例可用再逐个替换,替换批次间留观察窗

数据来源与参考

  • Chad Fowler《Trash Your Servers and Burn Your Code》(2013)
  • 12factor.net《Build, release, run》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌