我正在使用mixed instances policy设置自动缩放组(ASG)以使用多种竞价型实例类型。如何限制ASG使用的竞价型实例池的数量?
Spot Instance pools的定义如下:
一组具有相同实例类型(例如
m5.large
),操作系统,可用区和网络平台的未使用的EC2实例。
我了解到,就我而言,竞价型实例池基本上是一对可用区和实例类型。
我的CloudFormation模板使用混合实例策略创建一个由16个实例组成的自动扩展组。它使用四种实例类型和所有可用性区域。测试区域us-west-2
有四个可用区。从理论上讲,该小组应该最多可以使用十六个现货债务池。
堆栈的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
在每种情况下,我期望池的数量等于参数值。
答案 0 :(得分:1)
您看到的是正常功能,如此处的功能发行说明所述:https://aws.amazon.com/blogs/aws/new-ec2-auto-scaling-groups-with-multiple-instance-types-purchase-options/
关键段落:
Spot分配策略–控制Spot实例的每个可用区多样性的数量。在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
因此,本质上没有什么问题,但是如果可以的话,您可以添加一些约束以使池等于参数。
答案 1 :(得分:0)
lasleyd指出,ASG的SpotInstancePools
属性控制每个可用性区域的池数。
基于文档的前提是错误的。就我而言,池的数量是每个可用区(AZ)中不同实例类型的最大数量。
考虑到这一点,示例结果更有意义。
当SpotInstancePools
为1
时,每个可用区中的实例类型不超过一种。
当SpotInstancesPools
为5
时,us-west-2a有3种实例类型,us-west-2b有4种实例类型,us-west-2c有4种实例类型。
就我而言,设置四个以上的池可能没有什么区别,因为替代列表中只有4种实例类型。
为什么us-west-2d中没有实例?在撰写本文时,该示例中使用的实例类型在该可用区中不可用。尝试启动一个会导致错误。