本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon ECS 集群自动扩展
重要
自 2022 年 5 月 27 日起,Amazon ECS 更改了促进集群自动扩展的资源的管理方式。要了解更多信息,请参阅 更新 Amazon ECS 为集群自动扩缩创建资源的方式。
Amazon ECS 可以管理注册到您的集群的 Amazon EC2 实例的扩展。这被称为亚马逊 ECS集群自动扩展。这是通过使用 Amazon ECS Auto Scaling 组容量提供商来完成的托管扩展开启。当您使用开启托管扩展的 Auto Scaling 组容量提供程序时,您可以设置目标百分比(targetCapacity
)用于了解此 Auto Scaling 组中实例的利用率。亚马逊 ECS 创建了两个自定义 CloudWatch 指标和附加到您的 Auto Scaling 组的目标跟踪扩展策略。然后,Amazon ECS 会根据您的任务从该容量提供商处使用的资源利用率来管理 Auto Scaling 组的缩小和向外扩展操作。有关自动扩缩组容量提供程序的更多信息,请参阅 亚马逊 EC2 自动扩展组容量提供商。
注意
仅当使用 自动扩缩组容量提供程序时才支持 Amazon ECS 集群自动扩缩。对于托管在 Amazon Fargate 上的 Amazon ECS 工作负载,请参阅 Amazon Fargate 容量提供程序。
集群自动伸缩的工作原理
集群自动扩展设置
以下是您使用 Amazon ECS 集群自动扩展的工作流程。有关更多信息,请参阅开启集群自动扩展:
-
创建 Auto Scaling 组。
-
创建使用该 Auto Scaling 组的容量提供商。
-
为容量提供商开启托管扩展。
-
将容量提供程序与集群相关联。
-
使用容量提供者策略运行任务或创建服务,该策略使用容量提供程序。
容量提供程序策略确定任务在集群的容量提供程序之间的分布方式。运行独立任务或创建服务时,您可以使用集群的默认容量提供程序策略,也可以使用覆盖默认策略的容量提供程序策略。
-
(可选)为集群创建默认容量提供者策略。
集群自动伸缩资源
对于与集群关联的每个自动扩缩组容量提供程序,Amazon ECS 将创建和管理以下资源:
-
较低的指标值 CloudWatch 警报
-
较高的指标值 CloudWatch 警报
-
目标跟踪扩展策略
注意
Amazon ECS 创建目标跟踪扩展策略并将其附加到自动扩缩组。要更新目标跟踪扩展策略,应更新容量提供程序管理的扩展设置,而不是直接更新扩展策略。
当您关闭托管扩展或取消容量提供商与集群的关联时,Amazon ECS 会同时删除这两个提供商 CloudWatch 指标和目标跟踪扩展策略资源。
集群自动伸缩指标
以下指标有助于确定要采取的操作:
CapacityProviderReservation
-
特定容量提供商正在使用的集群容器实例的百分比。Amazon ECS 会生成此指标。
亚马逊 ECS 设置了
CapacityProviderReservation
值改为 0-100 之间的数字。Amazon ECS 使用以下公式来表示 Auto Scaling 组中剩余容量的比率。然后,亚马逊 ECS 将该指标发布到 CloudWatch。有关如何计算指标的更多信息,请参阅深入了解 Amazon ECS 集群自动扩展CapacityProviderReservation = (number of instances needed) / (number of running instances) x 100
DesiredCapacity
-
Auto Scaling 组的容量。
集群自动伸缩流程
Amazon ECS 会为与您的集群关联的每个容量提供商执行集群自动扩展流程。亚马逊 ECS 每分钟执行一次该过程。
亚马逊 ECS 发布了CapacityProviderReservation
公制到 CloudWatch 在Amazon/ECS/ManagedScaling
命名空间。CapacityProviderReservation
指标会导致以下操作之一:
- 的
CapacityProviderReservation
值等于targetCapacity
-
Auto Scaling 组不需要向内缩小或向外扩展。已达到目标利用率百分比。
- 的
CapacityProviderReservation
值大于targetCapacity
-
使用容量百分比的任务多于您的容量百分比
targetCapacity
百分比。增加的价值CapacityProviderReservation
指标导致相关的 CloudWatch 惊慌失措地采取行动。此告警会更新 自动扩缩组的DesiredCapacity
值。自动扩缩组使用此值启动 EC2 实例,然后向集群注册它们。当
targetCapacity
是默认值 100%,新任务位于PENDING
扩展期间的状态,因为实例上没有可用容量来运行任务。在新实例向 ECS 注册后,这些任务将在新实例上启动。 - 的
CapacityProviderReservation
值小于targetCapacity
-
占用容量百分比的任务少于您的容量百分比
targetCapacity
百分比,并且至少有一个实例可以终止。的减小值CapacityProviderReservation
指标导致相关的 CloudWatch 惊慌失措地采取行动。此告警会更新 自动扩缩组的DesiredCapacity
值。自动扩缩组使用此值终止 EC2 容器实例,然后从集群中将其注销。Auto Scaling 组遵循组终止策略来确定在缩容事件期间首先终止哪些实例。此外,它还可以避免开启实例缩容保护设置的实例。如果您开启托管终止保护,集群自动扩展可以管理哪些实例具有实例缩减保护设置。有关托管终止保护的更多信息,请参阅托管式终止保护。有关 Auto Scaling 组如何终止实例的更多信息,请参阅控制哪些 Auto Scaling 实例在缩容期间终止在亚马逊 EC2 自动扩展用户指南。
集群 Auto Scaling 注意事项
使用集群自动扩展时,请考虑以下几点:
-
请勿更改或管理与容量提供商关联的自动扩缩组的所需容量,该组具有除 Amazon ECS 管理的扩展策略之外的任何扩展策略。
-
Amazon ECS 使用
AWSServiceRoleForECS
服务相关 IAM 角色来获取它代表您调用 Amazon Auto Scaling 所需的权限。有关使用和创建 Amazon ECS 服务相关 IAM 角色的更多信息,请参阅 对 Amazon ECS 使用服务相关角色。 -
将容量提供程序与自动扩缩组结合使用时,对于创建容量提供程序的用户、组或角色需要
autoscaling:CreateOrUpdateTags
权限。这是因为Amazon ECS在将 自动扩缩组与容量提供程序关联时会向其添加一个标签。重要
确保您使用的任何工具都不会从自动扩缩组中删除
AmazonECSManaged
标签。如果删除此标签,则 Amazon ECS 无法在扩展集群时对其进行管理。 -
集群自动扩展不会修改MinimumCapacity要么MaximumCapacity对于小组。对于要扩展的群组,值为MaximumCapacity必须大于零。
-
启用 Auto Scaling(托管式扩展)时,容量提供程序只能同时连接到一个集群。如果您的容量提供程序已关闭托管扩缩,则可以将其与多个集群关联。
-
关闭托管式扩展后,容量提供程序不会横向缩减或横向扩展。您可以使用容量提供程序策略来平衡容量提供程序之间的任务。
-
Amazon ECS 在当前时间对现有容量使用放置策略和放置限制。放置策略可以跨可用区或 Amazon ECS 实例分散任务。这最终会分散所有任务和所有实例,以便每个正在运行的任务都在自己的专用实例上启动。为防止这种情况,请勿将
spread
策略与binpack
策略一起使用。有关更多信息,请参阅Amazon ECS 任务放置策略:
使用控制台时请考虑以下事项:
-
默认情况下,亚马逊 ECS托管扩展功能已开启。有关更多信息,请参阅托管扩展行为:
-
默认情况下,托管终止保护已关闭。有关更多信息,请参阅下一部分托管式终止保护。
-
默认情况下,Auto Scaling 实例横向缩减保护处于关闭状态。有关更多信息,请参阅 Amazon EC2 Auto Scaling 用户指南 中的使用实例横向缩减保护。
-
您的容量提供程序使用的自动扩缩组不能使用实例权重设置。与 Amazon ECS 容量提供程序一起使用时,不支持实例权重。
托管式终止保护
重要
你必须开启 “自动缩放”实例缩容保护在 Auto Scaling 组上使用集群自动扩展的托管终止保护功能。
当 Amazon ECS 集群自动扩展在自动扩展组中进行缩放CapacityProviderReservation值小于targetCapacity
你设定的百分比。集群自动扩展可以控制在您开启后终止哪些实例托管终止保护。当您使用托管终止保护时,Amazon ECS 只会终止没有任何正在运行的 Amazon ECS 任务的 EC2 实例。由使用以下内容的服务运行的任务DAEMON
调度策略会被忽略,即使实例正在运行这些任务,也可以通过集群自动扩展终止该实例。这是因为集群中的所有实例都在运行这些任务。
当您使用托管终止保护时,Amazon ECS 会首先打开实例缩容保护Auto Scaling 组中的 EC2 实例的选项。然后,Amazon ECS 将任务放在实例上。当实例上的所有非守护进程任务停止时,Amazon ECS 将启动横向缩减过程并关闭 EC2 实例的横向缩减保护。然后,自动扩缩组可以终止实例。
自动缩放实例缩容保护控制哪些 EC2 实例可以通过 Auto Scaling 终止。在横向缩减过程中,开启了横向缩减功能的实例无法终止。有关 Auto Scaling 实例缩减保护的更多信息,请参阅使用实例缩容保护在亚马逊 EC2 自动扩展用户指南。
有关集群自动伸缩如何管理缩容的更多信息,请参阅下一节托管的横向缩减行为。
托管终止保护注意事项
将托管终止保护与新控制台结合使用时,请注意以下事项:
-
默认情况下,对于您在控制台中创建的新容量提供商,托管终止保护处于关闭状态。
-
控制台不会开启您选择的 Auto Scaling 组的实例缩减保护。默认情况下,Auto Scaling 实例横向缩减保护处于关闭状态。您必须在 Auto Scaling 组上启用 Auto Scaling 实例缩减保护才能使用托管终止保护。如果您不开启缩容保护,则开启托管终止保护可能会导致不良行为。例如,您的实例可能停留在耗尽状态。有关更多信息,请参阅 Amazon EC2 Auto Scaling 用户指南 中的使用实例横向缩减保护。
托管扩展行为
当您拥有使用启用托管式扩展的自动扩缩组容量提供程序时,Amazon ECS 估计要添加到集群的最佳实例数。然后,Amazon ECS 使用此值确定要请求的实例数。下面更详细地描述了扩展行为。
-
Amazon ECS 通过遵循服务、独立任务或集群默认设置中的容量提供商策略,为每项任务选择容量提供商。对于单个容量提供商,Amazon ECS 将按照其余步骤进行操作。
如果任务没有容量提供者策略,则该任务将被容量提供者忽略。没有容量提供商策略的待处理任务不会导致任何容量提供商向外扩展。如果任务或服务设置了启动类型,则该任务或服务无法设置容量提供者策略。
-
对该容量提供商的所有配置任务进行分组,使每个组的资源需求完全相同。
-
当您在一个 Auto Scaling 组中使用多个实例类型时,Auto Scaling 组中的实例类型将按其参数排序。这些参数包括 vCPU、内存、弹性网络接口 (ENI)、端口和 GPU。选择每个参数的最小和最大实例类型。有关如何选择实例类型的更多信息,请参阅《Amazon ECS 最佳实践指南》中的表征应用程序。
重要
如果一组任务的资源需求高于 Auto Scaling 组中最小的实例类型,则该组任务无法使用此容量提供程序运行。容量提供商不会扩展 Auto Scaling 组。任务仍在
PENDING
州。为了防止任务停留在
PENDING
状态,我们建议您针对不同的最低资源要求创建单独的 Auto Scaling 组和容量提供商。运行任务或创建服务时,仅将容量提供程序添加到容量提供者策略中,该策略可以在 Auto Scaling 组中最小的实例类型上运行任务。对于其他参数,您可以使用放置约束 -
对于每组任务,Amazon ECS 计算运行未放置任务所需的实例数。此计算使用
binpack
策略。此策略考虑任务的 vCPU、内存、弹性网络接口 (ENI)、端口和 GPU 要求。它还考虑 Amazon EC2 实例的资源可用性。将最大实例类型的值视为最大计算实例计数。最小实例类型的值用作保护。如果最小的实例类型无法运行任务的至少一个实例,则计算会将该任务视为不兼容。因此,该任务会被排除在横向扩展计算之外。当所有任务都与最小的实例类型不兼容时,集群自动扩展将停止,CapacityProviderReservation
价值保持在targetCapacity
价值。 -
亚马逊 ECS 发布了
CapacityProviderReservation
公制到 CloudWatch关于minimumScalingStepSize
如果是以下任一情况。计算的最大实例计数小于最小扩展步长大小。或者,小于maximumScalingStepSize
或最大计算的实例计数的较低值。 -
CloudWatch 警报使用
CapacityProviderReservation
容量提供商的指标。当CapacityProviderReservation
指标值大于targetCapacity
值时,告警也会增加自动扩缩组的DesiredCapacity
。的targetCapacity
value 是发送到 CloudWatch 在集群自动伸缩激活阶段发出警报。您可以在创建自动扩缩组时设置
targetCapacity
,或在创建该组后修改值。默认值为 100%。 -
自动扩缩组启动其他 EC2 实例。为防止横向扩展操作过度预置,Auto Scaling 确保最近启动的 EC2 实例容量在启动新实例之前稳定下来。Auto Scaling 会检查是否所有现有实例都已超过
instanceWarmupPeriod
(现在减去实例启动时间)。instanceWarmupPeriod
中的实例无法横向扩展。新启动实例的默认预热时间为 300 秒。
有关更多信息,请参阅深入了解 Amazon ECS 集群自动扩缩
横向扩展注意事项
对于横向扩展过程,请考虑以下几点:
-
尽管存在多个放置约束,但我们建议您只使用
distinctInstance
任务放置约束。这可以防止横向扩展过程停止,因为您使用的是与采样实例不兼容的放置约束。 -
如果 自动扩缩组使用相同或相似的实例类型,则托管扩展效果最佳。有关更多信息,请参阅托管扩展行为:
-
当需要横向扩展流程且当前没有正在运行的容器实例时,Amazon ECS 始终会首先向外扩展到两个实例,然后再执行额外的扩展或缩小流程。任何额外的横向扩展都将等待实例预热期。对于缩小进程,Amazon ECS 在横向扩展过程结束后会等待 15 分钟,然后才会一直启动缩容进程。
-
第二个横向扩展步骤需要等到
instanceWarmupPeriod
到期,这可能会影响整体扩展限制。如果您需要缩短此时间,请确保instanceWarmupPeriod
足够大,以便 EC2 实例启动和开始 Amazon ECS 代理(这可防止过度预置)。 -
集群自动扩展支持启动配置、启动模板以及容量提供商 Auto Scaling 组中的多种实例类型。您还可以使用基于属性的实例类型选择而不使用多个实例类型。
-
使用带有按需实例和多个实例类型或竞价型实例的 自动扩缩组时,请将较大的实例类型放在优先级列表中,并且不指定权重。这时不支持指定权重。有关详细信息,请参见 Amazon Auto Scaling 用户手册中的使用多个实例类型 自动扩缩组。
-
然后,Amazon ECS 将启动
minimumScalingStepSize
,如果计算的最大实例计数小于最小扩展步长大小,或者maximumScalingStepSize
或最大计算的实例计数值。 -
如果 Amazon ECS 服务或
run-task
API 启动了一个任务且容量提供程序容器实例没有足够的资源来开始任务,则 Amazon ECS 会限制每个集群具有此状态的任务数量,并防止任何任务超过此限制。有关更多信息,请参阅Amazon ECS 服务配额:
托管的横向缩减行为
Amazon ECS 会监控集群中每个容量提供商的容器实例。当容器实例未运行任何任务时,容器实例将被视为空,Amazon ECS 会启动缩容过程。以下内容更详细地描述了缩小行为:
-
Amazon ECS 会计算空容器实例的数量。即使守护程序任务正在运行,容器实例也被视为空。
-
亚马逊 ECS 设置了
CapacityProviderReservation
值为介于 0-100 之间的数字,该数字使用以下公式表示 Auto Scaling 组需要的大小与实际规模的比率,以百分比表示。然后,亚马逊 ECS 将该指标发布到 CloudWatch。有关如何计算指标的更多信息,请参阅深入了解 Amazon ECS 集群自动扩展CapacityProviderReservation = (number of instances needed) / (number of running instances) x 100
-
的
CapacityProviderReservation
指标生成 CloudWatch 警报。此告警会更新 自动扩缩组的DesiredCapacity
值。然后,发生下列任一操作时:-
如果您不使用容量提供程序托管式终止,自动扩缩组将使用自动扩缩组终止策略选择 EC2 实例,并终止这些实例,直至 EC2 实例的数量达到
DesiredCapacity
。然后,容器实例将从集群中注销。 -
如果所有容器实例都使用托管终止保护,则 Amazon ECS 将移除对空容器实例的缩减保护。然后,自动扩缩组将能够终止 EC2 实例。然后,容器实例将从集群中注销。
-
横向缩减注意事项
对于横向缩减过程,请考虑以下几点:
-
如果没有正在运行的非进程守护程序任务,则认为 Amazon ECS 容器实例可用于横向缩减。
-
CloudWatch 在 Auto Scaling 组的缩容过程开始之前,缩减警报需要 15 个数据点(15 分钟)。在横向缩减过程开始之后,直到 Amazon ECS 需要减少已注册容器实例的数量时,自动扩缩组将
DesireCapacity
值设置为每分钟大于一个实例和少于 50%。 -
当 Amazon ECS 在横向缩减过程中请求横向扩展时(
CapacityProviderReservation
大于 100 时),横向缩减过程将停止,如果需要,将从头开始。
目标跟踪考虑因素
在开启托管扩展的情况下创建或更新容量提供程序时,您可以设置targetCapacity
百分比。这样,您就可以保留备用容量,以便将来的任务可以更快地启动。备用容量无需等待 Auto Scaling 组启动更多实例,从而改善了这种情况。Amazon ECS 使用目标容量值来管理 CloudWatch 该服务为促进集群自动扩展而创建的指标。亚马逊 ECS 管理 CloudWatch 公制。这样,自动扩缩组被视为稳定状态,因此不需要执行扩展操作。这些值可以是 0-100%。例如,要将 Amazon ECS 配置为在 Amazon ECS 任务使用的容量之外保持 10% 的可用容量,请将目标容量值设置为 90%。
在容量提供程序上设置 targetCapacity
值时,请考虑以下因素。
-
小于 100% 的
targetCapacity
值表示集群中需要存在的可用容量(Amazon EC2 实例)的量。可用容量意味着没有正在运行的任务。 -
可用区之类的放置约束无需额外的
binpack
即可强制 Amazon ECS 最终为每个实例运行一个任务,这可能不是所需的行为。为了防止该行为发生,切勿结合使用spread
策略与binpack
策略。
更新 Amazon ECS 为集群自动扩缩创建资源的方式
截至 2022 年 5 月 27 日,Amazon ECS 在管理促进集群 Auto Scaling 的资源方式方面发生了变化。为了简化体验,Amazon ECS 不再需要在自动扩缩组容量提供程序上启用托管式扩展时启用 Amazon Auto Scaling 扩展计划。
重要
此更改不会对您的集群自动扩展工作流程产生任何功能影响,也不会影响定价或性能。
2022 年 5 月 27 日之前创建的容量提供程序
2022 年 5 月 27 日之前创建并且使用 Amazon Auto Scaling 扩展计划的容量提供程序将像以前一样继续起作用。
请查看以下注意事项:
-
我们建议您不要更新或删除
ECS-managed
Amazon Auto Scaling 扩展计划或与容量提供程序关联的扩展策略资源。 -
您将能够在 Auto Scaling 控制台上访问集群的扩展计划资源,也可以通过带有附件的
describe-clusters
访问。如需了解更多信息,请参阅 API 文档DescribeClusters。 -
您无法向充当集群容量提供程序的自动扩缩组添加扩缩策略。
-
每个账户的 Auto Scaling 计划数量有限。有关更多信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的您的扩缩计划的配额。
2022 年 5 月 27 日或之后创建的容量提供程序
截至 2022 年 5 月 27 日,Amazon ECS 不再为新创建的容量提供程序创建 Amazon Auto Scaling 扩展计划。相反,Amazon ECS 使用附加到自动扩缩组的目标跟踪扩展策略,来根据您的目标容量规格执行动态扩展。有关更多信息,请参阅亚马逊 EC2 自动扩展组容量提供商:
在此新版本中,您可以使用带扩缩策略的现有自动扩缩组,以便在创建新容量提供程序时使用。建议不要修改 ECS 托管的扩展策略或计划资源。但是,在创建新的容量提供程序资源时,如果您有自定义的工具来修改 Amazon Auto Scaling 扩展计划,请执行下列操作之一:
-
(推荐)更新容量提供程序以修改 Amazon ECS 托管的扩展设置。有关更多信息,请参阅UpdateCapacityProvider。
-
更新与自动扩缩组关联的扩展策略以修改使用的目标跟踪配置。有关更多信息,请参阅PutScalingPolicy。