如何限制 ASG 中 Spot 实例池的数量?
Posted
技术标签:
【中文标题】如何限制 ASG 中 Spot 实例池的数量?【英文标题】:How to limit the number of spot instace pools in an ASG? 【发布时间】:2019-08-25 02:28:58 【问题描述】:我正在使用 mixed instances policy 设置一个 Auto Scaling 组 (ASG) 以使用多种 Spot 实例类型。如何限制我的 ASG 使用的 Spot 实例池的数量?
Spot Instance pools定义如下:
一组具有相同实例类型(例如,
m5.large
)、操作系统、可用区和网络平台的未使用的 EC2 实例。
我了解,就我而言,Spot 实例池基本上是一对不同的可用区和实例类型。
我的 CloudFormation 模板使用混合实例策略创建一个包含 16 个实例的 Auto Scaling 组。它使用四种实例类型和所有可用区。测试区域us-west-2
有四个可用区。理论上,该组应该能够使用多达 16 个现场实例池。
堆栈的SpotInstancePools
参数设置ASG 的同名属性。我尝试将其设置为各种值,但它似乎并不能直接控制 ASG 使用的 Spot 实例池的数量。
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
列出使用的唯一 Spot 实例池数量的命令(根据需要替换堆栈名称):
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
在等待每个堆栈完成创建后,我会检查唯一 Spot 实例池的数量。
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
在每种情况下,我希望池的数量等于参数值。
【问题讨论】:
【参考方案1】:正如lasleyd 指出的那样,ASG 的SpotInstancePools
属性控制每个可用区的池数量。
我基于文档的前提是错误的。就我而言,池的数量是每个可用区 (AZ) 中不同实例类型的最大数量。
考虑到这一点,示例结果更有意义。
当SpotInstancePools
为1
时,每个可用区中的实例类型不超过一种。
当SpotInstancesPools
为5
时,us-west-2a 中有 3 个实例类型,us-west-2b 中有 4 个实例类型,us-west-2c 中有 4 个实例类型。
在我的例子中,设置超过 4 个池可能没有区别,因为覆盖列表中只有 4 个实例类型。
为什么 us-west-2d 中没有实例?在撰写本文时,该示例中使用的实例类型在该 AZ 中不可用。尝试启动一个会导致错误。
【讨论】:
【参考方案2】:您所看到的是功能发布说明中所述的正常行为: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
所以,这本身并没有什么问题,但是如果愿意,您可以添加一些约束以使池等于参数。
【讨论】:
我没有找到与此处相关的权重或覆盖,但博客文章确实包含关键信息:“控制 Spot 实例的每个可用区多样性的数量。”。如果您在回答中引用该信息,我会接受。谢谢! 关键是“per-AZ”部分,与现货实例池的文档相悖!知道为什么吗? 这可能会引起一些争论,但文档中的歧义来自这个有趣的免责声明:Amazon EC2 Auto Scaling 尝试在为您的 Auto Scaling 组启用的可用区之间平均分配实例... . 对于 VPC 中的 Auto Scaling 组,如果可用区中有多个子网,Amazon EC2 Auto Scaling 会从可用区中随机选择一个子网。 (来自docs.aws.amazon.com/autoscaling/ec2/userguide/…)。如果这有助于回答我将在上面添加的问题。 我确认了结果,并在我自己的回答中进行了更详细的解释。不过,你得到了赏金!感谢您指出。以上是关于如何限制 ASG 中 Spot 实例池的数量?的主要内容,如果未能解决你的问题,请参考以下文章