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

3 分钟阅读
0

我为使用 Amazon Elastic Compute Cloud (Amazon EC2) 启动类型的 Amazon Elastic Container Service (Amazon ECS) 集群创建了一个容量提供商。但是,该容量提供商未按预期进行扩缩。

简短描述

以下问题会导致您的 Amazon EC2 容量提供商无法自动进行横向缩减或横向扩展:

  • 您未将 Amazon ECS 服务与容量提供商相关联。
  • 您未将容量提供商扩缩策略附加到 Amazon EC2 Auto Scaling 组。
  • 您未正确配置目标容量百分比。
  • 您正在使用容量提供商的托管扩缩,且 EC2 Auto Scaling 组附加了自定义扩缩策略。
  • Amazon EC2 Auto Scaling 组已启动容器实例,但实例无法加入集群。
  • 您的容器实例无法缩减。
  • 容量提供商卡在 Failed(失败)状态。
  • 自动扩缩组陷入扩缩循环。

解决方法

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

检查您是否将 Amazon ECS 服务与容量提供商相关联

要确认您是否将 Amazon ECS 服务与容量提供商相关联,请运行以下 AWS CLI 命令 describe-services

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

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

如果您已将 Amazon ECS 服务与容量提供商相关联,则您会收到类似于以下示例的输出:

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

确保 capacityProviderStrategy 值不为 []

要向服务添加容量提供商,请运行以下 update-service 命令:

aws ecs update-service --cluster example-cluster --service example-service --region example-region --capacity-provider-strategy capacityProvider=capacity-provide-name,weight=weight-value,base=base-value --force-new-deployment

**注意:**请将 example-cluster 替换为您的集群名称,将 example-service 替换为您的服务名称,将 example-region 替换为您的区域,将 capacity-provider-name 替换为您的容量提供商名称。此外,请将 weight-value 替换为使用容量提供商的任务总数,将 base-value 替换为容量提供商要运行的最小任务数。

您也可以使用 Amazon ECS 控制台来更新服务

确保将容量提供商扩缩策略附加到自动扩缩组

当您将容量提供商与自动扩缩组关联时,Amazon ECS 会创建一个扩缩策略,该策略会根据集群负载修改容量。

要对扩缩策略问题进行故障排除,请查看 PutScalingPolicyUpdateAutoScalingGroupCreateCapacityProviderUpdateCapacityProvider API 调用的 AWS CloudTrail 事件。确保该策略可以与自动扩缩组关联,且容量提供商能够按预期工作。

要验证自动扩缩组是否为集群附件,请运行 describe-cluster 命令:

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

**注意:**请将 example-cluster 替换为您的集群名称,将 example-region 替换为您的区域。

输出示例:

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

如果您使用托管扩缩策略,请完成以下步骤,以检查是否已将该策略附加到自动扩缩组:

  1. 打开 Amazon ECS 控制台
  2. 在导航窗格中,选择 Clusters(集群)。
  3. 选择您的集群。
  4. 选择 Infrastructure(基础设施)选项卡。
  5. 选择 Capacity providers(容量提供商)选项卡。
  6. 选择您的自动扩缩组。
    **注意:**此操作会将您重定向到 Amazon EC2 控制台中的 Auto Scaling groups(自动扩缩组)页面。
  7. 选择 Automatic scaling(自动扩缩)选项卡。
  8. 选择 Actions(操作),然后选择 Edit dynamic scaling policy(编辑动态扩缩策略)。
  9. Custom metric JSON(自定义指标 JSON)字段中,检查该策略是否包含 CapacityProviderReservation 指标。

检查您的目标容量百分比配置

检查您的容量提供商的 Amazon CloudWatch 指标 CapacityProviderReservation,以跟踪其容器实例的使用情况。与自动扩缩组关联的目标跟踪扩缩策略会调整正在运行的实例数量,以确保 CapacityProviderReservation 与目标容量值相匹配。例如,如果您将目标容量设置为 100%,则 Amazon ECS 将使用所有实例,并对未运行任务的实例进行横向缩减。

要设置额外容量,请将“设置目标容量”更新为低于 100 的值。

确保从自动扩缩组启动的实例可以加入集群

如果您的实例无法加入集群,请参阅为什么我的 Amazon EC2 实例无法加入 Amazon ECS 集群?

确保不会阻止您的容器实例进行缩减操作

对于使用托管终止保护的容量提供商,Amazon ECS 会阻止在横向缩减操作期间终止运行任务的 Amazon EC2 实例

要停止所有正在运行的任务并允许自动扩缩组终止 EC2 实例,请使用 Amazon ECS 控制台耗尽该实例。或者,运行以下 update-container-instances-state 命令:

aws ecs update-container-instances-state --cluster example-cluster --container-instances example-container --status DRAINING --region example-region

**注意:**请将 examples-cluster 替换为您的集群名称,将 example-container 替换为您的容器实例,将 example-region 替换为您的区域。

如果在您对容器实例执行耗尽操作后,任务仍在该容器实例上运行,请参阅容器实例设置为“正在耗尽”时,需要很长时间才能停止一些 Amazon ECS 任务,如何解决此问题?

要进一步对托管终止保护问题进行故障排除,请参阅如何解决 Amazon ECS 中容量提供商的托管终止保护设置错误?

如果扩缩保护阻止对您的实例进行缩减操作,则您会在自动扩缩活动历史记录中收到以下错误消息:

“无法扩展到所需容量,因为所有剩余实例都受到保护,无法缩减。”

要解决此问题,请检查您的工具或第三方工具(例如 Terraform 或 GitLab)。确保这些工具不会从自动扩缩组中移除 AmazonECSManaged 标签。Amazon ECS 需要此标签来管理扩缩操作。要检查 AmazonECSManaged 标签是否缺失,请查看您的 CloudTrail 事件历史记录中是否有 SetInstanceProtection 事件。如果您看到 SetInstanceProtection 事件,则必须将该标签重新添加到您的自动扩缩组中。

检查容量提供商的状态

使用容量提供商时,最佳做法是创建新的自动扩缩组,而不是重复使用现有组。处于 Running(正在运行)状态、与现有组相关联且已注册到 Amazon ECS 集群的实例可能无法正确注册。

要查看容量提供商的状态,请运行 describe-capacity-providers 命令:

aws ecs describe-capacity-providers \
--capacity-providers MyCapacityProvider

如果容量提供商状态为 INACTIVE(非活动),则表明容量提供商已被删除。

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

确保自动扩缩组未陷入扩缩循环

当您在 Amazon ECS 服务扩缩策略中指定的目标容量达到峰值时,自动扩缩组会横向扩展并启动实例。但是,如果指标值在突然飙升后下降,则自动扩缩组会横向缩减实例。如果目标容量在短时间内频繁波动,则自动扩缩组将陷入扩缩循环。要避免此问题,请配置目标容量值,使其与您的工作负载相匹配。

相关信息

Deep dive on Amazon ECS cluster auto scaling

如何解决删除 Amazon ECS 中的容量提供商时出现的错误?

AWS Fargate 启动类型的 Amazon ECS 集群

AWS 官方
AWS 官方已更新 3 个月前