ECS 集群容量提供商管理的 AWS AutoScaling 组由于保护而无法扩展

问题描述 投票:0回答:1

我有一个由自动扩展组中的 EC2 计算机支持的 ECS 集群。

集群使用 CloudFormation 中描述的容量提供程序,代码如下:

  CapacityProvider:
    Type: AWS::ECS::CapacityProvider
    Condition: EnableInstanceAutoScaling
    Properties:
      AutoScalingGroupProvider:
        AutoScalingGroupArn: !Ref InstanceAutoScalingGroup
        ManagedScaling:
          MaximumScalingStepSize: 10
          MinimumScalingStepSize: 1
          Status: ENABLED
          TargetCapacity: 100
        ManagedTerminationProtection: ENABLED

请注意,

ManagedScaling
ManagedTerminationProtection
都是
ENABLED

现在,在this之后,我还将

NewInstancesProtectedFromScaleIn
设置为
true

如果在创建容量提供程序时启用了托管终止保护,则 Auto Scaling 组和 Auto Scaling 组中的每个 Amazon EC2 实例也必须启用实例保护以防止扩展。

一切正常,但有时 EC2 实例卡在 ASG 内:

  • 它们已从 ECS 集群中取消注册(也即不再在那里列出);
  • 他们仍然启用了缩减保护;
  • ASG 无法终止他们:

并非所有情况都会发生这种情况,只会发生在某些情况下,我不知道是哪些情况。我没有任何生命周期挂钩。这会导致 ASG 充满未使用的资源(等于金钱),直到它无法再横向扩展,因为它已达到最大容量。

然后我还发现了this关于Batch的类似问题的帖子,其中建议的答案是禁用ASG缩减保护。

关于如何诊断/解决问题有什么建议吗?

*P.S. 在此期间,ASG 将设置所需的容量,例如1 并积极尝试扩大规模。

amazon-web-services amazon-ec2 amazon-ecs aws-auto-scaling
1个回答
0
投票

您好,我是 ECS 团队的 AWS 员工。

这是一个已知问题,因为 EC2 实例不再运行任务时,ECS 不会立即将其从终止保护中释放。存在一段冷却延迟,之后 ECS 异步解除实例的终止保护并允许其停止。通常,这种冷却延迟非常好,因为它可以防止您不断地搅动 EC2 实例,而您只需将 EC2 实例保留几分钟,然后将同一实例重复用于需要启动的下一个任务。

但是,当拆除 CloudFormation 堆栈时,CloudFormation 将删除

AWS::ECS::Service
并立即继续拆除
AWS::ECS::Cluster
,从而在 ECS 有机会异步关闭托管实例之前过快地将
AWS::AutoScaling::AutoScalingGroup
与 ECS 管理断开连接对 EC2 实例的保护。

这将使一些 EC2 实例陷入永远无法缩减的状态。这会阻止

AWS::AutoScaling::AutoScalingGroup
自行清理。

幸运的是,我为您提供了一个自动化解决方案。您可以使用自定义资源函数,在拆除堆栈时强制销毁自动伸缩组,从而避免受保护的 EC2 实例永远无法清理的问题。

您可以在此处找到包含说明的完整参考架构:https://containersonaws.com/pattern/ecs-ec2-capacity-provider-scaling

或者只需查看 Github 上的代码:https://github.com/aws-samples/container-patterns/blob/main/pattern/ecs-ec2-capacity-provider-scaling/files/cluster-capacity-提供者.yml#L48-L123

© www.soinside.com 2019 - 2024. All rights reserved.