Считается, что хорошая и дешевая инфраструктура – это миф и в реальной жизни так не бывает. Автоскейлинг, инфраструктура как код, Kubernetes, мониторинг и логирование – это звучит очень дорого. А что делать стартапу, у которого нет денег? DevOps-инженер и автор самого большого Telegram-канала о DevOps в Украине Олег Миколайченко в колонке для AIN.UA рассмотрел два примера, как сделать осмысленную инфраструктуру за копейки и не ограничивать бизнес плохими решениями.

Когда строить инфраструктуру для стартапа 

Часто случается так, что первая версия продукта готова, а запустить ее негде – просто нет инфраструктуры, или она в супер плачевном состоянии. Это очень печально – стартап теряет время, а конкуренты не спят.

Инфраструктура –  это сервисы, процессы, площадки для запуска проекта. По сути, это вся обвязка продукта вместе с вычислительными мощностями. Это сервера, процессы разработки и выкатки, мониторинг, сервис для логов, и большое архитектурное видение: а что будет “если”. 

Таких “если” может быть огромное количество (о которых нужно позаботиться еще до публичного релиза): 

  • если пойдет трафик,
  • если появятся пользователи,
  • если стартап купят,
  • если пользователи не придут, и это будет мертвый продукт.

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

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

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

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

Этапы развития стартапа

Допустим, гипотеза уже подтверждена и прошла этап валидации, вы решаете ее реализовывать, на выходе получаете продукт, несколько раз его меняете, попадаете в топ на Product Hunt и… занавес.

Единственный сервер, на котором работало приложение, упал от нагрузки. И дальше как в тумане: письмо провайдеру, время ожидания, перезагрузка, опять приходят пользователи, опять все очень плохо. Очень обидно. 

Получается, что думать о масштабировании приложения нужно еще до публичного релиза. Второй вариант: провести нагрузочное тестирование, определить максимальную нагрузку и арендовать больше серверов, чем нужно. Такой вариант дороже – ведь мощности будут простаивать когда не используются, и за них в любом случае нужно платить.

Быстрый цикл обратной связи, быстрая разработка и частые релизы – это то, что нужно для стартапа.

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

Кто должен делать первую версию платформы  

Я бы очень рекомендовал найти DevOps-инженера на part time – в результате он сможет за несколько дней реализовать нормальную начальную инфраструктуру по этой статье и лучшим практикам.

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

Чего у вас больше – денег или времени – решать только вам.

Рассмотрим ситуацию: в кармане с названием “инфраструктура” есть $20. Что делать в таком случае?

Best practises дизайна инфраструктуры

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

Разберем по очереди, что важно: 

1. Масштабируемость

Какая разница, сколько времени потрачено на валидацию гипотезы и разработку, если на публичном релизе полная лажа. Инфраструктура должна быть спроектирована с учетом роста, ведь это самое важное для стартапа. Эту проблему решает Kubernetes + облачный провайдер. 

Пришло 1000 пользователей – хорошо, увеличим количество виртуальных серверов в облаке. Пришло 10000 – ладно, еще увеличим. Начинает подтормаживать база данных (а мы это видим по графикам мониторинга) – окей, увеличиваем ее размер или тип. 

Всегда нужно руководствоваться здравым смыслом: шардирование БД для стартапа – нет, увеличение размера виртуального сервера БД – да. 

2. Инфраструктура как код

К счастью, в 2020 году никто инфраструктуру руками не поднимает. Если ваш инженер так делает – скорее всего у вас нет инженера. Изменения “руками” подразумевают огромное количество рутинных действий, приводят к ошибкам, никто никогда не знает, в каком состоянии инфраструктура. Никому не понятно, как оно вообще работает и может работать. Эти проблемы принято решать с помощью Terraform

3. Цена

Круто, если мы можем запустить приложение и платить за инфраструктуру копейки. Если мы стартап на начальном этапе, то денег еще не зарабатываем – чем меньше стоит инфраструктура, тем больше времени можем пробовать “выстреливать”.

4. ФОКУС на пользе

Все что не касается приложения и базовой инфраструктуры нужно максимально выносить в SaaS. Нужен мониторинг? Datadog или Newrelic. Некуда складывать логи? Logentries или LogDNA. Нечем собирать приложение? TravisCI, CircleCI или Github Actions. 

Если пытаться поднимать и сопровождать свой Jenkins, Prometheus, Elastic stack – будет и сложно, и неэффективно. 

5. Отдельные аккаунты и кредитки

Заведите отдельный почтовый ящик для регистраций сервисов и отдельную банковскую карту для оплаты услуг. Это суперполезный совет с любой точки зрения. 

Serverless в AWS: сначала копейки, потом камаз

Самое первое решение, которое прямо “выпрашивает” решить проблему дешевой инфраструктуры для стартапа – serverless архитектура. В двух словах, мы договариваемся: сервера не нужны, не хотим о них знать ничего вообще, и мыслим концепциями функций. 

Стоимость Lambda: $0.20 per 1M request + duration billing 

Возьмем самое логичное решение: Lambda + API Gateway. Это работает так: описываем бизнес логику в Lambda-функциях, и сверху накручиваем роутинг между несколькими функциями с помощью API Gateway.

Огромное преимущество такого подхода – копеечная стоимость, и только по факту использования ресурсов. Получается, что пока у нас нет трафика и пользователей – мы практически ничего не платим, когда идет первый трафик – начинаем платить за каждый запрос. 

Второе преимущество – масштабирование из коробки. Внезапные A/B тесты, которые гонят трафик, никак не отразятся на стабильности: каждый пользователь будет обслужен. 

Концепция инфраструктуры как код будет отлично работать и позволит описать все ресурсы в Terraform (и несколько окружений для разработки, быстрые релизы).

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

Самое сильное преимущество – фокус на пользе. По сути, все работает само по себе: остается только разрабатывать бизнес логику и ни о чем больше беспокоится не нужно. 

Минусы тоже есть: 

  • vendor lock (если мы спроектируем serverless систему внутри AWS, мы будем ограничены только этим облаком);
  • дополнительная оплата за каждое движение: трафик, логи, мониторинг, время, ресурсы;
  • это будет стоить камаз денег, когда придет реально много пользователей;
  • это будет стоить камаз денег, если систему мы спроектируем неправильно (занимать больше памяти, чем нужно, длительное время выполнения и т.д.).

Получается, что это идеальный вариант, если вы тестируете идею и не ждете огромного количества запросов и пользователей. Классный вариант, если вы получили финансирование от AWS или зарегистрировались на free tier. Если есть нагрузка – будет дорого и супер неудобно.

Kubernetes в DigitalOcean: $20 в месяц  

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

Для бизнеса Kubernetes предоставляет платформу, в которой из коробки доступно масштабирование, высокая доступность, стратегии деплоймента и огромное количество интеграций.

Kubernetes поддерживают Google, CNCF и очень большое сообщество.

DigitalOcean – это один из самых дешевых облачных провайдеров. Пару месяцев назад они выпустили сервис DigitalOcean Kubernetes – как раз то, что нам нужно. Managed Kubernetes означает, что мы получим все преимущества платформы, но не будем заботиться о конфигурации, управлении и сопровождении самого Kubernetes. 

Альтернативы для PaaS Kubernetes – AWS EKS ($120/месяц за пустой Kubernetes cluster), GKE (от $50 за 2 самые маленькие ноды) – намного дороже, но в то же время более production-ready. Можно рассмотреть как вариант миграции, когда у стартапа появятся деньги.

DigitalOcean Kubernetes: 2 nodes – $20/month

Самая дешевая конфигурация – это два виртуальных сервера (можно и один, но тогда будет не отказоустойчиво, так что нельзя один).

DigitalOcean Kubernetes (DOKS) поддерживает концепцию инфраструктуры как код. Ресурсы и провайдер доступны в Terraform и конфигурируются супер просто. Готовый Kubernetes кластер создается буквально одним ресурсом и несколькими строчками кода.

Если в AWS Lambda за дополнительные деньги были сразу доступны Cloudwatch для логирования, Cloudmetrics для мониторинга и X-Ray для более детального понимания, что происходит с приложением, то в DOKS такого нет. Есть совсем базовые бесплатные графики по потребляемой памяти, нагрузке процессора и сети, но этого, очевидно, мало.

С точки зрения масштабируемости у нас есть возможность скейлится как вертикально (увеличивая размер и тип виртуального сервера), так и горизонтально (автоматически увеличивая количество серверов в кластере). Горизонтальная масштабируемость доступна по умолчанию, и работает примерно так: 

  1. В зависимости от метрики (загрузка процессора, память, сеть) DOKS определяет, что нужно добавить виртуальный сервер в кластер;
  2. Kubernetes понимает, что появился новый сервер, и перемещает туда часть приложений;
  3. Когда нагрузка ушла, DOKS постепенно убирает сервера из кластера;
  4. Победа: мы заплатили только за пару часов, пока была нагрузка.

Для того, чтобы реализовать детальный мониторинг и логирование в мире Kubernetes, принято использовать prometheus-operator и Elastic stack. Эти сервисы устанавливаются внутрь кластера и занимают ресурсы. Мы строим инфраструктуру за $20, так что лишних ресурсов у нас нет. Давайте смотреть, как мы можем выйти из этой ситуации.

Datadog pricing: $0 up to 5 hosts

Из всех SaaS систем мониторинга бесплатный план я нашел только у Datadog. С помощью Datadog мы сможем собирать метрики с нашего кластера, смотреть графики в браузере и анализировать, почему наше приложение работает плохо. 

Дополнительно могу рекомендовать использовать Sentry для начального анализа ошибок приложения. У них также есть бесплатный план.

LogDNA pricing: free plan, 0 retention days

Из решений для логирования бесплатный план есть у LogDNA: нюанс в том, что логи будут удаляться через 24 часа. Это немного неудобно, потому что всегда хочется понимать, когда ошибка появилась впервые. Но для наших требований – более чем достаточно.

Стоит сказать, что все три этих продукта достаточно дороги даже на старте, если превысить лимиты бесплатного плана. Давайте будем реалистами: ресурсов маленького Kubernetes кластера и времени разработчиков не хватит, чтобы поддерживать свой мониторинг, сервис сбора логов и анализа ошибок. Скорее всего с ростом инфраструктуры вы решите поддерживать свои решения, а пока нужно двигаться быстро – SaaS-решения будут отличным вариантом.

Для старта этого будет более чем достаточно.

А как же дешевые spot instances? 

Spot Instance Advisor: экономия до 90%

Да, отличная идея. Но не для первого релиза.

Spot instances – это виртуальные сервера, которые могут стоить дешевле до 90% в самых популярных облачных провайдерах. Их хитрость в том, что эти сервера могут у вас забрать в любой момент, или их может не быть вовсе.

Получается, что приложение должно быть спроектировано специальным образом: дополнительно нужно реализовать graceful shutdown (правильное завершение работы, оно нужно при масштабировании в том числе), добавить очереди сообщений в архитектуру и еще много нюансов. Такой подход – это усложнение продукта, и дополнительный лишний акцент не на основном бизнесе.

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

GCP Free Tier & AWS Free Tier 

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

GCP Free tier: $300/12 month 

Google Cloud Platform дает $300 на 12 месяцев. Если попытаться построить Kubernetes cluster – это будет стоить около ~$50 в месяц. Получается, что этих денег хватит на 6 месяцев.

AWS Free Tier подразумевает использование определенных сервисов в пределах квот, тоже на 12 месяцев. К сожалению Kubernetes ENGINE не доступен в бесплатном периоде, но вполне можно построить serverless архитектуру, которую мы рассматривали разделом ранее.

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

Также упомяну о Google Cloud for Startups и AWS for Startups. Если ваш стартап уже работает,  есть пользователи, юридическое лицо, и вы можете показать рост на графиках – скорее всего у вас получится получить финансирование от облачных провайдеров.

Условия и возможности гибкие, в целом их можно характеризовать так: провайдеры ежемесячно будут выделять вам сумму, необходимую на развитие инфраструктуры, сроком до трех лет. За это время вы 100% научитесь пользоваться внутренними сервисами (агрессивный маркетинг и личный менеджер будет этому способствовать), а через какое-то время даже съезжать никуда не захотите.

Послесловие 

Получается, что в реальной жизни можно запустить начальную масштабируемую инфраструктуру с высокой доступностью даже когда совсем нет денег. Конечно, $20/месяц – это минимальная сумма, с которой начинается  самая первая версия самой маленькой инфраструктуры. С ростом стартапа будет расти количество серверов, их стоимость и цена дополнительных сервисов для логирования и мониторинга.

У нас получилась по-умолчанию масштабируемая инфраструктура (и для этого ничего не нужно делать дополнительно), мы использовали актуальный стек на рынке, и такое решение не нужно будет переделывать в ближайшее время. 

В крайнем случае, Kubernetes дает вам возможность легко мигрировать с дешевого DigitalOcean Kubernetes на более дорогой Google Kubernetes Engine, или самый дорогой Amazon Kubernetes Engine после того, как придут инвестиции. В будущем будет возможность переехать и на свои сервера. В конце концов можно будет двигаться даже в сторону cloud agnostic: это когда платформа работает в нескольких облачных провайдерах одновременно. 

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

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

Автор: Олег Миколайченко, DevOps-инженер