Может ли кто-нибудь пролить свет на то, почему мой стек ECS не масштабирует новые экземпляры EC2?
Я настроил свой стек ECS с помощью Cloudformation.Начальная конфигурация работает нормально.Как только я запускаю свой стек, запускается процесс, который поддерживает нагрузку на процессор> 90%, так что аварийный сигнал о масштабировании может сработать в целях тестирования.
Я настроил сигнализацию масштабирования для запускаПолитика масштабирования, когда ЦП> 15%, и масштабирование в политике сработают, когда ЦП <4%. </p>
В сообщениях журнала сообщается следующее:
Сообщение: служба ECSService-12BBO1EE3SRUF не удалось разместить задачу, поскольку ни один контейнерный экземпляр не удовлетворял всем его требованиям.У ближайшего соответствующего экземпляра контейнера 149e8eea-a8bc-433f-abbb-9a49c3a3c5b5 недостаточно памяти.Для получения дополнительной информации см. Раздел «Устранение неполадок».Сообщение: Успешно установите желаемое количество на 2. Ожидание изменения, которое будет выполнено ecsПричина: отслеживать тревогу Использование ЦП более 5% в состоянии. Политика срабатывания ALARM ServiceScaleOutPolicy 155194fc-ee07-46ff-a822-018bd704602b
Похоже, что ECS пытается разместить больше задач в одном экземпляре вместомасштабирование количества экземпляров и размещение новой задачи в новом экземпляре.Как заставить ECS масштабироваться до нового экземпляра и помещать новую задачу в новый экземпляр?
Моя конфигурация масштабирования облачной информации выглядит следующим образом:
ECSAutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
DependsOn: ECSALB
Properties:
VPCZoneIdentifier: !Ref 'SubnetId'
LaunchConfigurationName: !Ref 'ContainerInstances'
MinSize: !Ref 'DesiredCapacity'
MaxSize: !Ref 'MaxSize'
DesiredCapacity: !Ref 'DesiredCapacity'
HealthCheckGracePeriod: 320
CreationPolicy:
ResourceSignal:
Timeout: PT15M
UpdatePolicy:
AutoScalingReplacingUpdate:
WillReplace: 'true'
AutoScalingRollingUpdate:
MinInstancesInService: '1'
MaxBatchSize: '1'
PauseTime: PT15M
WaitOnResourceSignals: 'true'
ServiceScalingTarget:
Type: AWS::ApplicationAutoScaling::ScalableTarget
DependsOn: ECSService
Properties:
MaxCapacity: 3
MinCapacity: 1
ResourceId: !Join ['', [service/, !Ref 'ECSCluster', /, !GetAtt [ECSService, Name]]]
RoleARN: !GetAtt [AutoscalingRole, Arn]
ScalableDimension: ecs:service:DesiredCount
ServiceNamespace: ecs
ServiceScaleOutPolicy:
Type : "AWS::ApplicationAutoScaling::ScalingPolicy"
Properties:
PolicyName: ServiceScaleOutPolicy
PolicyType: StepScaling
ScalingTargetId: !Ref 'ServiceScalingTarget'
StepScalingPolicyConfiguration:
AdjustmentType: ChangeInCapacity
Cooldown: 60
MetricAggregationType: Average
StepAdjustments:
- MetricIntervalLowerBound: 0
ScalingAdjustment: 1
ServiceScaleInPolicy:
Type : "AWS::ApplicationAutoScaling::ScalingPolicy"
Properties:
PolicyName: ServiceScaleInPolicy
PolicyType: StepScaling
ScalingTargetId: !Ref 'ServiceScalingTarget'
StepScalingPolicyConfiguration:
AdjustmentType: ChangeInCapacity
Cooldown: 60
MetricAggregationType: Average
StepAdjustments:
- MetricIntervalUpperBound: 0
ScalingAdjustment: -1
CPUScaleOutAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: CPU utilization greater than 15%
AlarmDescription: Alarm if cpu utilization greater than 15% of reserved cpu
Namespace: AWS/ECS
MetricName: CPUUtilization
Dimensions:
- Name: ClusterName
Value: !Ref ECSCluster
- Name: ServiceName
Value: !GetAtt ECSService.Name
Statistic: Maximum
Period: '60'
EvaluationPeriods: '1'
Threshold: '15'
ComparisonOperator: GreaterThanThreshold
AlarmActions:
- !Ref ServiceScaleOutPolicy
CPUScaleInAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: CPU utilization less than 4%
AlarmDescription: Alarm if cpu utilization greater than 4% of reserved cpu
Namespace: AWS/ECS
MetricName: CPUUtilization
Dimensions:
- Name: ClusterName
Value: !Ref ECSCluster
- Name: ServiceName
Value: !GetAtt ECSService.Name
Statistic: Maximum
Period: '60'
EvaluationPeriods: '4'
Threshold: '4'
ComparisonOperator: LessThanThreshold
AlarmActions:
- !Ref ServiceScaleInPolicy
AutoscalingRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Principal:
Service: [application-autoscaling.amazonaws.com]
Action: ['sts:AssumeRole']
Path: /
Policies:
- PolicyName: service-autoscaling
PolicyDocument:
Statement:
- Effect: Allow
Action: ['application-autoscaling:*', 'cloudwatch:DescribeAlarms', 'cloudwatch:PutMetricAlarm',
'ecs:DescribeServices', 'ecs:UpdateService']
Resource: '*'
TaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
Family: !Join ['', [!Ref 'AWS::StackName', -frontend-task]]
ContainerDefinitions:
- Name: nginx-container
Image: nginx:latest
Cpu: '64'
Memory: '150'
Essential: 'true'
Links:
- "kestrel-container"
MountPoints:
- SourceVolume: "volume-nginx-conf"
ContainerPath: "/etc/nginx/conf.d/default.conf"
LogConfiguration:
LogDriver: awslogs
Options:
awslogs-group: !Ref 'CloudwatchLogsGroup'
awslogs-region: !Ref 'AWS::Region'
awslogs-stream-prefix: task-nginx-container
PortMappings:
- ContainerPort: 80
- ContainerPort: 443
- Name: kestrel-container
Image: some-image
Cpu: '940'
Memory: '512'
Essential: 'false'
LogConfiguration:
LogDriver: awslogs
Options:
awslogs-group: !Ref 'CloudwatchLogsGroup'
awslogs-region: !Ref 'AWS::Region'
awslogs-stream-prefix: task-kestrel-container
PortMappings:
- ContainerPort: 5443
Volumes:
- Host:
SourcePath: "/docker-volumes/nginx/nginx.conf"
Name: "volume-nginx-conf"