部署是将服务的某个版本投入生产环境的过程。部署的总体目标是:对系统用户产生最小影响的情况下,把服务的升级版本投放到生产环境中。
服务变更的主要原因
- 1、修复错误
- 2、提高服务的质量
- 3、增加新的功能
服务变更需要注意哪些(或者说如何产生最小影响)?
SRE 经验告诉我们,大概 70% 的生产事故由某种部署的变更而触发。变更管理的最佳实践可使用自动化来完成以下几点:
- 1、部署尽可能在用户少的时候。
- 2、每次部署前备份原始数据。
- 3、采用渐进式发布机制。
- 4、迅速而准确地检测到问题的发生。
- 5、当出现问题时,安全迅速地回退改动。
常用部署方式存在以下几种:
- 蓝绿部署
- 滚动部署
- 灰度部署/金丝雀部署
蓝绿部署
正常将项目分为两组, 蓝组和绿组, 正常运转的情况下每组承载 50%
的流量. 当准备发布服务时, 将蓝组流量设置为0%, 将绿组空闲出来, 将服务部署到绿组的机器, 然后利用SLB
将流量切换到绿组的机器, 让绿组来运行业务, 没问题的话流量全部导向绿组, 把蓝组也进行服务更新
优点
- 更新过程无需停机,风险较少
- 回滚方便,只需要更改路由或者切换DNS服务器,效率较高
缺点
- 需要部署两套机器,费用开销大
- 在非隔离的机器(Docker、VM)上操作时,可能会导致蓝绿环境被摧毁风险
- 负载均衡器/反向代理/路由/DNS处理不当,将导致流量没有切换过来情况出现
滚动部署
生产中的N台机器都为版本A的机器, 部署取出一个或者多个服务器停止服务,执行更新版本B,更新后重新将其投入使用,继续不断更新其他机器,直到集群中所有的实例都更新成版本B。这个其实就是K8S里面的更新策略
流程
- 1、负载均衡或者路由移除一台或者多台实例(正常监控也需要移除)
- 2、移除后的实例开始更新
- 3、上线测试后无异常开始接入负载均衡器或者路由
- 4、新增实例监控
- 5、继续上线后一批实例,直到集群中所有的实例都更新
优点
- 更新过程体验影响少,风险较少
- 费用对比蓝绿花费开销较少,无需额外新增机器
缺点
- 上线/回滚完成时间相对较慢
- 需要监控和负载均衡器的移除和接入能力
金丝雀部署(灰度发布)
以前旷工开矿下矿洞前,先会放一只金丝雀进去探是否有有毒气体,看金丝雀能否活下来,金丝雀发布由此得名。
金丝雀发布一般先发布一台, 或者小比例, 例如2%的服务器进行流量验证,国内也称为金丝雀测试, 流量测试通过, 慢慢将剩余机器也进行发布, 可以达到一个平滑过渡效果.
灰度发布可以保证整体系统的稳定性, 在初始灰度的时候就可以发现 调整以保证其影响度
流程
- 首先部署少量服务器密切
- 观察是否因为版本产生预期结果
- 当结果满意时候再全量部署
优点
- 用户体验影响小,金丝雀发布过程出现问题只影响少量用户
缺点
- 发布自动化程度不够,发布期间可引发服务中断