跳至内容

如何对 Amazon ECS 中的自动扩缩问题进行故障排除?

2 分钟阅读
0

我为 Amazon Elastic Container Service (Amazon ECS) 配置的自动扩缩没有横向缩减或横向扩展所需任务计数。

简短描述

要自动更新所需任务计数,请为 Amazon ECS 设置 AWS Application Auto Scaling 和 Amazon CloudWatch 警报。

由于以下原因,Application Auto Scaling 可能无法按预期添加或删除任务:

  • 您未正确配置扩缩策略。
  • 您删除或编辑了调用扩缩策略的 CloudWatch 警报。
  • 自动扩缩被暂停。
  • 您在计划操作中指定了错误的 cron 表达式格式。
  • 您使用了 AWS CloudFormation 或 AWS Cloud Development Kit (AWS CDK) 来手动更新所需任务计数,但输入了错误的值。
  • 所需的任务数量配置不正确。
  • 您的 Amazon ECS 集群没有足够的资源或容量来运行新任务。
  • 您遇到了网络问题。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

对 CloudWatch 警报和扩缩策略进行故障排除

要对 CloudWatch 警报和扩缩策略进行故障排除,请根据您使用的扩缩策略完成以下任务。

可扩缩目标

要检查服务是否已通过 Application Auto Scaling 注册为可扩缩目标,请运行 describe-scalable-targets 命令:

aws application-autoscaling describe-scalable-targets --service-namespace ecs --region example-region

**注意:**请将 example-region 替换为您的 AWS 区域。

如果服务未注册,请运行 register-scalable-target 命令注册服务:

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

**注意:**请将 your-cluster 替换为您的 Amazon ECS 集群名称,将 your-service-name 替换为您的服务名称,将 example-region 替换为您的区域。

在前面命令的输出中,查看 DynamicScalingInSuspendedDynamicScalingOutSuspendedScheduledScalingSuspended 的值。如果 DynamicScalingInSuspendedDynamicScalingOutSuspended 设置为 true,则当您启动扩缩策略时,Application Auto Scaling 不会更新容量。当 ScheduledScalingSuspended 设置为 true 时,Application Auto Scaling 不会启动您计划在暂停期间运行的扩缩操作。有关如何恢复已暂停的自动扩缩的详细信息,请参阅暂停和恢复 Application Auto Scaling 扩缩

注册服务后,请配置扩缩策略和 CloudWatch 警报

步进扩缩

检查 CloudWatch 是否正在启动与扩缩策略关联的警报。您可以在 CloudWatch 警报的历史记录中查找是否存在错误。如果违例增量没有步长调整,则您会看到以下错误: “无法执行 AutoScaling 操作: 未找到指标值 [xx, xx] 和违例增量 xx 的步长调整”。要解决此问题,请务必在 CloudWatch 警报中设置阈值、步长调整和扩缩调整类型。此外,请在策略中指定所有步长调整。对于横向缩减,请输入负无穷数到 0,对于横向扩展,请输入 0 到正无穷数

**注意:**如果您使用 Amazon ECS 容量提供商,请确保有足够的容器实例来运行任务。

目标跟踪扩缩

由于目标跟踪扩缩策略会影响扩缩行为,因此请勿编辑或删除关联的 CloudWatch 警报。如果您修改或删除这些警报,则必须重新创建目标跟踪策略。

当配置多个扩缩策略时,这些策略可能会冲突并导致连续横向缩减和横向扩展活动。如果您想为 Amazon ECS 服务配置多个目标跟踪扩缩策略,则每个策略必须使用不同的指标。

对错误的 cron 表达式进行故障排除

确保 Application Auto Scaling 的计划操作配置中的 cron 表达式使用以下格式:[Minutes] [Hours] [Day_of_Month] [Month] [Day_of_Week] [Year]。这六个字段必须用空格分隔。

有关使用 cron 表达式的示例操作,请参阅创建按重复计划运行的计划操作

对所需任务计数更新问题进行故障排除

当更新 Amazon ECS 服务的所需任务计数时,可能会调用扩缩事件。对于横向扩展,Application Auto Scaling 会将所需计数增加到最小容量。对于横向缩减,Application Auto Scaling 会将所需计数增加到最大容量。在这两种情况下,Application Auto Scaling 都会继续根据扩缩策略进行扩缩,但不会修改所需计数。

如果您使用 CloudFormation 或 AWS CDK 创建 Amazon ECS 服务,则默认 DesiredCount 值为 1。如果您使用 CloudFormation 或 AWS CDK 更新 Amazon ECS 服务,则应用程序将使用现有 DesiredCount 进行新部署。

对于 CloudFormation 堆栈或 AWS CDK 中的所需计数值,请在服务更新期间指定一个介于最小值和最大值之间的值。

**注意:**确保所需计数满足服务部署配置的需求,尤其是最小和最大百分比设置。

对集群容量问题进行故障排除

为避免容量问题,请使用 Amazon ECS 容量提供商自动预置 Amazon Elastic Compute Cloud (Amazon EC2) 实例。

为防止过度扩缩,自动扩缩将使用服务中实际运行的任务计数作为起点,而不是所需计数。如果没有足够的容器实例资源来放置其他任务,自动扩缩将无法完成扩缩。要解决此问题,请使用容量提供商来自动扩缩容器实例容量。否则,您必须手动增加容器实例容量。

冷却时间过后,自动扩缩将继续进行扩缩活动。对于 AWS Fargate 任务,请使用 Fargate 容量提供商来管理计算容量。

自动扩缩使用实际运行的任务计数(而不是所需计数)作为扩缩的起点。如果没有足够的容器实例资源来放置其他任务,自动扩缩将无法完成扩缩活动。但是,为了防止无法完成的过度扩缩尝试,自动扩缩仍会尝试根据可用资源尽可能地进行扩缩。

对与网络相关的扩缩问题进行故障排除

检查 awsvpc 网络模式下任务的配置

当自动扩缩增加任务数量时,awsvpc 网络模式下的每个任务都需要自己的 IP 地址。如果您的虚拟私有云 (VPC) 子网没有足够的可用 IP 地址,则任务数量将无法纵向扩展。定期监控您的 VPC 的 IP 地址使用情况。如果您的配置接近容量限制,请使用更大的 CIDR 块或创建新的子网

awsvpc 网络模式下的 Amazon ECS 任务使用弹性网络接口。每个 VPC 中每种实例类型的网络接口总数都有最大配额。如果您超过此配额,则任务将无法启动。要检查您的网络接口使用情况,请完成以下步骤:

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格中选择 Network interfaces(网络接口)。
  3. 使用 Instance ID(实例 ID)列查看每个网络接口所连接的实例。要查看有关网络接口的详细信息(例如 IP 地址和安全组),请选择该网络接口。

确认您的配置不会阻止所需流量

安全组或网络访问控制列表(网络 ACL)规则可能会阻止所需的流量,并导致运行状况检查失败,从而导致不必要的扩缩事件。确保您的安全组允许入站流量流向应用程序端口。此外,请确保您的网络 ACL 允许入站流量和出站流量在您的应用程序和 Amazon ECS 之间传输。

相关信息

自动扩缩 Amazon ECS 服务

application-autoscaling

AWS 官方已更新 1 年前