Amazon EC2 Auto Scaling 容量再平衡 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon EC2 Auto Scaling 容量再平衡

您可以配置 Amazon EC2 Auto Scaling 以监控并自动响应影响竞价型实例可用性的更改。容量再平衡功能可在运行中的实例被 EC2 中断之前,主动使用新的 Spot 实例扩展您的队列,从而帮助您维护工作负载的可用性。

工作原理

Amazon EC2 Auto Scaling 知道 EC2 实例重新平衡建议通知。当竞价型实例中断风险较高时,Amazon EC2 竞价服务会发出这些通知。为 Auto Scaling 组启用容量再平衡后,Amazon EC2 Auto Scaling 将尝试主动替换已收到再平衡建议的组中的 Spot 实例,从而使您有机会将工作负载再平衡到不处于较高风险的新 Spot 实例中断。这意味着,当 Amazon EC2 Auto Scaling 在现有实例中断之前启动新的竞价型实例时,您的工作负载可以继续处理该工作。您还可以选择使用生命周期钩子在终止之前对实例执行自定义操作。

有关 EC2 实例再平衡建议的更多信息,请参阅EC2 实例再平衡建议中的适用于 Linux 实例的 Amazon EC2 用户指南

有关容量重新平衡功能的详细信息和演练,请参阅博客文章使用用于 EC2 Auto Scaling 的新容量重新平衡功能主动管理竞价型实例生命周期上的Amazon计算博客博客。

注意

如果禁用容量重新平衡,Amazon EC2 Auto Scaling 将在 Amazon EC2 竞价服务中断实例且其运行状况检查失败后替换竞价型实例。Amazon EC2 始终在实例中断之前提供 EC2 实例重新平衡建议和两分钟竞价实例中断通知。

启用容量再平衡

您可以随时启用或禁用容量再平衡。

注意事项

此配置需考虑以下事项:

  • 我们建议您将 Auto Scaling 组配置为使用多个实例类型。这提供了在每个可用区内的各种 Spot 实例池中启动实例的灵活性,如Auto Scaling 组包括多种实例类型和购买选项

  • 我们强烈建议您只使用容量再平衡功能与capacity-optimizedcapacity-optimized-prioritized分配策略. 这些分配策略将在最佳竞价池中保持您的竞价容量,用于横向扩展事件和容量重新平衡启动。

  • 您应尽可能在区域内的所有可用区中创建 Auto Scaling 组。这是为了使 Amazon EC2 Auto Scaling 能够查看每个可用区域中的可用容量。如果在一个可用区域中启动失败,Amazon EC2 Auto Scaling 会继续尝试跨指定可用区启动竞价型实例,直到成功为止。

  • 通过使用容量再平衡,Amazon EC2 Auto Scaling 的行为方式如下:

    启动新实例时,Amazon EC2 Auto Scaling 会等待新实例通过运行状况检查,然后继续终止旧实例。替换多个实例时,每个旧实例的终止将在新实例启动并通过其运行状况检查后开始。因为 Amazon EC2 Auto Scaling 尝试在终止旧实例之前启动新实例,所以达到或接近指定的最大容量可能会阻碍或完全停止再平衡活动。为避免此问题,Amazon EC2 Auto Scaling 可以在再平衡活动期间暂时超出组的指定最大容量。

    • 如果新实例无法启动或启动但运行状况检查失败,Amazon EC2 Auto Scaling 将继续尝试重新启动它们。当它尝试启动新实例时,您的旧实例最终将被中断并强制终止。

    • 如果正在进行扩展活动,并且您的 Auto Scaling 组低于其新的所需容量,则 Amazon EC2 Auto Scaling 先向外扩展,然后再终止旧实例。

  • 在启用容量重新平衡以尝试正常关闭接收重新平衡通知的实例中的应用程序时,您可以为 Auto Scaling 组配置终止生命周期钩子,然后在 Amazon EC2 Auto Scaling 终止实例之前。如果您没有配置生命周期钩子,Amazon EC2 Auto Scaling 将在新实例通过运行状况检查后立即终止旧实例。

  • 使用容量重新平衡时,您的应用程序应该能够容忍某些中断,以防止应用程序中断。当实例开始终止时,Amazon EC2 Auto Scaling 将等待实例终止。如果 Auto Scaling 组位于 Elastic Load Balancing 器后面,Amazon EC2 Auto Scaling 将等待实例从负载均衡器中取消注册,然后再调用终止生命周期挂钩(如果已配置)。如果耗尽连接和运行生命周期钩子的时间过长,则当 Amazon EC2 Auto Scaling 等待实例终止时,实例可能会中断。

  • 如果实例收到最后两分钟的中断通知,Amazon EC2 Auto Scaling 会调用终止生命周期钩子并尝试立即启动替换。

启用容量再平衡(控制台)

您可以在创建或更新 Auto Scaling 组时启用或禁用容量重新平衡。

为新的 Auto Scaling 组启用容量重新平衡的步骤

按照中的说明进行操作Auto Scaling 组包括多种实例类型和购买选项以创建新的 Auto Scaling 组。创建 Auto Scaling 组时,请在向导的步骤 2 中配置实例购买选项和网络设置。要为 Auto Scaling 组指定其他设置,包括实例分配设置、竞价分配设置、容量重新平衡以及 Amazon EC2 Auto Scaling 可以启动的实例类型,请选择组合购买选项和实例类型

实例分配部分中,您可以选择是否启用容量重新平衡,方法是选择或清除容量再平衡”复选框。默认情况下,在使用控制台创建的 Auto Scaling 组上启用此设置,当竞价分配策略设置为容量优化


                    这些区域有:容量再平衡” 复选框

为现有 Auto Scaling 组启用容量重新平衡的步骤

  1. 以下网址打开 Amazon EC2 Auto Scaling 控制台:https://console.aws.amazon.com/ec2autoscaling/

  2. 选中 Auto Scaling 组旁边的复选框。

    拆分窗格将在Auto Scaling 组” 页面上,显示有关所选组的信息。

  3. 在存储库的详细信息选项卡上,选择购买选项和实例类型编辑

  4. 实例分配部分中,执行以下操作:

    • 要启用容量重新平衡,请选择容量再平衡”复选框。

    • 要禁用容量重新平衡,请清除容量再平衡”复选框。

  5. 选择 Update

启用容量再平衡 (Amazon CLI)

以下示例演示如何使用Amazon CLI以启用和禁用容量重新平衡。

使用create-auto-scaling-group或者update-auto-scaling-group命令,其中包含以下参数:

  • --capacity-rebalance/--no-capacity-rebalance— 指示是否启用容量再平衡的布尔值。

在调用create-auto-scaling-group命令时,您需要配置为与 Auto Scaling 组结合使用的启动模板的名称。有关更多信息,请参阅 为 Auto Scaling 组创建启动模板

注意

以下过程演示如何使用 JSON 或 YAML 格式化的配置文件。如果您使用Amazon CLI版本 1,必须指定 JSON 格式的配置文件。如果您使用Amazon CLI版本 2,您可以指定以 YAML 或 JSON 格式化的配置文件。

创建和配置新的 Auto Scaling 组

  • 请使用以下:create-auto-scaling-group命令创建新的 Auto Scaling 组并启用容量重新平衡,引用 JSON 文件作为 Auto Scaling 组的唯一参数。

    aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json

    如果您还没有指定混合实例策略中,创建一个。

    将以下行添加到配置文件中的顶级 JSON 对象。

    { "CapacityRebalance": true }

    下面是一个 config.json 示例文件。

    { "AutoScalingGroupName": "my-asg", "DesiredCapacity": 12, "MinSize": 12, "MaxSize": 15, "CapacityRebalance": true, "MixedInstancesPolicy": { "InstancesDistribution": { "OnDemandBaseCapacity": 0, "OnDemandPercentageAboveBaseCapacity": 25, "SpotAllocationStrategy": "capacity-optimized" }, "LaunchTemplate": { "LaunchTemplateSpecification": { "LaunchTemplateName": "my-launch-template", "Version": "$Default" }, "Overrides": [ { "InstanceType": "c5.large" }, { "InstanceType": "c5a.large" }, { "InstanceType": "m5.large" }, { "InstanceType": "m5a.large" }, { "InstanceType": "c4.large" }, { "InstanceType": "m4.large" }, { "InstanceType": "c3.large" }, { "InstanceType": "m3.large" } ] } }, "TargetGroupARNs": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-alb-target-group/943f017f100becff", "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782" }

创建和配置新的 Auto Scaling 组

  • 请使用以下:create-auto-scaling-group命令创建新的 Auto Scaling 组并启用容量重新平衡,引用 YAML 文件作为 Auto Scaling 组的唯一参数。

    aws autoscaling create-auto-scaling-group --cli-input-yaml file://~/config.yaml

    将以下行添加到您的 YAML 格式化的配置文件。

    CapacityRebalance: true

    下面是一个 config.yaml 示例文件。

    --- AutoScalingGroupName: my-asg DesiredCapacity: 12 MinSize: 12 MaxSize: 15 CapacityRebalance: true MixedInstancesPolicy: InstancesDistribution: OnDemandBaseCapacity: 0 OnDemandPercentageAboveBaseCapacity: 25 SpotAllocationStrategy: capacity-optimized LaunchTemplate: LaunchTemplateSpecification: LaunchTemplateName: my-launch-template Version: $Default Overrides: - InstanceType: c5.large - InstanceType: c5a.large - InstanceType: m5.large - InstanceType: m5a.large - InstanceType: c4.large - InstanceType: m4.large - InstanceType: c3.large - InstanceType: m3.large TargetGroupARNs: - arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-alb-target-group/943f017f100becff VPCZoneIdentifier: subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782

为现有 Auto Scaling 组启用容量重新平衡的步骤

  • 请使用以下:update-auto-scaling-group命令启用容量重新平衡。

    aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \ --capacity-rebalance

验证是否为 Auto Scaling 组启用了容量重新平衡

  • 请使用以下:describe-auto-scaling-groups命令验证是否启用了容量重新平衡并查看详细信息。

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg

    以下为响应示例。

    { "AutoScalingGroups": [ { "AutoScalingGroupName": "my-asg", "AutoScalingGroupARN": "arn", ... "CapacityRebalance": true } ] }

禁用容量再平衡

使用update-auto-scaling-group命令,其中包含--no-capacity-rebalance选项以禁用容量重新平衡。

aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \ --no-capacity-rebalance

添加终止生命周期挂钩

启用容量再平衡时请考虑配置终止生命周期挂钩,以便您可以在实例终止之前对实例运行代码并执行自定义操作。

您可能使用终止生命周期挂钩的原因包括:

  • 将系统或应用程序日志上传到 Amazon Simple Storage Service (Amazon S3)

  • 用于正常关闭 Amazon SQS 工作人员

  • 完成从域名系统 (DNS) 撤销注册

如果您还没有终止生命周期挂钩,请使用以下步骤创建。

添加终止生命周期挂钩

  1. 以下网址打开 Amazon EC2 Auto Scaling 控制台:https://console.aws.amazon.com/ec2autoscaling/

  2. 选中 Auto Scaling 组旁边的复选框。

    拆分窗格将在Auto Scaling 组” 页面上,显示有关所选组的信息。

  3. Instance management (实例管理) 选项卡的 Lifecycle hooks (生命周期挂钩) 中,选择 Create lifecycle hook (创建生命周期挂钩)

  4. 要定义生命周期挂钩,请执行以下操作:

    1. 对于 Lifecycle hook name (生命周期挂钩名称),请指定生命周期挂钩的名称。

    2. 适用于生命周期转换中,选择实例终止

    3. 适用于检测信号超时中,指定完成生命周期操作所需的时间量(以秒为单位),或直到超时期结束。我们建议您使用 30 秒到 120 秒的值,具体取决于您需要关闭应用程序的时间。

    4. 适用于默认结果中,请指定生命周期挂钩超时结束时或发生意外故障时 Auto Scaling 组执行的操作。放弃和继续都允许终止实例。

      • 如果您选择继续,则 Auto Scaling 组可以在终止之前继续执行任何剩余操作(例如,其他生命周期挂钩)。

      • 如果选择 “放弃”,Auto Scaling 组将立即终止实例。

    5. (可选)对于通知元数据中,请指定您希望在 Amazon EC2 Auto Scaling 向Amazon Lambda函数或您在步骤 6 中配置的另一个目标。

  5. 选择创建

  6. (可选)要向生命周期挂钩添加操作,请请遵循以下步骤配置Amazon Lambda函数或其他目标。否则,要使 EC2 实例自动运行操作,您必须将其配置为运行脚本。我们建议您为关闭序列编写脚本,以便在一到两分钟内完成,以确保在实例终止之前有足够的时间完成任务。

有关更多信息,请参阅 Amazon EC2 Auto Scaling 生命周期挂钩