如何排查 Amazon ECS 中的服务弹性伸缩问题?

上次更新日期:2022 年 3 月 30 日

为我的 Amazon Elastic Container Service(Amazon ECS)服务配置的服务弹性伸缩未按要求缩减或扩展所需的任务计数。

简短描述

通过将 ECS 服务与 Application Auto Scaling 服务和 Amazon CloudWatch 告警集成,您可以自动更新 Amazon ECS 服务所需的任务计数。

由于以下一个或多个原因,服务弹性伸缩可能无法按预期添加或删除任务:

  • 扩缩策略配置不正确。
  • 触发扩缩策略的 CloudWatch 告警被删除或编辑。
  • 在计划操作中指定了错误的 cron 表达式格式。
  • 您手动或通过 AWS CloudFormation 或 AWS Cloud Development Kit(AWS CDK),将所需的任务计数更新为小于或大于服务弹性伸缩中设置的最小值或最大值的值。
  • 您的 ECS 集群没有足够的资源或容量来运行新任务。

解决方法

排查 CloudWatch 告警和扩缩策略的问题

可扩展目标

aws application-autoscaling register-scalable-target --service-namespace ecs --scalable-dimension ecs:service:DesiredCount \
--resource-id service/your-cluster/your-service-name --min-capacity 1 --max-capacity 10 --region example-region
  • 使用以下命令检索您的 ECS 服务的服务弹性伸缩信息:
aws application-autoscaling describe-scalable-targets --service-namespace ecs --region example-region 
aws application-autoscaling describe-scaling-policies --service-namespace ecs --region example-region
aws application-autoscaling describe-scaling-activities --service-namespace ecs \ 
--scalable-dimension ecs:service:DesiredCount --resource-id service/your-cluster/your-service-name --region example-region
  • 当您为 ECS 服务弹性伸缩创建或更新 CloudWatch 告警时,请确保正确指定了指标、维度、统计数据、周期、条件和阈值。否则,不会触发告警来更新关联的扩缩策略。

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

步进扩缩

  • 检查与扩缩策略关联的 CloudWatch 告警是否正在触发。通过查看 CloudWatch 告警历史记录来检查是否存在任何错误。
  • 对于步进扩缩策略,请检查 CloudWatch 告警中是否设置了违例阈值、步长调整和扩缩调整类型。如果违例增量(即从指标值中减去的阈值)没有匹配的步长调整,则可以在告警历史记录中看到以下错误消息:Failed to execute AutoScaling action: No step adjustment found for metric value [xx, xx] and breach delta xx(无法执行 AutoScaling 操作:未找到指标值 [xx, xx] 和违例增量 xx 的步长调整)
    因此,请确保您的策略涵盖了所有步长调整,即缩减时从负无穷数到 0,扩展时从 0 到正无穷数。
    注意:通常,对于扩展策略,在步长调整中,只有上限可以为空(正无穷数)。对于缩减策略,只有下限可以为空(负无穷数)。有关更多信息,请参阅步长调整

目标跟踪扩缩

  • 由于目标跟踪扩缩策略由 AWS 托管,因此 Application Auto Scaling 会根据在创建这些策略时指定的目标值或阈值,创建用于缩减和扩展的 CloudWatch 告警。因此,请勿编辑或删除这些告警。编辑或删除这些告警会影响扩缩行为。如果您修改或删除了这些告警,请务必再次重新创建目标跟踪策略。
  • 只要每个策略使用不同的指标,您可以为一个 ECS 服务设置多个目标跟踪扩缩策略。Application Auto Scaling 的目的是优先考虑可用性。因此,这些策略的行为会有所不同,具体取决于目标跟踪策略是否已准备好进行扩展或缩减。Application Auto Scaling 会在任何目标跟踪策略准备好进行扩展时扩展任务,但仅当所有目标跟踪策略(启用了缩减部分)都已准备好进行缩减时才会缩减。
  • 当为一个 ECS 服务配置多个扩缩策略(包括目标跟踪和步进扩缩策略)时,请确保它们不冲突。这些冲突可能会导致不良行为,例如连续缩减和扩展,从而导致任务计数出现不必要的振荡。

有关更多信息,请参阅 Application Auto Scaling 的目标跟踪扩缩策略

排查错误 cron 表达式的问题

确保计划中指定的 cron 表达式在 Application Auto Scaling 的计划操作配置中是正确的。Application Auto Scaling 支持的 cron 格式由六个用空格分隔的字段组成:[Minutes] [Hours] [Day_of_Month] [Month] [Day_of_Week] [Year]。

有关更多信息,请参阅 Application Auto Scaling 的计划操作示例

排查所需任务计数更新的问题

当您手动更新或使用 CloudFormation 或 AWS CDK 更新您的 ECS 服务的所需任务计数时,请记住以下几点:

  • 如果您将 ECS 服务的所需任务计数更新为低于最小容量值的值,并且告警触发了扩展活动,则服务弹性伸缩会将所需计数向上扩展到最小容量值。然后,根据与告警关联的扩缩策略,服务弹性伸缩将继续根据需要进行扩展。但是,缩减活动不会调整所需的计数,因为所需的计数已经低于最小容量值。
  • 如果您将 ECS 服务的所需任务计数更新为高于最大容量值的值,并且告警触发了缩减活动,则服务弹性伸缩会将所需计数扩展到最大容量值。然后,根据与告警关联的扩缩策略,服务弹性伸缩将继续根据需要进行缩减。但是,扩展活动不会调整所需的计数,因为所需的计数已经超过最大容量值。
  • 如果您在未指定 DesiredCount 字段的情况下使用 CloudFormation 或 CDK 创建了 ECS 服务,则所需的计数将设置为默认值 1。但是,如果在未指定 DesiredCount 字段的情况下通过 CloudFormation 或 CDK 更新同一服务,则当前部署中现有的所需计数将用于新部署。因此,当在 CloudFormation 堆栈或 AWS CDK 中指定了所需计数值时,请确保服务更新期间该值介于最小值和最大值之间。

排查集群容量问题

当您的 ECS 集群没有 Amazon Elastic Compute Cloud(Amazon EC2)容器实例等足够的资源来运行任务时,由扩缩策略启动的扩缩活动仍未完成。在这种情况下,服务事件中会记录一条错误消息。要避免这些 Amazon EC2 容量问题并成功启动任务,请根据需要利用 Amazon ECS 容量提供程序自动预置 EC2 实例。

注意:在扩缩活动期间,服务弹性伸缩使用服务中实际运行的任务计数,而不是所需计数作为起点。这样可以防止可能无法满足的过度扩缩,例如,如果没有足够的容器实例资源来放置其他任务。如果容器实例容量稍后可用,则挂起的扩缩活动可能会成功。然后,冷却时间过后,进一步的扩缩活动将继续进行。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?