Запуск парка EC2 в нескольких подсетях

#amazon-web-services #amazon-ec2

#amazon-веб-сервисы #amazon-ec2

Вопрос:

Я пытаюсь запустить парк EC2 из ~ 2000 экземпляров в нескольких подсетях, каждая подсеть в другом AZ, чтобы свести к минимуму разделение судьбы между экземплярами. Мы создаем парк со списком подсетей в конфигурации переопределения, но он выбирает одну подсеть из этого списка и пытается запустить все экземпляры в этой подсети.

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

Использование AWS Node.js SDK, вот код, который я пытаюсь использовать для запуска флота:

 /**
 * Launch an EC2 fleet.
 *
 * @param {object} params Params.
 * @param {number} params.count Number of instances to launch.
 * @param {string} params.launchTemplateName Name of template to launch.
 * @param {string} params.launchTemplateVersion Version of template to launch.
 * @param {string[]} params.subnetIds Array of subnets to launch the instances on.
 * @returns {Promise<PromiseResult<EC2.CreateFleetResult, AWSError>>}
 */
function launchFleet({ count, launchTemplateName, launchTemplateVersion, subnetIds }) {
  const ec2 = new AWS.EC2();
  const subnetId = subnetIds.join(',');
  return ec2
    .createFleet({
      TargetCapacitySpecification: {
        TotalTargetCapacity: count,
        OnDemandTargetCapacity: count,
        SpotTargetCapacity: 0,
        DefaultTargetCapacityType: 'on-demand',
      },
      LaunchTemplateConfigs: [
        {
          LaunchTemplateSpecification: {
            LaunchTemplateName: launchTemplateName,
            Version: launchTemplateVersion,
          },
          Overrides: [
            {
              SubnetId: subnetId,
            },
          ],
        },
      ],
      ExcessCapacityTerminationPolicy: 'no-termination',
      ReplaceUnhealthyInstances: false,
      Type: 'maintain',
    })
    .promise();
}
  

Комментарии:

1. Всегда ли выбирается первое значение в списке, разделенном запятыми? Если вы используете DescribeFleets() после его запуска, что он показывает для Overrides.SubnetId значения?

2. @JohnRotenstein, он запускается в любой из заданных подсетей, а не только в первой. Переопределения. SubnetId показывает тот же список, разделенный запятыми, который я передал в createFleet().

Ответ №1:

Я бы предложил использовать группы автоматического масштабирования вместо парка EC2, поскольку балансировка экземпляров по AZs является ключевым требованием. При использовании AWS SDK это должно быть простым изменением.

Другая вещь, которую я бы предложил, — использовать спотовые экземпляры вместо по требованию или сочетание того и другого для оптимизации затрат. Это возможно с помощью свойства MixedInstancesPolicy, и в качестве наилучшей практики вы можете использовать несколько типов экземпляров и оптимизированную по емкости стратегию as SpotAllocationStrategy, чтобы позволить ASG выбирать емкость из наиболее доступных пулов экземпляров.

Кроме того, ASG сможет поддерживать количество инстансов на желаемом уровне, заменяя любые прерванные инстансы Spot.

Комментарии:

1. Точечные экземпляры плохо подходят для нашего варианта использования. Каждый экземпляр отслеживает состояние и его нелегко заменить. Учитывая ценность наших отдельных экземпляров, я беспокоился о том, что ASG завершит или расширит их. Но, читая документы, похоже, что я могу установить защиту от завершения в ASG. Я попробую!