Использование AWS Fargate Spot позволяет сэкономить до 70% на приложениях ECS

Простой способ настройки экземпляров Fargate Spot для контейнеров ECS с помощью консоли или CloudFormation

Я написал эту статью после выявления потребности в компании, где я работаю, и считаю, что она может быть полезна для тех, кто ежедневно использует Elastic Container Service (ECS) и хочет сократить расходы, особенно в средах разработки и омологации, как это было в моем случае!

Прежде всего, ECS — это контейнерный оркестратор, который позволяет предоставлять приложения простым и быстрым способом, обеспечивая масштабируемость и быстрое развертывание. С его помощью можно использовать экземпляры EC2, где инфраструктура находится на нашем аккаунте, или через AWS Fargate, где клиенту не нужно управлять машинами (мы будем использовать второй вариант).

В 2019 году была запущена система Fargate Spot, которая следует той же концепции, что и Spot instances для Amazon EC2, и стремится предложить экономически эффективный способ для пользователей облака, предоставляя мощности, не используемые AWS. Таким образом, когда запрашиваются экземпляры Spot, они будут черпаться из этой незанятой емкости. Клиенты, приобретающие выделенные экземпляры, имеют предпочтение к таким ресурсам, поэтому данная мощность может быть изъята в любой момент, чтобы эти клиенты, выбравшие более дорогой вариант, могли ею воспользоваться. Вы получите уведомление за две минуты до того, как AWS потребует вернуть эти ресурсы. Однако основной причиной использования Spot Instances является сокращение расходов, цена (за час процессора и ГБ) Task Spot является переменной, со скидкой от 50% до 70% по сравнению с ценой задачи по требованию. Поэтому не волнуйтесь, определив правильную стратегию, ваша система не останется недоступной. Однако перед использованием в продуктивной среде хорошо продумайте стратегию, которую будете реализовывать, чтобы избежать проблем с периодической недоступностью (📝# совет от Жана).

Как я всегда стараюсь в своих статьях, для практического примера давайте загрузим приложение Spring Boot с инфраструктурой, созданной с помощью CloudFormation.

Итак, объяснив основные понятия, давайте начнем создавать необходимые ресурсы в нашей AWS Console, а если вы хотите перейти к шаблону CloudFormation, нажмите здесь.

Существует два типа конфигурации, один из которых относится к кластеру и будет реплицироваться на все службы внутри него, а другой — для конкретной службы. Если ваш кластер имеет несколько служб, а вы хотите реализовать эту стратегию только в одной, в этом случае вам не нужно настраивать кластер, только службу.

Создание кластера

Здесь мы настроим его для принятия стратегии Fargate Spot. На вкладке Elastic Container Service выберите опцию «Только сеть».

После инициализации кластера мы можем убедиться, что по умолчанию наши провайдеры мощностей уже настроены на прием обоих: FARGATE ** и **FARGATE_SPOT.

Чтобы определить, какие стратегии мы хотим использовать, необходимо нажать на кнопку «Обновить» в правом верхнем углу.

На этом экране конфигурации мы выбираем стратегию, которую будет использовать наш кластер, в данном случае я выбрал обоих поставщиков мощностей. Я установил вес 1 для FARGATE и 5 для FARGATE_SPOT. При этих значениях для каждых шести задач пять запускаются на FARGATE_SPOT и одна на FARGATE. Конечно, вы должны выбрать стратегию, которая лучше всего соответствует вашим потребностям, что также будет зависеть от того, в какой среде вы выполняете эти модификации. Например, среда разработки имеет меньше потребностей в экземплярах только FARGATE, и чем больше Spots, тем меньше счет в конце месяца.

CloudFormation: Кластер

Чтобы настроить Fargate Spot с помощью CloudFormation, мы должны добавить атрибуты CapacityProvider к нашему кластеру, в которых мы определяем вес, который должна иметь каждая стратегия, как мы это делали в AWS Console.

EcsCluster:
  Type: 'AWS::ECS::Cluster'
  Properties:
    ClusterName: !Sub '${EcsClusterName}'
    CapacityProviders:
      - FARGATE
      - FARGATE_SPOT
    DefaultCapacityProviderStrategy:
      - CapacityProvider: FARGATE
        Weight: 1
      - CapacityProvider: FARGATE_SPOT
        Weight: 1
Войдите в полноэкранный режим Выход из полноэкранного режима

Создание определения задачи

С левой стороны нажмите на «Task Definitions», давайте создадим новый тип задачи «FARGATE», в данном случае это первый вариант:

Выполните основные настройки роли, сети и операционной системы, а также конфигурацию контейнера, который будет использоваться. Для моделирования я создал образ в Amazon Elastic Container Registry (ECR) с приложением SpringBoot внутри, вы можете использовать его или сделать это с помощью собственного образа.

ECR Public Gallery — digimonapi

В этом шаге нам не нужно настраивать ничего, связанного с экземпляром Fargate Spot, просто убедитесь, что выбранная опция — «Fargate».

CloudFormation: определение задачи

В Cloudformation необходимо добавить атрибут «RequiresCompatibilities», равный FARGATE.

TaskDefinition:
  Type: 'AWS::ECS::TaskDefinition'
  Properties:
    ContainerDefinitions:
      - Name: !Sub '${ContainerName}'
        Image: !Ref ImageDocker
        PortMappings:
          - ContainerPort: !Ref ListenerContainerPort
            HostPort: !Ref ListenerContainerPort
        Cpu: !Ref ContainerCpu
        Memory: !Ref ContainerMemory
        MemoryReservation: !Ref ContainerMemoryReservation
        Essential: true
    Family: !Sub 'family-${FeatureName}-${MicroServiceName}'
    NetworkMode: awsvpc
    Memory: !Ref ContainerMemoryReservation
    Cpu: !Ref ContainerCpu
    ExecutionRoleArn: !GetAtt TaskExecutionRole.Arn
    TaskRoleArn: !Ref TaskExecutionRole
    RequiresCompatibilities:
      - FARGATE
Войдите в полноэкранный режим Выход из полноэкранного режима

Создание службы

Теперь давайте создадим службу, чтобы лучше управлять Задачами, которые будут выполняться. Зайдите в свой кластер, перейдите на вкладку «Услуги» и нажмите «Создать». Мы можем выполнить ту же конфигурацию стратегии, что и для кластера на уровне службы.

CloudFormation: Сервис

Конфигурация здесь также очень похожа, мы передадим «CapacityProvider», создав пользовательскую стратегию для этой службы.

Service:
  Type: "AWS::ECS::Service"
  Properties:
    ServiceName: !Sub service-${FeatureName}-${MicroServiceName}
    Cluster: !Ref EcsClusterName
    DeploymentConfiguration:
      MinimumHealthyPercent: 100
      MaximumPercent: 200
    DesiredCount: 2
    HealthCheckGracePeriodSeconds: 40
    CapacityProviderStrategy:
      - CapacityProvider: FARGATE_SPOT
        Weight: 5
      - CapacityProvider: FARGATE
        Weight: 1
    PlatformVersion: '1.4.0'
    LoadBalancers:
      - ContainerName: !Sub ${ContainerName}
        ContainerPort: !Ref ListenerContainerPort
        TargetGroupArn: !Ref TargetGroup
    SchedulingStrategy: REPLICA
    TaskDefinition: !Ref TaskDefinition
    NetworkConfiguration:
      AwsvpcConfiguration:
        AssignPublicIp: ENABLED
        SecurityGroups:
          - !Ref SecurityGroup
        Subnets: !Ref PrivateSubnets
Войдите в полноэкранный режим Выход из полноэкранного режима

Запуск приложений

Когда все настроено, давайте активируем нашу службу для предоставления новых экземпляров и понаблюдаем за их поведением.

Получив доступ к задачам для более детального просмотра, мы можем проверить, какие из них были предоставлены как FARGATE_SPOT. Первая — как FARGATE, а со второй задачи мы уже имеем скидку от 50% до 70% на каждую выполняемую задачу.

Примеры, описанные в этой статье, более подробно описаны в следующем репозитории (по любым вопросам открывайте Issue или комментарий):

Репозиторий GitHub
https://github.com/jjeanjacques10/springboot-ecs-fargate

Заключение

Следуя этому пошаговому подходу, мы можем предоставлять задачи в наших ECS по льготной цене в облаке AWS. В ходе проведенных мной тестов я увидел, что разница в стоимости составила в среднем 72%. Конечно, в некоторых случаях этот подход не самый лучший, в основном потому, что эти ресурсы могут быть запрошены AWS, когда это необходимо. Поэтому проанализируйте, что имеет наибольший смысл для вашего текущего сценария и потребностей.

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

Я хотел бы поблагодарить Камилу Перес за то, что она познакомила меня с этой концепцией и побудила углубиться в исследования.


Если у вас есть критика, предложения или сомнения, не стесняйтесь отправить мне сообщение:

Linkedin: https://www.linkedin.com/in/jjean-jacques10/

До следующего раза!

Ссылки

  • AWS Fargate Spot стал общедоступным | AWS News Blog (amazon.com) https://aws.amazon.com/blogs/aws/aws-fargate-spot-now-generally-available/

  • Сравнение цен AWS Fargate Spot vs. Fargate https://tomgregory.com/aws-fargate-spot-vs-fargate-price-comparison/

  • Полностью управляемое контейнерное решение — Amazon Elastic Container Service (Amazon ECS) — Amazon Web Serviceshttps://aws.amazon.com/ecs/

  • Предоставление инфраструктуры как кода — AWS CloudFormation — Amazon Web Services https://aws.amazon.com/cloudformation/

  • Проблемы с Фаргейт Спот — Фабрика весов https://www.scalefactory.com/blog/2020/07/27/the-trouble-with-fargate-spot/

Оцените статью
devanswers.ru
Добавить комментарий