Amazon ECS 托管实例耗尽了 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Amazon ECS 托管实例耗尽了

托管实例耗尽有助于优雅地终止 Amazon EC2 实例。这使您的工作负载可以安全停止并重新调度到非终止实例。基础架构维护和更新无需担心工作负载会中断。通过使用托管实例耗尽功能,您可以简化需要更换 Amazon EC2 实例的基础设施管理工作流程,同时确保应用程序的弹性和可用性。

Amazon ECS 托管实例耗尽与 Auto Scaling 组实例替换配合使用。根据实例更新和最长实例生命周期,客户可以确保其容量符合最新的操作系统和安全规定。

托管实例耗尽只能与 Amazon ECS 容量提供商一起使用,并且在使用 Amazon ECS 控制台或软件开发工具包创建或更新 Auto Scaling 组容量提供程序时启用。 Amazon CLI

Amazon ECS 托管实例耗尽涵盖了以下事件。

  • A@@ uto Scaling 组实例刷新-使用实例刷新来滚动替换 Auto Scaling 组中的 Amazon EC2 实例,而不是手动批量替换。当您需要替换大量实例时,这特别有用。实例刷新是通过 Amazon EC2 控制台或 StartInstanceRefresh API 启动的。StartInstanceRefresh如果您使用的是托管终止保护,请务必在拨打电话时选择Replace缩小保护。

  • 最长实例寿命-在替换 Auto Scaling 组实例时,您可以定义最长生命周期。这有助于根据内部安全策略或合规性安排替换实例。

  • Auto Scaling 组缩容-根据扩展策略和计划的扩展操作,Auto Scaling 组支持自动扩展实例。通过将 Auto Scaling 组与 Amazon ECS 容量提供程序配合使用(这有助于集群自动扩展),您可以在没有任务运行时缩小 Auto Scaling 组实例。

  • Auto Scaling 组运行状况检查-Auto Scaling 组支持许多运行状况检查,以管理不健康实例的终止。

  • Amazon CloudFormation 堆栈更新-您可以向中添加一个UpdatePolicy属性, Amazon CloudFormation 以便在组更改时执行滚动更新。

  • 竞价容量再平衡-Auto Scaling 组尝试根据 Amazon EC2 容量重新平衡通知主动替换中断风险较高的竞价型实例。当替换实例启动且运行正常时,Auto Scaling 组会终止旧实例。Amazon ECS 托管实例耗尽会耗尽正在终止的竞价型实例,就像耗尽非 Spot 实例一样。

  • Spot 中断-Spot 实例将在两分钟通知后终止。作为响应,Amazon ECS 托管的实例耗尽会使实例处于耗尽状态。

带托管实例耗尽@@ 的 Amazon EC2 Auto Scaling 生命周期挂钩

Auto Scaling 组生命周期挂钩使客户能够创建由实例生命周期中的某些事件触发的解决方案,并在该特定事件发生时执行自定义操作。一个 Auto Scaling 组最多允许 50 个挂钩。可以存在多个终止挂钩并行执行,Auto Scaling 组会等待所有挂钩完成后再终止实例。

除了 Amazon ECS 管理的挂钩终止外,您还可以配置自己的生命周期终止挂钩。生命周期挂钩有default action,我们建议continue将其设置为默认挂钩,以确保其他挂钩(例如 Amazon ECS 托管的挂钩)不会受到自定义挂钩的任何错误的影响。

如果您已经配置了 Auto Scaling 组终止生命周期挂钩并启用了 Amazon ECS 托管的实例耗尽功能,则两个生命周期挂钩都将执行。但是,不能保证相对时间。生命周期挂钩有一个default action设置,用于指定超时过后要采取的操作。如果出现故障,我们建议使用自定义挂钩中的默认结果continue作为默认结果。这样可以确保其他挂钩,尤其是 Amazon ECS 管理的挂钩,不会受到自定义生命周期挂钩中任何错误的影响。的替代结果abandon会导致跳过所有其他钩子,因此应避免使用。

任务和托管实例耗尽

Amazon ECS 托管实例耗尽使用容器实例中的现有耗尽功能。容器实例耗尽功能对属于 Amazon ECS 服务的副本任务执行替换和停止。running处于pending或状态的独立任务(如由RunTask调用的任务)将不受影响。你必须等待它们完成或手动停止。容器实例将保持draining状态,直到所有任务都停止或 48 小时过去为止。所有副本任务都停止后,守护程序任务是最后一个停止的任务。

托管实例耗尽和托管终止保护

由于 Amazon ECS 托管实例耗尽便于正常耗尽 Amazon EC2 实例,因此它可以防止您的应用程序因任何终止事件而中断。即使禁用了托管终止,托管实例耗尽也便于正常关闭正在缩减的实例的 Amazon ECS 服务任务。

下表汇总了管理终止和托管排水的不同组合的行为。

管理式终止

管理排水

结果

已启用

已启用 Amazon ECS 可保护正在运行任务的 Amazon EC2 实例不被缩减事件终止。任何正在终止的实例,例如未设置终止保护、已接受 Spot 中断或因实例刷新而被迫终止的实例,都会被优雅地耗尽。

已禁用

已启用 Amazon ECS 无法保护运行任务的 Amazon EC2 实例免遭缩容。但是,任何正在终止的实例都会被优雅地耗尽。

已启用

已禁用 Amazon ECS 可保护正在运行任务的 Amazon EC2 实例不被缩减事件终止。但是,实例仍可能因竞价中断或强制实例刷新或未运行任何任务而终止。Amazon ECS 不会对这些实例进行正常排空,并在它们停止后启动替换服务任务。

已禁用

已禁用 Amazon EC2 实例可以随时缩减或终止,即使它们正在运行 Amazon ECS 任务也是如此。Amazon ECS 将在替换服务任务停止后启动这些任务。
托管实例耗尽和 Spot 实例耗尽

当 Amazon ECS 竞价型实例耗尽时,您可以在 Amazon ECS 代理ECS_ENABLE_SPOT_INSTANCE_DRAINING上设置一个环境变量,这样 Amazon ECS 就可以将实例置于耗尽状态,以应对两分钟的竞价中断。Amazon ECS 托管实例耗尽有助于顺利关闭因多种原因而终止的 Amazon EC2 实例,而不仅仅是竞价中断。例如,您可以使用 Amazon EC2 Auto Scaling 容量再平衡来主动替换中断风险较高的竞价型实例,托管实例耗尽会正常关闭被替换的竞价型实例。当您使用托管实例耗尽时,您无需单独启用 Spot 实例耗尽,因此ECS_ENABLE_SPOT_INSTANCE_DRAINING在 ASG 中,用户数据是多余的。

Amazon ECS 托管实例耗尽故障排除

Amazon ECS 托管实例耗尽事件会发布到亚马逊 EventBridge,Amazon ECS 会在您的账户的默认总线中创建托 EventBridge 管规则以支持托管实例耗尽。您可以将这些事件筛选到 Lambda、Amazon SNS 和 Amazon SQS 等其他 Amazon 服务,以进行监控和故障排除。

  • Amazon EC2 Auto Scaling 会在调用生命周期 EventBridge 挂钩时向其发送一个事件。

  • 现场中断通知已发布到 EventBridge.

  • 如果在配置耗尽资源的托管实例时出现任何故障,Amazon ECS 会生成错误消息,这些消息可以在 Amazon ECS 控制台和 API 上检索。

  • EventBridge 内置了重试机制,可以缓解临时故障。

使用 Amazon ECS 托管实例耗尽资源

使用 Amazon ECS 控制台创建或更新 Auto Scaling 组容量提供程序时,您可以启用托管实例耗尽功能。 Amazon CLI

注意

创建容量提供商时,托管实例耗尽功能默认处于启用状态。

以下是使用创建启用托管实例耗尽的容量提供程序以及 Amazon CLI 为集群的现有容量提供程序启用托管实例耗尽的示例。

创建启用托管实例耗尽功能的容量提供商

要创建启用托管实例耗尽功能的容量提供程序,请使用create-capacity-provider命令。

aws ecs create-capacity-provider \ --name capacity-provider \ --auto-scaling-group-provider '{ "autoScalingGroupArn": "asg-arn", "managedScaling": { "status": "ENABLED", "targetCapacity": 100, "minimumScalingStepSize": 1, "maximumScalingStepSize": 1 }, "managedDraining": "ENABLED", "managedTerminationProtection": "ENABLED", }'

响应:

{ "capacityProvider": { "capacityProviderArn": "capacity-provider-arn", "name": "capacity-provider", "status": "ACTIVE", "autoScalingGroupProvider": { "autoScalingGroupArn": "asg-arn", "managedScaling": { "status": "ENABLED", "targetCapacity": 100, "minimumScalingStepSize": 1, "maximumScalingStepSize": 1 }, "managedTerminationProtection": "ENABLED" "managedDraining": "ENABLED" } } }
为集群的现有容量提供商启用托管实例耗尽功能

使用update-capacity-provider命令为集群的现有容量提供商启用托管实例耗尽功能。你会看到managedDraining目前的说法DISABLEDupdateStatus说法UPDATE_IN_PROGRESS

aws ecs update-capacity-provider \ --name cp-draining \ --auto-scaling-group-provider '{ "managedDraining": "ENABLED" }

响应:

{ "capacityProvider": { "capacityProviderArn": "cp-draining-arn", "name": "cp-draining", "status": "ACTIVE", "autoScalingGroupProvider": { "autoScalingGroupArn": "asg-draining-arn", "managedScaling": { "status": "ENABLED", "targetCapacity": 100, "minimumScalingStepSize": 1, "maximumScalingStepSize": 1, "instanceWarmupPeriod": 300 }, "managedTerminationProtection": "DISABLED", "managedDraining": "DISABLED" // before update }, "updateStatus": "UPDATE_IN_PROGRESS", // in progress and need describe again to find out the result "tags": [ ] } }

使用describe-clusters命令并包含ATTACHMENTS。托管实例status的耗尽附件是PRECREATED,总体上attachmentsStatusUPDATING

aws ecs describe-clusters --clusters cluster-name --include ATTACHMENTS

响应:

{ "clusters": [ { ... "capacityProviders": [ "cp-draining" ], "defaultCapacityProviderStrategy": [], "attachments": [ # new precreated managed draining attachment { "id": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111", "type": "managed_draining", "status": "PRECREATED", "details": [ { "name": "capacityProviderName", "value": "cp-draining" }, { "name": "autoScalingLifecycleHookName", "value": "ecs-managed-draining-termination-hook" } ] }, ... ], "attachmentsStatus": "UPDATING" } ], "failures": [] }

更新完成后,使用describe-capacity-providers,你看到的managedDraining就是现在ENABLED

aws ecs describe-capacity-providers --capacity-providers cp-draining

响应:

{ "capacityProviders": [ { "capacityProviderArn": "cp-draining-arn", "name": "cp-draining", "status": "ACTIVE", "autoScalingGroupProvider": { "autoScalingGroupArn": "asg-draning-arn", "managedScaling": { "status": "ENABLED", "targetCapacity": 100, "minimumScalingStepSize": 1, "maximumScalingStepSize": 1, "instanceWarmupPeriod": 300 }, "managedTerminationProtection": "DISABLED", "managedDraining": "ENABLED" // successfully update }, "updateStatus": "UPDATE_COMPLETE", "tags": [] } ] }