考慮到您已經創建了ECS集羣,AWS提供了關於Scaling cluster instances with CloudWatch Alarms的說明。
假設要縮放基於內存預留集羣,在較高的水平,你需要做到以下幾點:
- 爲您自動縮放集團創建啓動配置。這
- 創建一個Auto Scaling組,以便可以擴大和縮小羣集的大小。
- 創建CloudWatch的警報規模集羣了,如果內存預留超過70%
- 創建CloudWatch的警報規模集羣下來,如果內存預留下30%
因爲它更多我的專業,我寫了一個例子CloudFormation模板應該讓你開始對這個最:
Parameters:
MinInstances:
Type: Number
MaxInstances:
Type: Number
InstanceType:
Type: String
AllowedValues:
- t2.nano
- t2.micro
- t2.small
- t2.medium
- t2.large
VpcSubnetIds:
Type: String
Mappings:
EcsInstanceAmis:
us-east-2:
Ami: ami-1c002379
us-east-1:
Ami: ami-9eb4b1e5
us-west-2:
Ami: ami-1d668865
us-west-1:
Ami: ami-4a2c192a
eu-west-2:
Ami: ami-cb1101af
eu-west-1:
Ami: ami-8fcc32f6
eu-central-1:
Ami: ami-0460cb6b
ap-northeast-1:
Ami: ami-b743bed1
ap-southeast-2:
Ami: ami-c1a6bda2
ap-southeast-1:
Ami: ami-9d1f7efe
ca-central-1:
Ami: ami-b677c9d2
Resources:
Cluster:
Type: AWS::ECS::Cluster
Role:
Type: AWS::IAM::Role
Properties:
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
-
Effect: Allow
Action:
- sts:AssumeRole
Principal:
Service:
- ec2.amazonaws.com
InstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Path:/
Roles:
- !Ref Role
LaunchConfiguration:
Type: AWS::AutoScaling::LaunchConfiguration
Properties:
ImageId: !FindInMap [EcsInstanceAmis, !Ref "AWS::Region", Ami]
InstanceType: !Ref InstanceType
IamInstanceProfile: !Ref InstanceProfile
UserData:
Fn::Base64: !Sub |
#!/bin/bash
echo ECS_CLUSTER=${Cluster} >> /etc/ecs/ecs.config
AutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
MinSize: !Ref MinInstances
MaxSize: !Ref MaxInstances
LaunchConfigurationName: !Ref LaunchConfiguration
HealthCheckGracePeriod: 300
HealthCheckType: EC2
VPCZoneIdentifier: !Split [",", !Ref VpcSubnetIds]
ScaleUpPolicy:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
AdjustmentType: ChangeInCapacity
AutoScalingGroupName: !Ref AutoScalingGroup
Cooldown: '1'
ScalingAdjustment: '1'
MemoryReservationAlarmHigh:
Type: AWS::CloudWatch::Alarm
Properties:
EvaluationPeriods: '2'
Statistic: Average
Threshold: '70'
AlarmDescription: Alarm if Cluster Memory Reservation is to high
Period: '60'
AlarmActions:
- Ref: ScaleUpPolicy
Namespace: AWS/ECS
Dimensions:
- Name: ClusterName
Value: !Ref Cluster
ComparisonOperator: GreaterThanThreshold
MetricName: MemoryReservation
ScaleDownPolicy:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
AdjustmentType: ChangeInCapacity
AutoScalingGroupName: !Ref AutoScalingGroup
Cooldown: '1'
ScalingAdjustment: '-1'
MemoryReservationAlarmLow:
Type: AWS::CloudWatch::Alarm
Properties:
EvaluationPeriods: '2'
Statistic: Average
Threshold: '30'
AlarmDescription: Alarm if Cluster Memory Reservation is to Low
Period: '60'
AlarmActions:
- Ref: ScaleDownPolicy
Namespace: AWS/ECS
Dimensions:
- Name: ClusterName
Value: !Ref Cluster
ComparisonOperator: LessThanThreshold
MetricName: MemoryReservation
這將創建一個精英集羣,一個啓動配置,自動縮放集團,以及報警基礎上,ECS MEMOR Ÿ預訂。
現在我們可以進入有趣的討論。
爲什麼我們不能根據CPU利用率進行擴展和內存預留?
簡短的回答是你完全可以但是你很可能會爲此付出很多。 EC2有一個已知屬性,當您創建一個實例時,您至少需要支付1小時,因爲部分實例小時數按整小時收費。爲什麼這是相關的,想象你有多個警報。假設您有一堆當前正在閒置的服務,並且您將填充羣集。 「CPU警報」會縮小羣集,或者「內存警報」會擴大羣集。其中一種可能會使集羣擴展到不再觸發報警的程度。冷卻時間結束後,另一個警報將撤銷它的最後一個動作,在下一次冷卻後,動作可能會重新進行。因此,創建實例然後在其他冷卻時間中重複銷燬。
在對此進行了一番思考之後,我想到的策略是使用基於CPU利用率的Application Autoscaling for ECS Services以及基於集羣的內存預留。所以如果一個服務運行的很熱,一個額外的任務將被添加來共享負載。這將緩慢填充羣集內存預留容量。當內存滿了時,集羣會擴大。當服務正在冷卻時,服務將開始關閉任務。隨着羣集上的內存預留量下降,羣集將被縮小。
CloudWatch警報的閾值可能需要根據您的任務定義進行試驗。原因在於,如果您將擴展閾值設置得過高,當內存消耗完後可能無法擴展,然後在自動縮放執行另一項任務時,會發現沒有足夠的內存可用實例在集羣中,因此無法放置其他任務。
哪個更重要,CPU還是內存?如果CPU規模放大,應該發生什麼,但內存是否縮小? –
謝謝傑米。我會說我的情況的記憶。在ECS中,有一個儀表板顯示多少CPU單元/內存分配與未分配。我認爲這是基於容器的任務定義。我想根據這些ECS指標進行擴展 – codeshark