Простой способ настройки экземпляров 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/