如何对 Amazon ECS 容量提供程序的扩缩问题进行故障排除?

3 分钟阅读
0

我已为 Amazon Elastic Container Service (Amazon ECS) 集群设置了容量提供程序。但是,容量提供程序不会在集群用尽资源时横向扩展,或者不会在容量占用较少时横向缩减。

简短描述

由于以下一个或多个原因,Amazon ECS 集群的容量提供程序不会自动横向缩减或横向扩展:

  • Amazon ECS 服务未与容量提供程序关联。
  • 与容量提供程序相关的扩缩策略未附加到 Auto Scaling 组。
  • 目标跟踪扩缩策略配置不正确。
  • 容量提供程序中未正确配置目标容量百分比。
  • 任务置放策略未根据工作负载定义。
  • ECS 服务发生故障,显示一些错误,并阻止容量提供程序进行扩缩。
  • 您正在为容量提供程序使用托管式扩缩,并且 Auto Scaling 组附加了自定义扩缩策略。
  • Auto Scaling 组已启动容器实例,但无法加入集群。
  • 您的容器实例受到保护,无法横向缩减。
  • 容量提供程序卡在故障状态。
  • Auto Scaling 组卡在横向扩展和横向缩减的循环中。

解决方法

Amazon ECS 服务未与容量提供程序关联

要检查 ECS 服务是否与容量提供程序关联,请运行 AWS Command Line Interface (AWS CLI) 命令 describe-services

aws ecs describe-services --cluster example-cluster --services example-service --region example-region --query services[].capacityProviderStrategy

如果您的 ECS 服务与容量提供程序关联,则输出必须与以下内容类似:

[
  [
    {
      "capacityProvider": "example-capacity-provider",
      "weight": 1,
      "base": 1
    }
  ]
]

请确保输出中的 capacityProviderStrategy 字段不为空。您可以通过查看 CreateServiceUpdateService API 调用的 AWS CloudTrail 事件来查看服务的配置。

要解决此问题,请使用 AWS CLI 命令 update-servicerun-taskput-cluster-capacity-providers 来更新 ECS 服务。您还可以使用 Amazon ECS 控制台更新服务

注意: 如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

与容量提供程序相关的扩缩策略未附加到 Auto Scaling 组

创建容量提供程序并将其与 Auto Scaling 组关联后,Auto Scaling 组会创建一个扩缩策略,该策略使用目标跟踪来修改所需的容量以适应集群负载。

要解决此问题,请查看 UpdateAutoScalingGroupCreateCapacityProviderUpdateCapacityProviderPutScalingPolicy API 的 CloudTrail 事件

运行以下命令,验证 Auto Scaling 组是否创建为集群附件:

aws ecs describe-clusters --clusters example-cluster --include ATTACHMENTS --region example-region --query clusters[].attachments[]

命令的输出必须与以下内容类似:

[
  {
    "id": "100a23456-5f0b-4abc-b998-d6789d111a",
    "type": "asp",
    "status": "CREATED",
    "details": [
      {
        "name": "capacityProviderName",
        "value": "example-capacityProvider"
      },
      {
        "name": "scalingPlanName",
        "value": "ECSManagedAutoScalingPlan-bb60c8fa-3ed7-4808-b39c-abcdef2345"
      }
    ]
  }
]

如果您使用托管式扩缩策略,请通过执行以下操作检查该策略是否已附加到 Auto Scaling 组:

  1. 打开 Amazon ECS console(Amazon ECS 控制台)。
  2. 在导航窗格中,选择 Clusters(集群)。
  3. 打开要检查的集群。
  4. 选择 Capacity Providers(容量提供程序)选项卡。
  5. 对于要检查的容量提供程序,请选择 ASG。
    您将被定向到 Amazon EC2 控制台中的 Auto Scaling groups(Auto Scaling 组)页面。
  6. 选择 Automatic Scaling(弹性伸缩)选项卡。
    您可以查看扩缩策略。
  7. 检查是否包含您正使用的扩缩策略。

此外,请确保在 Auto Scaling 组扩缩策略的名称中包含前缀 AutoScaling-ECSManagedAutoScalingPlan。否则,Auto Scaling 组使用的扩缩策略与容量提供程序托管的扩缩策略不同。请注意,容量提供程序可以与其他类型的扩缩策略一起使用。有关更多信息,请参阅服务弹性伸缩

目标跟踪扩缩策略配置不正确

目标跟踪扩缩策略跟踪您定义指标的目标值。Amazon ECS 服务弹性伸缩创建和管理 Amazon CloudWatch 告警,这些告警根据指标和目标值触发扩缩策略并计算扩缩调整。如果目标跟踪策略配置不正确,任务可能不会根据需要自动扩缩。

假设目标跟踪弹性伸缩策略正在跟踪 CloudWatch 中的 CPUUtilization 指标,并且您将目标跟踪百分比指定为 60。在这种情况下,容量提供程序会尽最大努力将合计 CPU 利用率保持在 60%。在 CPU 利用率大于 60% 时,这导致横向扩展事件,而当利用率低于 60% 时导致横向缩减事件。

要解决此问题,请选择正确的指标,并根据您的工作负载在目标跟踪策略中设置正确的横向缩减和横向扩展值。有关更多信息,请参阅目标跟踪扩缩策略

容量提供程序中未正确配置目标容量百分比

目标容量值用作 Amazon ECS 托管式目标跟踪扩缩策略中使用的 CloudWatch 指标的目标值。我们将尽最大努力匹配该目标容量值。该值的允许值是介于 1 和 100 之间的整数。例如,如果您将目标容量设置为 100%,则所有实例都会被使用,并且任何未运行任务的实例都会被横向缩减。但是,该行为并非始终得到保证。如果您需要备用容量,请根据需要将目标容量设置为略低于 100% 的值。

要使用正确的目标容量百分比更新容量提供程序,请按照使用经典控制台更新 Auto Scaling 组容量提供程序中的说明进行操作。

未根据工作负载定义任务置放策略

您可以在创建服务或运行任务时指定任务置放策略。您还可以更新现有服务的任务置放策略。例如,如果您的工作负载占用大量内存,并且您未据此配置任务置放策略,则任务不会根据您的内存使用情况进行横向缩减或横向扩展。请确保检查任务置放策略类型,并根据工作负载定义这些策略。

ECS 服务发生故障,显示一些错误,并阻止容量提供程序进行扩缩

如果您的 ECS 服务发生故障,显示任何错误,则会阻止容量提供程序进行横向缩减和横向扩展。要对为何 ECS 服务发生故障进行故障排除,请检查 Amazon ECS 控制台中的服务事件消息

您正在为容量提供程序使用托管式扩缩,并且 Auto Scaling 组附加了自定义扩缩策略

当您的集群无法自动扩缩时,您可能会遇到以下错误:

"StatusCode": "ActiveWithProblems"
"StatusMessage": "Scaling plan has been created but failed to be applied to all resources. Problems were encountered for 1 resource. See scaling plan resources for the failure details."

该错误在同时满足以下两个条件时发生:

  • 您正在为容量提供程序使用 AWS 托管式扩缩。
  • Auto Scaling 组具有的自定义扩缩策略不是由附加的 Amazon ECS 创建。

要解决此错误,请参阅避免 ActiveWithProblems 错误。当您启用托管式扩缩时,Amazon ECS 将通过 Auto Scaling 扩缩计划管理 Auto Scaling 组的横向缩减和横向扩展操作。最佳实践是始终创建新的 Auto Scaling 组并将该组附加到容量提供程序。

Auto Scaling 组已启动容器实例,但无法加入集群

您的容器实例受到保护,无法横向缩减

如果您在配置容量提供程序时启用了托管式终止保护,Amazon ECS 将阻止在横向缩减操作期间终止包含任务的 Auto Scaling 组中的 Amazon EC2 实例。

要确保 Auto Scaling 组可以在您更改所需容量时终止旧实例,请执行以下操作:

有关更多信息,请参阅如何解决 Amazon ECS 中的“容量提供程序的托管式终止保护设置无效”错误?

容量提供程序卡在故障状态

最佳实践是创建新的 Auto Scaling 组以与容量提供程序配合使用,而非使用现有的组。如果您使用现有的 Auto Scaling 组,则在使用容量提供程序时可能会遇到问题。这是因为与现有组关联并注册到 Amazon ECS 集群的处于运行状态的 Amazon EC2 实例可能未正确注册到容量提供程序。

要查看容量提供程序的状态,请运行 AWS CLI 命令 describe-capacity-providers

此外,请查看 CloudTrail 事件,并检查是否存在与 CreateCapacityProvider API 相关的错误。

Auto Scaling 组卡在横向扩展和横向缩减的循环中

当您的 ECS 服务的扩缩策略中指定的指标值达到峰值时,Auto Scaling 组将根据需要进行横向扩展并启动实例。但是,如果指标值在突然达到峰值后下降,Auto Scaling 组将尝试横向缩减实例。如果指标值在短时间内波动数次,则 Auto Scaling 组可能卡在横向扩展和横向缩减的循环中。为避免此问题,请确保根据您的工作负载定义扩缩策略中指标的阈值。


相关信息

深入探究 Amazon ECS 集群弹性伸缩

如何解决 Amazon ECS 中的容量提供程序错误?

AWS Fargate 容量提供程序

Auto Scaling 组容量提供程序

AWS 官方
AWS 官方已更新 2 年前