我一直在为AWS上托管的应用程序开发DevOps管道。我想对我目前的设置进行改进,但我不确定最好的方法。我目前的设置如下:
此设置的问题是环境从实例终止时到完全配置新实例时都已关闭。
我一直在考虑如何改进此流程以消除停机时间,并且我提出了两种可能的解决方案:
解决方案#1:
使用此解决方案,始终至少有一个实例能够在ASG中提供请求。问题是,ASG似乎不支持手动调用它来启动新实例的简单操作。 (它们仅在扩展策略调用它时才启动新实例。)您可以将现有实例附加到组,但这会导致所需的容量值增加,这是我不想要的。
解决方案#2:
与之前的解决方案一样,始终至少有一个实例可用于处理请求。问题是,通常有两个实例,即使只需要一个实例。此外,代码部署过程似乎不必要地复杂化。
哪个更好:解决方案#1,解决方案#2,还是我还没有想到的其他解决方案?另外一个快速免责声明:我理解我正在使用ASG而不是其预期目的,但它似乎是在AWS的“EC2实例是牛”理念下实现自动代码部署的最佳方式。
答案 0 :(得分:2)
您正在寻找的术语是“零停机部署”。
问题是,ASG似乎不支持手动调用它来启动新实例的简单操作。 (它们仅在扩展策略调用它时才启动新实例。)您可以将现有实例附加到组,但这会导致所需的容量值增加,这是我不想要的。
如果您自己更改所需容量(例如通过API调用),Auto Scaling组将自动为您启动额外的实例。例如,以下是为Auto Scaling Group(ASG)实施零停机部署的简单方法:
您可以手动实现此功能,也可以使用现有工具为您执行此操作,例如:
create_before_destroy
生命周期属性执行零停机(排序)蓝绿部署as described here。serial
关键字执行rolling upgrades。您可以详细了解trade-offs between tools like Terraform, CloudFormation, Ansible, Chef, and Puppet here。
答案 1 :(得分:0)
即使这是DevOps管道而不是生产环境,您所描述的内容听起来像是一个蓝/绿部署方案,您希望能够在没有停机的情况下在环境之间切换。我认为最好的答案主要取决于您的要求(我们不会100%知道),但像The DOs and DON'Ts of Blue/Green Deployment这样的指南将有助于找到实现目标的最佳方式,无论是# 1,#2,或其他。