如何限制ASG中的即时实例池的数量?

时间:2019-04-03 14:10:22

标签: amazon-web-services amazon-ec2 autoscaling amazon-ec2-spot-market

我正在使用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

在每种情况下,我期望池的数量等于参数值。

2 个答案:

答案 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)中不同实例类型的最大数量。

考虑到这一点,示例结果更有意义。

SpotInstancePools1时,每个可用区中的实例类型不超过一种。

SpotInstancesPools5时,us-west-2a有3种实例类型,us-west-2b有4种实例类型,us-west-2c有4种实例类型。

就我而言,设置四个以上的池可能没有什么区别,因为替代列表中只有4种实例类型。

为什么us-west-2d中没有实例?在撰写本文时,该示例中使用的实例类型在该可用区中不可用。尝试启动一个会导致错误。