我正在使用mixed instances policy设置自动缩放组(ASG)以使用多个专色实例类型。如何限制ASG使用的专色实例池的数量?
Spot Instance pools定义如下:
一组具有相同实例类型的未使用的EC2实例(例如,
m5.large
),操作系统,可用区和网络平台。
据我所知,在我的情况下,spot实例池基本上是一对独特的可用区和实例类型。
我的CloudFormation模板使用混合实例策略创建一个包含16个实例的自动扩展组。它使用四种实例类型和所有可用区域。测试区域us-west-2
有四个可用区域。从理论上讲,该组应该能够使用多达16个现场池。
堆栈的SpotInstancePools
参数设置ASG的同名属性。我已经尝试将其设置为各种值,但它似乎并不直接控制ASG使用的专色实例池的数量。
CloudFormation模板:
AWSTemplateFormatVersion: '2010-09-09'
Description: Testing mixed instance policies
Parameters:
SpotInstancePools:
Type: Number
Default: 1
Description: The ASG's number of spot instance pools.
ImageId:
Type: AWS::EC2::Image::Id
Default: ami-061392db613a6357b
Description: Launch template's AMI. Defaults to Amazon Linux 2.
Resources:
AutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
AvailabilityZones: !GetAZs
MaxSize: 16
MinSize: 16
MixedInstancesPolicy:
InstancesDistribution:
OnDemandAllocationStrategy: prioritized
OnDemandBaseCapacity: 0
OnDemandPercentageAboveBaseCapacity: 0
SpotAllocationStrategy: lowest-price
SpotInstancePools: !Ref SpotInstancePools
SpotMaxPrice: ''
LaunchTemplate:
LaunchTemplateSpecification:
LaunchTemplateId: !Ref LaunchTemplate
Version: !GetAtt LaunchTemplate.LatestVersionNumber
Overrides:
- InstanceType: t2.small
- InstanceType: t3.small
- InstanceType: t2.medium
- InstanceType: t3.medium
LaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateData:
ImageId: !Ref ImageId
用于创建堆栈mixed-instances-policy-test-1
的命令,其SpotInstancePools计数为1:
aws cloudformation create-stack \
--stack-name mixed-instances-policy-test-1 \
--template-body file://mixed-instances-policy.yaml \
--parameters ParameterKey=SpotInstancePools,ParameterValue=1 \
--region us-west-2 \
--profile test
用于创建堆栈mixed-instances-policy-5
的命令,其SpotInstancePools计数为5:
aws cloudformation create-stack \
--stack-name mixed-instances-policy-test-5 \
--template-body file://mixed-instances-policy.yaml \
--parameters ParameterKey=SpotInstancePools,ParameterValue=5 \
--region us-west-2 \
--profile test
用于列出所使用的唯一专色实例池数的命令(根据需要替换堆栈名称):
aws ec2 describe-instances \
--filters 'Name=tag:aws:cloudformation:stack-name,Values=mixed-instances-policy-test-1' \
--query 'Reservations[].Instances[].[InstanceType, Placement.AvailabilityZone]' \
--output text \
--region us-west-2 \
--profile test |
sort |
uniq --count
等待每个堆栈完成创建后,我检查唯一的实例池数量。
在SpotInstancePools
设置为1
的地方,我看到3个独特的池。
5 t2.small us-west-2a
5 t3.small us-west-2b
6 t3.small us-west-2c
在SpotInstancePools
设置为5
的地方,我看到11个独特的池。
2 t2.medium us-west-2a
1 t2.medium us-west-2b
1 t2.medium us-west-2c
2 t2.small us-west-2a
2 t2.small us-west-2b
1 t2.small us-west-2c
1 t3.medium us-west-2a
1 t3.medium us-west-2b
1 t3.medium us-west-2c
2 t3.small us-west-2b
2 t3.small us-west-2c
在每种情况下,我希望池的数量等于参数值。
您所看到的是正常行为,如此处的功能发行说明中所述:https://aws.amazon.com/blogs/aws/new-ec2-auto-scaling-groups-with-multiple-instance-types-purchase-options/
关键段落:
现货分配策略 - 控制竞价型实例的每个AZ多样性的数量。当AZ中的特定实例类型需求量很大时,较大的数字会增加一些灵活性。
这里解释了如何识别和分组实例的权重影响:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet.html#spot-instance-weighting
您可以通过在模板的Overrides
部分中放置一些限制来修改/强制InstanceType和AvailabilityZone以及其他功能,如下所示:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-instancesdistribution.html#cfn-as-mixedinstancespolicy-spotinstancepools
所以,本身并没有什么不妥,但你可以添加一些约束来使池等于参数,如果这是首选的话。
正如lasleyd指出的那样,ASG的SpotInstancePools
属性控制着每个可用区域的池数。
我基于文档的前提是错误的。在我的例子中,池的数量是每个可用区(AZ)中不同实例类型的最大数量。
考虑到这一点,示例结果更有意义。
当SpotInstancePools
是1
时,每个AZ中只有一个实例类型。
当SpotInstancesPools
是5
时,有3个实例类型us-west-2a,us-west-2b中有4个实例类型,us-west-2c中有4个实例类型。
在我的情况下,设置4个以上的池可能没什么区别,因为覆盖列表中只有4个实例类型。
为什么us-west-2d中没有实例?在撰写本文时,该示例中使用的实例类型在该AZ中不可用。尝试启动一个会导致错误。