Найти тему

AWS Spot Instance: простые рекомендации для борьбы с прерываниями

Оглавление

Spot Instance от Amazon Web Services (AWS) — это незадействованный EC2, доступный нам по цене, ниже установленной. Это экономичный выбор, если вы можете быть гибкими во времени запуска ваших приложений и если вы готовы к их прерываниям.

По сути это — аукцион и на нем есть свои стратегии распределения Spot Instance, чтобы ваши расходы не выросли вдвое. Сегодня вместе с инженером по облачным сервисам и архитектором AWS Владимиром Самойловым разберемся, как не получить в декабре из-за праздничного ажиотажа дорогую систему, которая к тому же не застрахована от прерываний.

Spot Instance — это незадействованный EC2 (Elastic Compute Cloud), который выставляется на торги по минимальной цене. Его главный недостаток — в прерываниях, и вы всегда должны быть готовы к ним, как к постоянному явлению, которое точно произойдет. Прерывания для Spot Instance не есть что-то специфичное — это часть рабочего процесса, а не какой-то инцидент.

Есть три основных причины прерываний:

  1. Текущая цена стала выше той, которую вы готовы заплатить.
  2. Закончились spot Instance того типа, который вы используете.
  3. Дополнительные ограничения, которые вы сами установили. Например, сначала вы выставили все зоны доступности, но потом оставили только одну.

Информация о прерываниях будет доставляться через EC2 Metadata Service и EventBridge. С их помощью можно сделать какие-то обработки, но стоит помнить, что SLA у AWS на один инстанс — это всего лишь 90%, поэтому нужно ожидать прерываний во всех инстансах, а не только в спотах.

Добавить устойчивости и эластичности

Чтобы сделать ваши Spot Instance более устойчивыми и эластичными, используйте Auto Scaling Group. Тогда в случае прерывания можно завершить какие-то действия или, как минимум, получить новый инстанс взамен предыдущего.

Повысить вероятность запуска

AWS и сам по умолчанию использует разные типы инстансов. Но если вручную создать «Auto Scaling Group», то вы получите полный список типов возможных инстансов. И если какого-то типа у вас нет, то можно использовать другие. В некоторых случаях — даже их прошлые поколения.

У AWS есть статистика по всем типам со своей вероятностью прерывания по каждому региону. Поэтому начинать подбор Instance Type лучше всего с сервиса Spot Instance Advisor. Он подскажет какие типы лучше взять для каждого конкретного региона. На одной странице их можно быстро отсортировать — например, какие в прошлом месяце были меньше подвержены прерываниям.

Стратегии распределения Spot Instance

Есть несколько стратегий распределения. Они влияют на то, из каких Spot Pool (групп неиспользованных EC2, объединенных общей зоной доступности и типом) будет запущен Spot Instance.

Стратегия по умолчанию

По умолчанию стратегия распределения — это Capacity optimized. С ней вы получите Spot Instance из наиболее доступных Spot Instance Pool. При этом, если сочетать ее с Auto Scaling Group, то будет выбран только один тип на каждую зону доступности — который прервется с меньшей вероятностью.

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

Наименьшая цена

Эта стратегия позволит сделать выборку Spot Instance из нескольких Spot Instance Pool в каждой зоне доступности с наименьшей ценой за спот. Можно даже указать — из какого количества спотов. По умолчанию стоит два, а максимально можно установить 20 штук.

Это тоже хорошо сочетается с Auto Scaling Group и множеством типов, т.е мы можем получить разные типы инстансов в разных зонах доступности. Это удобно, но стоит помнить, что наименьшая цена предполагает наибольшее количество прерываний, потому что у нас уже не будет подсказок о том, какой Spot Pool имеет наименьшую вероятность прерывания.

Устойчивость с Capacity rebalance

С 5 ноября 2020 года появилась еще одна возможность повысить устойчивость спотов с помощью нового сигнала EC2 Rebalance Recommendation. Он может поступить раньше, чем стандартное двухминутное уведомление о прерывании Spot Instance. С его появлением EC2 Autoscaling выпустили новую функцию — Capacity rebalance:

EC2 Autoscaling Capacity rebalance
EC2 Autoscaling Capacity rebalance

Остановимся на ней подробнее, потому что она добавила спотам больше устойчивости. Вначале вы получаете сообщение о появлении сигнала Capacity rebalance. Затем Auto Scaling Group (либо сторонний скрипт, который у вас есть и получил этот сигнал), запускает новый инстанс, проходящий все свои процессы. После чего инстанс, у которого повысилась вероятность прерывания и получивший сигнал Capacity rebalance, начинает процесс завершения.

Для корректного завершения наконец-то появилась возможность правильно обработать завершение Spot Instance. Можно использовать Lifecycle hook Auto Scaling Group, обработать termination либо взять событие из EventBridge и запустить по нему какую-то лямбду с какой-то логикой. Например, в случае контейнеризации, то есть ECS или EKS, можно выгнать все Pods/ECS Tasks с этого инстанса и не прервать нагрузку вообще.

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

Сколько стоит Spot Instance?

Это, наверное, самый важный вопрос. Для ответа есть пара инструментов:

  • Привычный всем Cost Explorer, с базовой и доступной всем информацией;
  • Дополнительный Spot Instance data feed — детальный отчет в S3, который задействуется в настройках.

Сначала рассмотрим, как можно использовать Cost Explorer. Группируем споты по Instance Type, фильтруем по Usage Type Group EC2 Running Hours, дополнительно ставим важную опцию Purchase Option Spot. В результате получаем два графика: Costs и Usage:

-3

Теоретически по ним можно определить среднюю цену за день, если разделить одно на другое. Если еще добавить фильтры по тегам, то можно в целом понять, что происходит. Но если в результатах будет много разных типов инстансов, то это довольно сложно. Плюс, по умолчанию нет детального распределения по часам. Конечно, его можно включить в Cost Explorer, но для данной задачи она не особо требуется, и к тому же стоит денег.

Поэтому лучше посмотрим на Spot Instance data feed. Информация на него приходит каждый час, но с задержками. Имейте в виду, что согласно тестам, задержки могут быть от 15 минут до нескольких часов:

-4

Самое главное, что в Spot Instance data feed можно получить — это детальная информация с типом инстанса, максимальной ценой, текущей рыночной ценой и, наконец — той цифрой, которую мы все же заплатили(колонка Charge). Из особенностей настройки этого процесса можно отметить только немного кастомный ACL для S3, но всё довольно просто решается.

Настройки Spot Instance data feed

Текущая стоимость называется Spot Price (колонка Charge). Эта цена устанавливается для каждой зоны доступности и Instance Type в зависимости от спроса и предложения на Амазоне. Она постепенно корректируется на основании долгосрочных прогнозов. Однако стоит помнить, что динамика изменений этой цены плавная — как вверх, так и вниз. То есть, за час она не изменится и если сегодня это был 1$, то завтра 3$ не станет.

Поэтому можно использовать важную, но менее известную настройку Spot Max Price. Это максимальная цена за Spot Instance, которую вы готовы заплатить. Как только она становится выше того, что вы указали, то вы просто перестаете платить. Часто Spot Max Price не настраивают, потому что раньше ее не было в UI и приходилось ставить её через SLA (сейчас ее добавили в Spot request).

Устанавливать Spot Max Price очень важно. Если не указать никакого значения, то вы автоматически соглашаетесь заплатить любую цену, вплоть до ondemand, это всегда потолок. Для примера посмотрите на динамику изменения цен во время декабрьских праздников для трех разных типов инстансов:

-5

В начале самый выгодный тип — t3a, но из-за того, что в среднем он дешевле на 10%, спрос на него начинает расти. Его быстро покупают, и в какой-то момент более выгодным становится t3. А когда выкупают и его, то дешевле оказывается c5, что не очень ожидаемо.

Учитывайте, что часто на спотах встречается ситуация, когда spot instance “A” типа дороже, чем обычные. Чаще всего это обусловлено их популярностью — они дешевле на ondemand и их чаще покупают.

Кажется, и что же тогда делать? Отказаться от Spot Instance? Не спешите, для этой проблемы есть решение, и решить большую часть этих проблем без постоянного изучения Spot price history вам поможет Terraform-модуль. Как его настроить, расскажем в следующей статье.

Полезные ссылки по теме:

https://aws.amazon.com/ru/ec2/spot/instance-advisor/ https://ec2spotworkshops.com/ https://github.com/awslabs/ec2-spot-labs/ https://github.com/aws/aws-node-termination-handler https://docs.aws.amazon.com/AmazonECS/latest/developerguide/container-instance-spot.html

13 и 14 июня конференция TechLead Conf 2022 пройдет совместно с конференцией DevOpsConf 2022. Место проведения — кампус Сколково, самая инновационная и технологичная площадка в Москве.
Обсудим инженерные процессы в IT от XP до DevOps & Beyond, must have инструменты и практики изменений в командах для быстрых и качественных релизов. Билеты можно купить здесь. Сегодня — последний день до последнего повышения цены!
Программа почти сформирована, но появились новые и Программный комитет DevOps 2022 ждет ваших заявок о выступлении на конференции — появились новые темы. От импортозамещения, переезда обратно из облаков — до новой инфраструктурной парадигм, рисков по железу и даже поддержки своих команд. Доклады по новым темам принимаются до 22 апреля.