Как ограничить количество пулов спота в ASG?

Я настраиваю группу автоматического масштабирования (ASG) со смешанной политикой экземпляров, чтобы использовать несколько типов точечных экземпляров. Как ограничить количество пулов точечных экземпляров, используемых моей ASG?

Пулы спотовых экземпляров определяются следующим образом:

Набор неиспользуемых экземпляров EC2 с одинаковым типом экземпляра (например, m5.large), операционная система, зона доступности и сетевая платформа.

Я понимаю, что в моем случае пул точечных экземпляров - это, по сути, отдельная пара зоны доступности и типа экземпляра.

Мой шаблон 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 ответа

Решение

То, что вы видите, - это нормальное поведение, описанное в примечаниях к выпуску функции: https://aws.amazon.com/blogs/aws/new-ec2-auto-scaling-groups-with-multiple-instance-types-purchase-options/

Ключевой параграф:

Стратегия выделения спотов - контролируйте количество разнесения в расчете на единицу для экземпляров спот. Большее число добавляет некоторую гибкость в случаях, когда конкретный тип экземпляра пользуется высоким спросом в пределах AZ.

Весовое влияние на то, как идентифицируются и группируются экземпляры, объясняется здесь: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet.html

Вы можете изменить / принудительно включить, среди других функций, InstanceType и AvailabilityZone, установив некоторые ограничения в Overrides раздел вашего шаблона, как указано здесь: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-instancesdistribution.html

Таким образом, в этом нет ничего плохого, но вы можете добавить некоторые ограничения, чтобы сделать пулы равными параметрам, если это предпочтительнее.

Как указывает Ласлейд, ASG SpotInstancePools свойство контролирует количество пулов на зону доступности.

Моя предпосылка, основанная на документации, была ложной. В моем случае количество пулов - это максимальное количество разных типов экземпляров в каждой зоне доступности (AZ).

Результаты примера имеют больше смысла с учетом этого.

когда SpotInstancePools было 1в каждом АЗ было не более одного типа экземпляра.

когда SpotInstancesPools было 5было 3 типа экземпляров us-west-2a, 4 типа экземпляров в us-west-2b и 4 типа экземпляров в us-west-2c.

В моем случае, вероятно, не имеет значения устанавливать более 4 пулов, потому что в списке переопределений есть только 4 типа экземпляров.

Почему в us-west-2d нет экземпляров? На момент написания, типы экземпляров, использованные в этом примере, были недоступны в этом AZ. Попытка запустить один приведет к ошибке.

Другие вопросы по тегам