【问题标题】:In AWS - difference between Immutable and Blue/Green deployments?在 AWS - 不可变和蓝/绿部署之间的区别?
【发布时间】:2021-05-01 15:53:22
【问题描述】:
【问题讨论】:
标签:
amazon-web-services
amazon-elastic-beanstalk
aws-code-deploy
【解决方案1】:
它们的执行方式不同:
不可变:在相同的环境中(因此在相同的负载均衡器下),在旧的旁边创建一个新的自动缩放组。一旦创建了第一个新实例,它就开始为流量提供服务。当新实例都健康时,旧实例将被关闭。
蓝/绿:从头开始创建一个新环境(因此另一个负载均衡器)。当新环境准备就绪且健康时,在 DNS 级别执行切换,将流量从 OLD 路由到 NEW。
主要区别在于,在 不可变 更新中,新实例与旧实例一起提供流量,而在 蓝/绿 中,这不会发生(您立即完成从旧到新的完全切换)。
所以,在某些情况下,例如:
- 如果您的应用程序依赖于某些必须从旧版本更改的配置
新版本的版本
- 由于应用限制,新版本无法与旧版本同时运行
- “您想将环境更新到不兼容的平台版本”(取自
AWS 文档)
您必须使用蓝绿部署策略。
【解决方案2】:
补充以上答案:
不可变 vs 滚动
不可变部署实际上被认为是滚动部署的替代方案。主要区别如下:
| Rolling |
Immutable |
| New new ASG is created |
Second ASG is created and it serves traffic alongside first ASG until deployment is done |
| Deployment takes place on batches of existing instances |
Only one but a brand new instance is created first If passes health check, additional instances are created until the number of instances matches with the first ASG |
| Failure requires manual redeploy of old version |
Rollback is achieved by terminating the second ASG |
| How Rolling Deployments work? |
How Immutable Deployments work? |
不可变/滚动与蓝绿
A blue-green deployment 与上述两种部署方式截然不同。
- 在此部署中,将创建一个新环境并将其标记为
绿色(已存在的环境被视为蓝色)。
- 当绿色环境满足要求(健康检查/容量)时,将执行 CNAME 交换以将流量从蓝色环境切换到绿色环境。
- 如果新代码与旧代码不兼容(没有向后兼容或接口破坏性更改),蓝绿部署是唯一的选择
在所有这些部署中,停机时间为零,故障的影响将最小化。
金丝雀部署
- 流量拆分部署允许您执行金丝雀测试。据我了解,分流部署最接近不可变部署。
- 根据我在 documentation 中看到的内容,金丝雀测试也可以使用蓝/绿部署来执行。
Summary of differences from AWS documentation
【解决方案3】:
EC2 的不可变部署仅适用于 Elastic Beanstalk,而蓝/绿部署也适用于 lambda/ec2。