我有一个 ASG,其所需/最小/最大数量为 1/1/5 个实例(我希望 ASG 仅用于滚动部署和区域故障转移)。当我使用 MinHealthyPercentage=100,InstanceWarmup=180 启动实例刷新时,该过程从取消注册开始(实例几乎立即在我的 ALB 上进入耗尽模式,而不是等待 180 秒预热,直到新实例正常运行)并且应用程序变为暂时无法使用。 请注意,这不仅仅针对我的一个实例。如果我有两个实例,该过程也会从取消注册其中一个实例开始,这也不满足 100% MinHealthy 约束(但应用程序将保持可用)! 我是否应该调整任何其他配置选项来首先创建滚动更新并预热新实例?
当前实例刷新始终在启动之前终止,并且它使用 minHealthyPercent 来确定批次大小以及何时可以进入下一个批次。
它使一组实例停止服务,终止它们,并启动一组具有新的所需配置的实例。然后,它会等到实例通过健康检查并完成预热,然后再继续替换其他实例。
...
将最小健康百分比设置为 100% 可将替换率限制为一次一个实例。相反,将其设置为 0% 会导致所有实例同时被替换。
https://docs.aws.amazon.com/autoscaling/ec2/userguide/asg-instance-refresh.html
如果您正在运行 1 实例并使用 启动模板 和自动缩放功能,则很难滚动 更新 EC2 实例。
我从上述场景中走出来,发现了 AWS 的这个不成熟的功能。
在实例刷新的限制中提到,它会缩小实例并重新创建新实例,而不是创建第一个新实例。
实例在启动前终止:当系统中只有一个实例时 Auto Scaling 组中,启动实例刷新可能会导致 停电。这是因为 Amazon EC2 Auto Scaling 终止实例 然后启动一个新实例。
参考:https://docs.aws.amazon.com/autoscaling/ec2/userguide/asg-instance-refresh.html
我尝试了变通,将自动缩放组所需大小扩大到2,它将在启动模板中使用最新的 AMI 创建一个新实例。
现在您有两个实例运行旧版本和最新版本,您可以在自动扩展组中将所需容量设置回1。
将所需容量自动缩放到 1 将删除旧实例并保留具有最新 AMI 的最新实例。
将所需容量更新为 2
的命令- aws autoscaling update-auto-scaling-group --auto-scaling-group-name $ASG_GROUP --desired-capacity 2
将所需容量更新为 1
的命令- aws autoscaling update-auto-scaling-group --auto-scaling-group-name $ASG_GROUP --desired-capacity 1
而不是使用 instance-refresh 这对我来说效果很好。
自 2023 年 11 月 15 日起,AWS 支持在终止旧实例之前启动新实例。请参阅此公告: https://aws.amazon.com/about-aws/whats-new/2023/11/amazon-ec2-auto-scaling-ec2-instance-replacement/
他们称之为“实例维护策略”:https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-instance-maintenance-policy.html
如果我理解正确的话,可以为整个 ASG 设置此设置,并在每次实例刷新时覆盖。