Amazon EC2 Auto Scaling 与 EC2 Spot 实例

概述

在本教程中,您将学习如何使用 Amazon EC2 Auto Scaling 和启动模板创建无状态、容错工作负载,以请求 Amazon EC2 Spot 实例。Amazon EC2 Auto Scaling 允许创建称为 Amazon EC2 Auto Scaling 组 (ASG) 的实例集合,并根据基于特定应用程序的需求定义的扩缩策略,维护、纵向扩展或纵向缩减所需的实例数量。 

Amazon EC2 Spot 实例是可用的备用容量,与 EC2 按需型的价格相比,具有很低的折扣,通常在 70% 到 90% 之间。当备用容量不再可用时,EC2 Spot 实例会在两分钟内中断。使用 EC2 Spot 实例的应用程序应为无状态、容错和松耦合,这一点很重要。实例应为临时实例,因此可以根据需要轻松删除和替换。在本教程中,我们会通过创建 AWS 应用程序负载均衡器,并结合使用 Amazon EC2 Auto Scaling,来根据需要添加和删除实例。教程中也将使用启动模板和采用容量优化的分配策略,该策略将通过分析容量指标,从可用性最高的 Spot 实例池自动预配 EC2 Spot 实例。

完成的目标

在本教程中,您将创建:

  • 负载均衡器和安全组
  • Amazon EC2 Auto Scaling 组的启动模板
  • Amazon EC2 Auto Scaling 组 

完成这些步骤后,您将监控和测试 Auto Scaling 组。

前期准备

本教程需要使用您 AWS 账户的默认 VPC。如果您的账户没有默认 VPC,则可以使用自己的 VPC。如果您使用自己的 VPC,要创建的 AWS 应用程序负载均衡器必须配置为使用公有子网,且 EC2 实例必须位于分配有公共 IP 地址的同一公有子网中,或者位于配置有 NAT 网关的私有子网中,以允许出站互联网访问。我们建议您在使用的 AWS 区域中将 VPC 映射到每个可用区,以帮助最大限度地增加可用于 Amazon EC2 Auto Scaling 的 Spot 容量池数量。

 AWS 使用经验

中级

 完成所需时间

10 – 20 分钟

 所需费用

低于 3 美元

 前提条件

*在过去 24 小时内新创建的账户可能无法使用本教程所需的服务。

 上次更新时间

2023 年 2 月 8 日

操作步骤

步骤 1:创建负载均衡器和安全组

1.1 — 登录 AWS 控制台并打开 AWS 应用程序负载均衡器控制台。我们将创建一个 AWS 应用程序负载均衡器以及一个新的安全组,在本教程的其余部分中,我们的示例工作负载将使用这两者。点击 Create load balancer(创建负载均衡器)。

负载均衡会将 HTTP 请求分发到 Amazon EC2 Spot 实例集,将在本教程后面部分创建该实例集。

1.2 — 点击 Application Load Balancer(应用程序负载均衡器)部分中的 Create(创建)按钮。

1.3 — 为负载均衡器命名。将 Scheme(方案)设置为 Internet-facing(面向互联网)并将 IP address type(IP 地址类型)设置为 IPv4。选择默认 VPC 或其他符合本教程要求的 VPC。从列表中选择每个可能的可用区,并确保只选择公有子网。根据区域和 VPC 的配置,子网数量会有所不同。

1.4 — 选择 Create new security group(创建新的安全组),此时将打开一个新的 VPC-Security Group(VPC 安全组)窗口。对于本教程,添加一个入站规则,允许所有 HTTP/80 流量。选择 Create security group(创建安全组)并记下安全组名称,因为该名称将在接下来的步骤中使用。

1.5 — 返回 Load balancer(负载均衡器)控制台,选择新创建的安全组,并将侦听器 Protocol(协议)保留为 HTTP,将 Port(端口)保留为 80。

点击 Create target group(创建目标组)以创建新的目标组。

1.6 — Create target group(创建目标组)窗口中,将目标类型保留为 Instances(实例),指定目标组名称,并将 Protocol(协议)保留为 HTTP,将端口保留为 80。

对于 VPC,选择 default(默认值),对于 Protocol version(协议版本),选择 HTTP1

对于 Health checks(运行状况检查),将协议保留为 HTTP,将路径保留为 /

展开 Advanced health check settings(高级运行状况检查设置),并将 Healthy threshold(正常阈值)更改为 2,将 Interval(时间间隔)设置为 10。保持其他设置不变。这将有助于加快我们后续的测试。

点击 Next(下一步)。

1.7 — Register targets(注册目标)部分中,保持默认设置,然后点击 Create target group(创建目标组)。

1.8 — Load balancer(负载均衡器)控制台中,输入刚刚创建的目标组,检查配置后,点击 Create load balancer(创建负载均衡器)。

步骤 2:为 Amazon EC2 Auto Scaling 组创建启动模板

2.1 — 打开 Amazon EC2 Auto Scaling 控制台。仔细查看任何横幅,如果您仍在使用旧控制台,请使用提供的横幅链接切换到新的 EC2 控制台。进入新控制台后,点击 Create Auto Scaling group(创建 Auto Scaling 组)。

2.2 — 启动模板包括启动 Amazon EC2 实例所需的参数,例如,Amazon 机器镜像 (AMI) 的 ID 和实例类型。要创建 Amazon EC2 Auto Scaling 组,需要启动模板或启动配置。我们将使用启动模板,因为相比使用启动配置具有很多改进。要更好地了解启动模板的好处,请参见从启动模板启动实例。点击接近页面底部的 Create a launch template(创建启动模板)链接。将在浏览器中打开一个新标签页。

2.3 — 输入此模板的 Launch template name(启动模板名称)和 Template version description(模板版本说明)。您可以提供自己的名称和说明,也可以使用示例中的命名。另请注意,Auto Scaling guidance(Auto Scaling 指导)下的复选框已选中,并应保持选中状态。

2.4 — 此启动模板需要几个项目。第一个是 Amazon 机器镜像 (AMI)。对于本教程,选择 Amazon Linux 2 AMI (HVM), SSD Volume Type(Amazon Linux 2 AMI (HVM),SSD 卷类型)。确保选择 x86 版本,而不是 ARM。

向下滚动到 Network settings(网络设置),然后选择在步骤 1 中为应用程序负载均衡器创建的安全组

花点时间检查启动模板中提供的所有选项。对于本教程,除了最后一个项目 Advanced details(高级详细信息)外,所有其余项目都可以保留默认选择 Don’t include in launch template(不包括在启动模板中)。

2.5 — 展开 Advanced details(高级详细信息)部分,滚动到底部,找到 User data(用户数据)部分。请勿选中 Request Spot Instances(请求 Spot 实例)复选框,我们将在后面的步骤中设置 Auto Scaling 时选择并启用 Spot 实例。

将以下文本复制并粘贴到 User data(用户数据)字段:

#!/bin/bash
 yum install httpd -y 
systemctl start httpd 
systemctl stop firewalld 
cd /var/www/html 
echo "this is my test site and the instance-id is " > index.html curl http://169.254.169.254/latest/meta-data/instance-id >> index.html

上述代码将创建一个简单的 Web 服务器,在查询时显示实例 ID。这将在以后测试 Auto Scaling 组时提供帮助。

点击 Create launch template(创建启动模板)。

此时将显示包含几个选项的确认界面,其中包括选项 Create an Auto Scaling group from your template(从模板创建 Auto Scaling 组)。请勿选择此选项,因为可能会启动旧版本的 Auto Scaling 控制台。本教程需要使用最新版本的控制台。关闭此浏览器标签页,然后继续执行步骤 3。

重要说明:实例必须位于提供出站互联网访问的子网中,可以是自动为实例分配公有 IPv4 地址的公有子网,也可以是配置了 NAT 网关的私有子网。否则,Web 服务器将无法下载和安装,从而导致在测试时负载均衡器出现 502 Bad Gateway 问题。

步骤 3:创建 Amazon EC2 Auto Scaling 组 — 启动模板、实例和网络子网选择

3.1 — 返回起初的 Create Auto Scaling group(创建 Auto Scaling 组)浏览器标签页。输入 Auto Scaling 组的名称。自行命名或填入提供的示例名称均可。

3.2 — Launch template(启动模板)框中点击刷新按钮,然后选择在步骤 2 中创建的模板。选择后,将显示有关模板的其他详细信息。将 Version(版本)从 Default (1)(默认 (1))更改为 Latest (1)(最新 (1))。这项更改意味着,只要更新此启动模板并在将来创建新版本,Auto Scaling 组就会对下一个需要启动的实例自动开始使用最新版本。这是一项强大的功能,例如,有助于非常轻松地更新 Amazon 机器镜像 (AMI)。

完成后,点击 Next(下一步)。

3.3 — 选择在其中创建负载均衡器的同一 VPC,然后选择公有子网或配置了 NAT 网关的私有子网。选择尽可能多的子网以实现最大程度的实例多样性。

在本例中,总共选择了四个可用区(使用公有子网)。选择的可用区越多越好,因为可以访问更多的 Spot 实例池。这将减少 Spot 中断的影响,因为每个池都完全独立于任何其他池。

3.4 —Instance type requirements(实例类型要求)中,选中 Specify instance attributes(指定实例属性)选项,以使用基于属性的实例类型选择。这样,当为 EC2 实例预配 ASG、EC2 实例集或 Spot 实例集时,可以将实例类型需求表示为一组属性,例如 vCPU、内存和存储。

在本例中,我们指定了最小和最大 vCPU 和内存限制。可以在 Additional instance attributes(其他实例属性)部分中设置更具体的属性。

3.5 — 在实例预览列表中,可以查看所选的实例类型,并调整在上一步中设置的属性筛选器,或继续。

3.6 — Instances distribution(实例分布)下,按需型实例和 Spot 实例将混合在同一个 Auto Scaling 组中,这也称为 MixedInstancesPolicy。有关更多信息,请参见 Amazon EC2 Auto Scaling API 参考。

由于应用程序是无状态、容错应用程序,并且可以处理中断的实例,因此将主要使用 Spot 实例,而使用少量的按需型实例进行均衡。将 % On-Demand(按需型百分比)设置为 10%。完成后,% Spot(Spot 百分比)将自动调整为 90%。可以根据需要进行调整,只要混合使用两者即可。

请注意,还有一个关于 Spot allocation strategy(Spot 分配策略)的部分。系统已自动选中 Price capacity optimized(价格容量优化)分配策略,建议对几乎所有应用程序都使用该策略。有关此功能的更多信息,请阅读这篇博客文章

此外,保持 Capacity rebalance(容量重新均衡)选项处于选中状态,以使用重新均衡通知实现 Spot 实例的高可用性。

点击 Next(下一步)。

步骤 4:创建 Amazon EC2 Auto Scaling 组 — 负载均衡和扩缩策略

4.1 —Load balancing(负载均衡)部分中,选中 Attach to an existing load balancer(附加到现有负载均衡器)。在 Attach to an existing load balancer(附加到现有负载均衡器)部分中,选中 Choose from your load balancer target groups(从您的负载均衡器目标组中进行选择)。选择在步骤 1 中为负载均衡器创建的目标组。

Health checks(运行状况检查)部分中,将 Health check grace period(运行状况检查宽限期)降低至 120 秒,这将有助于加快测试。每个启动的实例都将自动安装并启动一个简单的 Web 服务器,通常启动速度很快。

将其他设置保留为默认设置,然后点击 Next(下一步)。

4.2 — Desired capacity(所需容量)设置为 12,将 Minimum capacity(最小容量)设置为 6 并将 Maximum capacity(最大容量)设置为 12。这些设置建立了防护机制,并确保我们的 Auto Scaling 组受这些防护机制的保护。

Desired capacity(所需容量)是我们开始时将使用的实例数量,但由于我们接下来要设置的扩缩策略,您会将看到此值缩减到 Minimum capacity(最小容量),即六个实例。

4.3 — 选中 Target tracking scaling policy(目标跟踪扩缩策略)并将 Average CPU utilization(平均 CPU 利用率)保留为默认值 50%。当所有实例的平均 CPU 超过 50% 时,此策略将横向扩展,添加更多实例,当平均 CPU 低于此值时,此策略将横向缩减实例。当 Auto Scaling 确定 CPU 远低于 50% 时,您应该会看到发生这种情况,从 Desired capacity(所需容量)(12 个实例)横向缩减到 Minimum capacity(最小容量)(6 个实例)。

我们不会在本教程中设置任何实例横向缩减保护、通知或标签,因此可以选择 Skip to review(跳至检查)。

4.4 — 接下来会显示一个汇总页面,其中包含您刚刚设置的所有信息。请花点时间检查一下,不仅仅为了确保准确性,同时也浏览一下刚刚进行的所有配置。这是启动 EC2 实例之前的最后一步。确认无误后,点击 Create Auto Scaling group(创建 Auto Scaling 组)。

4.5 — 将创建 Auto Scaling 组,并显示包含实时更新的状态页面。

步骤 5:监控和测试 Auto Scaling 组

5.1 — Auto Scaling groups(Auto Scaling 组)控制台中选择您的 Auto Scaling 组的名称。

5.2 — 选择 Instance management(实例管理)选项卡,查看启动的项目,包括实例类型和可用区。您应该会看到实例在每个可用区中均匀分布。您可能会看到许多相同的实例类型,也可能会看到各种各样的实例类型,这说明 price capacity optimized(价格容量优化)在起作用,同时也是针对在每个可用区中启动哪些实例类型所做出决策的结果。

5.3 — 返回负载均衡器控制台。选择负载均衡器名称以查看其他详细信息。找到在步骤 1 中创建的负载均衡器的 DNS name(DNS 名称)。点击 A Record(A 记录)旁边的复制图标,将其复制到剪贴板,然后将其粘贴到 Web 浏览器中。

5.4 — 浏览器中将显示一个简单的网站。不断选择刷新按钮,每次刷新时,负载均衡器都会将您的请求发送到不同的实例。您应该会看到实例 ID 随每个请求而更改。这也被称为轮询负载均衡,属于默认设置。

5.5 — 体验一下 Auto Scaling 组吧。您可以模拟 Spot 中断,只需从 EC2 实例控制台中选择一些正在运行的实例并将其终止即可。只要有一些实例在运行,您的网站就能持续运转。EC2 Auto Scaling 将检测到实例已失败或已终止,并将其替换为全新实例,然后在很短的时间内自动将其重新添加到负载均衡器,同时在所有可用区之间保持均匀分布。

如果终止除某个实例之外的所有实例,会发生什么情况?如果终止全部实例呢?可以试一试,看看 Auto Scaling 的反应。这是为了说明 Auto Scaling 如何在实例因任何原因(如人为错误)而不再可用(而不仅仅是 EC2 Spot 中断)时保持应用程序运行。由于我们使用多个可用区和 EC2 Spot 池,并遵循多样化最佳实践,因此即使所有 EC2 Spot 实例同时中断也不足为惧。

提示:点击右上方的齿轮设置图标,向下滚动浏览 Instance Attributes(实例属性),然后选择 Lifecycle(生命周期)。点击 Confirm(确认)。请注意,现在可以通过向右滚动,轻松查看哪些实例是 Spot 实例。

5.6 — 返回 Auto Scaling groups(Auto Scaling 组)控制台,并查看 Activity(活动)历史记录,以查看采取的所有操作以及原因。

步骤 6:清理资源

6.1 — 尽管 Amazon EC2 Spot 实例的价格通常比按需型 EC2 实例低 70% 到 90%,但仍然最好在完成教程后清理和删除资源。此过程快速简单。

6.2 — 删除创建的 Auto Scaling group(Auto Scaling 组),这将自动终止该组当前管理的任何实例。要求确认时,输入 delete。几分钟后,该组将完全删除,并从控制台中消失。仔细检查 Instances(实例)控制台,确保没有任何资源仍在运行。

6.3 —Load balancers(负载均衡器)控制台中,删除创建的负载均衡器。要求确认时,输入 confirm。确认删除后,负载均衡器随即消失。

6.4 — 前往 Target groups(目标组)控制台(位于 Load balancer(负载均衡器)控制台正下方),然后删除创建的目标组。当您确认 Yes, delete(是,删除)后,它将立即消失。

6.5 — 最后,打开 Launch templates(启动模板)控制台(位于 Instances(实例)控制台的下方),然后删除您的启动模板。输入 Delete 进行确认后,该模板将消失。

6.6 — 您已经清理完毕,应该不会再产生任何费用。

结果

恭喜!!您已经学会了如何使用 EC2 Spot 实例和启动模板创建 Auto Scaling 组。实现负载均衡的 Auto Scaling 将使您的无状态、容错工作负载(如 Web 应用程序)即使在某些实例中断或遇到其他问题后也仍保持运行。您还学会了如何查看 Auto Scaling 所执行的操作。

此页内容对您是否有帮助?

后续步骤

在 Amazon EC2 Spot 实例上运行 Web 应用程序  

要了解有关使用 Spot 实例运行 Web 应用程序的更多信息,请查看此博客

Spot 实例研讨会  

想要了解更多关于 Spot 实例的信息吗?查看自助式 Spot 实例研讨会,了解更多关于 Spot 实例的其他使用场景。

探索 Amazon EC2 Spot 实例

如果您想了解更多关于 Amazon EC2 Spot 实例的信息,请访问 Amazon EC2 Spot 实例产品页面,浏览文档、视频、博客等。