如何替换 AWS Auto Scaling 组中的特定实例?

How can I replace a specific instance in an AWS Auto Scaling Group?

我正在寻找可用于 替换 AWS 规模组中特定实例的过程,同时保持 AZ "balance" 并且不减少容量在等待配置新实例时。

有时,我们可能有理由终止规模组中的特定 EC2 实例,并且一直在努力寻找一个有效的程序来执行此操作。我知道我可以直接终止实例并将其替换,但这会在等待新实例供应时暂时降低规模组的整体容量。在我们的例子中,这是几十分钟,因为我们必须在 ALB 可以发送请求之前设置和部署我们的软件

如果我们将 desired_capacity 增加 1,我们可以提前准备一个新实例 - 但不能保证它会在与我们希望终止的实例相同的 AZ 中创建。此外,如果我终止有问题的实例,并立即减少 desired_capacity scalegroup 会终止另一个实例吗?

那么管理此程序的最佳方法是什么?

暂时可以suspend and resume specific scaling processes。使用此功能,您可以通过多种方式获得所需的结果,我在下面介绍了其中两种方式:

A:使用 Auto Scaling Group 的再平衡功能

  1. 将 Auto Scaling Group 的所需实例数增加 1 并等待新实例可用
  2. 暂时中止 Launch 缩放过程(这会阻止在下一步中自动启动新实例)
  3. 终止故障实例
  4. 将 Auto Scaling Group 的所需实例数减少 1(所需实例数和实际实例数现在应该再次同步)
  5. 恢复 Launch 缩放过程。如果剩余实例不平衡,Auto Scaling Group 的 AZRebalance 进程将选择它并逐渐在 AZ 之间重新平衡。

B:在所需的AZ中显式启动一个新实例:

  1. 在所需的 AZ 中启动一个单独的实例
  2. 暂时中止Terminate缩放过程] (这可以防止在下一步中自动终止附加实例)
  3. 将 (1.) 中的实例附加到 Auto Scaling 组
  4. 终止原始实例(所需实例数和实际实例数现在应该再次同步)
  5. 恢复 Terminate 缩放过程

Auto Scaling 提供以下功能:

  • Attach Auto Scaling 组的特定实例(在 Auto Scaling 之外创建)
  • Detach Auto Scaling 组中的特定实例
  • Terminate Auto Scaling 组中的特定实例
  • Temporarily 将 Auto Scaling 组中的实例置于 备用状态

当分离、终止或置于备用时,Auto Scaling 组的 Desired Capacity 可以自动递减,因此没有替换实例已启动,或者可以保持不变以便启动替换实例。

让 Auto Scaling 启动任何新实例通常是个好主意,这样所有实例都是相同的。因此,如果您担心容量下降,那么您应该 增加 Desired Capacity 以启动新实例,然后 终止不需要的实例 Auto Scaling 组的容量减少到 return 该组到以前的 Desired Capacity。

你是正确的,启动的实例将不能保证与被删除的实例在同一个 AZ 中。 Auto Scaling 旨在 平衡可用区 。它将在实例数最少的 AZ 中启动一个实例。假设有两个具有相同数量实例的可用区,您希望从可用区 A 中删除一个实例。增加所需容量可能会在可用区 B 中启动一个实例。删除不需要的实例后,这意味着可用区 B比AZ A多两个实例。这是否是一个问题取决于Auto Scaling组中的实例总数。

建议使用多个 AZ 是为了处理 AZ 可能发生故障的情况。此类故障将导致实例暂时丢失,同时 Auto Scaling 在剩余可用区中启动新实例。如果担心这种下降,建议 运行 额外的实例来处理临时容量下降。因此,return针对您的问题,您的 Auto Scaling 组 应该有足够的容量来处理一个被删除和替换的实例 。如果容量暂时下降会影响您的系统,那么启动额外的实例是个好主意,前提是实例 can/will 偶尔会失败。这也有助于 AZ 发生故障的罕见情况,因为拥有额外容量意味着系统不会立即损失所需最小容量的 50%。

底线: 有足够的容量,以便临时替换坏实例不会对系统产生重大影响。与如果仅持续部署最小容量而在可用区中断中损失 50% 的容量的影响相比,对不平衡可用区的担忧将是次要的(可用区之间最多 2 个不同的实例)。

归根结底,真正归结为成本与风险。使用2个以上的可用区可以减少可用区中断的影响。