3

我正在设置一个具有混合实例策略的 Auto Scaling 组 (ASG)以使用多种 Spot 实例类型。如何限制我的 ASG 使用的 Spot 实例池的数量?

Spot 实例池定义如下:

一组具有相同实例类型(例如m5.large)、操作系统、可用区和网络平台的未使用的 EC2 实例。

我了解,就我而言,现货实例池基本上是一对不同的可用区和实例类型。

我的 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

创建 stack 的命令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

创建 stack 的命令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

WhereSpotInstancePools设置为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

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

4

2 回答 2

1

正如lasleyd指出的,ASG 的SpotInstancePools属性控制每个可用区的池数量。

我基于文档的前提是错误的。就我而言,池的数量是每个可用区 (AZ) 中不同实例类型的最大数量。

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

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

什么时候SpotInstancesPools5us-west-2a 中有 3 个实例类型,us-west-2b 中有 4 个实例类型,us-west-2c 中有 4 个实例类型。

在我的情况下,设置超过 4 个池可能没有区别,因为覆盖列表中只有 4 个实例类型。

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

于 2019-04-08T18:46:09.343 回答
1

您所看到的是此处功能发布说明中所述的正常行为:https ://aws.amazon.com/blogs/aws/new-ec2-auto-scaling-groups-with-multiple-instance-types-purchase -选项/

关键段落:

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

因此,本身并没有错,但是如果愿意,您可以添加一些约束以使池等于参数。

于 2019-04-07T00:42:53.333 回答