Instance refresh

根据应用的版本变更,Launch template随时可能发生变化,例如更换新的AMI、更新userdata等。如果ASG已经根据Launch Template创建了一堆机器,此时需要将这些机器更新,全部替换成新版本的Launch Template

ASG有instance refresh功能,当创建好新版本的launch template后,启动一个instance refresh,这样会立即更新ASG。在更新ASG时,会采取滚动更新的方式——先将一批机器终止,再启动新版本的机器,当这些新版本的机器通过健康检查后再进入下一轮的更新

相关概念

在启动instance refresh时,有些概念要提前了解:

  • Minimum healthy percentage - 当进行instance refresh时,ASG维护最少健康实例的百分比。例如将它设置成100%,则一次只有一个EC2进行替换;如果将它设置成0%,则所有的EC2同时被替换
  • Instance warmup - 当新的实例状态变成InService后,设置warmup时间后,它需要经过这段warmup时间才能接收流量。适用于应用需要初始化(加载数据库、从互联网拉数据等)的场景
  • Desired configuration - 新版本的Launch Template。在进行instance refresh过程中,如果线上流量突增、发生了扩容事件,此时会使用Desired configuration来启动新扩容的机器;在instance refresh过程完成后,ASG的Launch template也被更新成Desired configuration
  • Skip matching - 当EC2匹配某些条件时,不用被替换
  • Checkpoints - 前面提到instance refresh是滚动更新的,当它达到特定的百分比后,可以配置checkpoint,让ASG临时停止滚动更新过程,发送一条通知给管理员。管理员收到通知后,检查新版本的配置是不是正常,如果发现有问题,管理员可以选择回退到上一个版本

接下来我们将动手实践下Instance refresh

Instance refresh实验

本章开始我们创建Launch template,并基于它创建了ASG。访问服务的页面输出以下内容:

本节我们将更新这个Launch template,创建v2版本,让后端输出Hello World v2。然后使用instance refresh的特性,将ASG的机器全部替换为v2版本。

创建新版本launch template

进入Launch template页面,点击Modify template:

image-20221008214322879

输入新版本的描述,选择基于v1来创建新的版本:

image-20221008214408529

下拉到最后,更新userdata,让后端输出Hello World v2,最后点击Create template version:

image-20221008214451321

新版本的Launch template创建完成后,可以将它设置成默认版本,也可以不做操作(不影响下一步):

image-20221008214527080

启动Instance refresh

在ASG的页面,点击Start instance refresh

image-20221008214211448

设置Minimum healthy percentageInstance warmupCheckpoints属性(Checkpoint这里仅用于展示如何设置,并不会启动它):

image-20221008214946089

Desired configuration部分,使用新版本的Launch template

image-20221008215110408

最后点击创建。

检查Instance refresh效果

在创建完Instance refresh后,随时可以取消它。一开始进入Pending状态:

image-20221008215140917

然后启动新的实例:

image-20221008215214690

实例启动完成后,等待实例warmup:

image-20221008215234067

warmup完成后,等待ELB的health check通过:

image-20221008215259820

image-20221008215330884

当health check通过后,进入下一轮的滚动更新:

image-20221008215450918

最后等所有实例更新完成后,访问ELB能够刷新到v2版本的效果:

image-20221008221833041