我正计划在Fargate上使用AWS Elastic Container Service部署Docker容器。
我无法找到有关暂停泊坞容器和相关结算的任何有价值的信息。
是否可以在Fargate上暂停Docker容器,以便节省CPU /内存费用?用例是不时使用容器,但不想重新生成新容器,只需暂停并恢复现有容器即可。 类似于DigitalOcean的快照。
答案 0 :(得分:0)
您可能已经在Task Lifecycle上看到过,没有PAUSED
状态,所以没有,不可能暂停和恢复任务。
最好的方法是定义一个自动缩放策略,该策略可以为您管理活动的任务,并且非常适合节省CPU /内存费用。
由于您的用例会不时需要这些容器,因此诀窍是定义“如何理解我何时需要它们”。例如,您可以将某些内容推送到SQS队列中,仅在队列中至少有1个元素时才生成2个任务。处理完成后,自动缩放策略将终止该任务,您将完全不用支付任何费用。
使用CloudFormation,您可以这样定义目标服务:
ECSTarget:
Type: AWS::ApplicationAutoScaling::ScalableTarget
Properties:
MaxCapacity: 2
MinCapacity: 0
ResourceId: !Join ["/", [service, !Ref MyCluster, !GetAtt [MyService, Name]]]
RoleARN: !GetAtt [ EcsAutoScalingRole, Arn ]
ScalableDimension: ecs:service:DesiredCount
ServiceNamespace: ecs
定义放大和缩小的规则
ECSScaleUp:
Type: AWS::ApplicationAutoScaling::ScalingPolicy
Properties:
PolicyName: !Join ['-', ['MyService', 'ScaleUpPolicy']]
PolicyType: StepScaling
ScalingTargetId: !Ref ECSTarget
StepScalingPolicyConfiguration:
Cooldown: 30
MetricAggregationType: "Average"
AdjustmentType: "ExactCapacity"
StepAdjustments:
- MetricIntervalLowerBound: 0
ScalingAdjustment: 2
ECSScaleDown:
Type: AWS::ApplicationAutoScaling::ScalingPolicy
Properties:
PolicyName: !Join ['-', ['MyService', 'ScaleDownPolicy']]
PolicyType: StepScaling
ScalingTargetId: !Ref ECSTarget
StepScalingPolicyConfiguration:
Cooldown: 30
MetricAggregationType: "Average"
AdjustmentType: "ExactCapacity"
StepAdjustments:
- MetricIntervalUpperBound: -1
ScalingAdjustment: 0
然后定义一个警报以触发自动缩放
ECSSQSAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Join ['-', [!Ref 'MyService', 'SQSAlarm']]
AlarmDescription: "Trigger ECS Service Scaling based on SQS queue"
Namespace: "AWS/SQS"
MetricName: "ApproximateNumberOfMessagesVisible"
ComparisonOperator: "GreaterThanThreshold"
Dimensions:
- Name: QueueName
Value: !GetAtt [ MyQueue, QueueName]
EvaluationPeriods: 2
Period: 60
Statistic: 'Average'
Threshold: 1
AlarmActions:
- !Ref ECSWorkerScaleUp
- !Ref ECSWorkerScaleDown
OKActions:
- !Ref ECSWorkerScaleUp
- !Ref ECSWorkerScaleDown