如何对我的 Amazon ECS 容量提供商的扩缩问题进行故障排除?
我为使用 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 会创建一个扩缩策略,该策略会根据集群负载修改容量。
要对扩缩策略问题进行故障排除,请查看 PutScalingPolicy、UpdateAutoScalingGroup、CreateCapacityProvider 和 UpdateCapacityProvider 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" } ] } ]
如果您使用托管扩缩策略,请完成以下步骤,以检查是否已将该策略附加到自动扩缩组:
- 打开 Amazon ECS 控制台。
- 在导航窗格中,选择 Clusters(集群)。
- 选择您的集群。
- 选择 Infrastructure(基础设施)选项卡。
- 选择 Capacity providers(容量提供商)选项卡。
- 选择您的自动扩缩组。
**注意:**此操作会将您重定向到 Amazon EC2 控制台中的 Auto Scaling groups(自动扩缩组)页面。 - 选择 Automatic scaling(自动扩缩)选项卡。
- 选择 Actions(操作),然后选择 Edit dynamic scaling policy(编辑动态扩缩策略)。
- 在 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

相关内容
- AWS 官方已更新 1 个月前
- AWS 官方已更新 10 个月前
- AWS 官方已更新 4 个月前
- AWS 官方已更新 1 年前