Запускаем контейнерные приложения в Yandex Serverless Containers

Рассказываем, в чём особенности сервиса Yandex Serverless Containers, в каких ситуациях его можно использовать и как запустить в нём контейнеры.

Классический подход при создании сайта или приложения с использованием облачных технологий следующий: вы арендуете виртуальную машину (ВМ) с определённым объёмом памяти, параметрами ЦПУ и платите за аренду мощностей провайдера по постоянному тарифу. Но фактическая нагрузка у вас всегда меньше арендуемых мощностей, иначе приложение будет работать плохо и терять часть пользовательских запросов. В итоге получается, что вы всегда переплачиваете.

Подход Serverless Containers предполагает, что вы делите свой продукт на микросервисы, размещаете их код в облаке, и облако само запускает контейнер с микросервисом тогда, когда вы его вызываете. Платите вы только за время работы вашего контейнера, а время простоя не оплачивается. Например, если ночью у вас нет нагрузки, то стоимость услуг провайдера будет нулевая. Ещё один плюс Serverless Containers — в быстром масштабировании. Если нагрузка у вас резко возрастает, то сервис сам запустит дополнительные экземпляры контейнера.

В этой статье мы поговорим о запуске контейнеров в Serverless Containers. Сначала рассмотрим, какие вообще есть способы запуска в Yandex Cloud, а потом расскажем, как запускать контейнеры в Serverless Containers и в каких случаях этот способ —лучший.

Статья будет полезна бэкенд-разработчикам, DevOps-инженерам и системным администраторам.

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

Четыре способа запуска контейнеров в Yandex Cloud

Первый способ — использование Managed Service for Kubernetes®. Этот сервис позволяет в автоматическом режиме развёртывать и масштабировать приложения на основе Kubernetes, а также управлять ими. Kubernetes в принципе создан для управления контейнерами Docker, и с его помощью можно запустить в Yandex Cloud любой контейнер.

Второй способ — запуск контейнера в Container Solution. В Marketplace есть готовый образ виртуальной машины, интерфейсы (UI и CLI), и это позволяет быстро создать ВМ и запустить в ней Docker-контейнер или даже группу контейнеров.

Третий способ — самостоятельный запуск контейнера в арендуемой виртуальной машине. Это самый неспециализированный способ. Но здесь нет никаких ограничений для запуска Docker-контейнеров — вы можете делать это вручную или с помощью какого-либо инструмента для оркестрации контейнеров.

Managed Service for Kubernetes®

Четвёртый способ — при помощи Serverless Containers. Здесь вы приносите Docker-контейнер, и платформа в бессерверном режиме запускает его самостоятельно, когда вы его вызываете.

Преимущества запуска контейнеров в Serverless Containers

Интеграция в экосистему Yandex Cloud. Serverless Containers можно интегрировать со многими другими сервисами Yandex Cloud. Например, его можно связать с сервисом Yandex Lockbox, который позволяет удобно и безопасно доставлять секреты в приложение. Логи serverless-контейнеров автоматически отправляются в сервис Cloud Logging, где их можно хранить, читать, обрабатывать.

Контейнеры поддерживают обработку тех же событий, с которыми умеют работать функции Yandex Cloud Functions. Чтобы сделать на базе контейнера сайт или REST API, запросы в контейнер можно отправлять из API Gateway. Контейнеры могут обрабатывать события в других сервисах Yandex Cloud: добавление объекта в Object Storage, публикация нового образа в Container Registry, срабатывание таймера, появление сообщения в Message Queue и другие.

Serverless Containers позволяет быстро получить из Docker-образа работающий HTTP-сервис. По сути, для этого достаточно вызвать команду с набором аргументов, и сервис будет запущен. Ниже мы рассмотрим пример, как это сделать.

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

Есть у Serverless Containers и ограничения. Первое связано с тем, что Docker-контейнеры в нём работают не в фоновом режиме, а только во время выполнения запроса. Второе ограничение — это отсутствие состояния контейнера. Если трафика в него нет, если события не наступают, то платформа «тушит» контейнер, и его состояние исчезает из памяти. Причём она может делать это после каждого обращения к контейнеру, если между вызовами был довольно большой временной интервал. И третье ограничение — бессерверные контейнеры не подходят для обслуживания произвольных сетевых протоколов. Сервис поддерживает обработку HTTP-вызовов, событий в очередях и других сервисах Yandex Cloud, но в нём не получится развернуть контейнер, обслуживающий, например, произвольный TCP-based протокол.

Давайте возьмём готовый контейнер и попробуем запустить его в Serverless Containers.

Запуск контейнера с помощью Serverless Containers

Для этой цели подойдёт, например, Docker-образ mongo-express, который развернёт административную панель над MongoDB. Он достаточно популярен, у него более ста миллионов скачиваний. Кроме того, он удовлетворяет ограничениям Serverless Containers: не имеет своего состояния и служит довольно тонкой прослойкой для существующего кластера Mongo.

Шаг 1. Заводим реестр в сервисе Yandex Container Registry и загружаем в него Docker-образ с приложением. Serverless-контейнер разворачивается только из образов, которые добавлены в Registry, поэтому нам необходимо загрузить в него образ mongo-express с Docker Hub. Для этого можно воспользоваться командой docker tag. Она позволит присвоить тег Docker-образу и отправить образ в реестр Container Registry с помощью команды docker push.

Шаг 2. Создаём контейнер. Здесь нужно назвать контейнер и произвести некоторые настройки — например, увеличить память. Остальные аргументы и опции пока трогать не будем — в нашем случае они, скорее всего, не пригодятся.

Шаг 3. Настраиваем переменные окружения. В нашем случае указываем IP-адрес сервера MongoDB, над которым мы разворачиваем административную панель, и порт через который приложение будет доступно. Названия всех необходимых переменных окружения можно взять из документации приложения на Docker Hub.

Шаг 4. Настраиваем работу с секретами через сервис Yandex Lockbox. Для этого сначала надо создать секрет с credentials от MongoDB, это можно сделать прямо из UI. Каждый секрет — это набор пар «ключ-значение», нам надо создать два секрета — логин и пароль. В интерфейсе Serverless Containers указываем, что наш контейнер должен использовать созданные нами секреты.

Шаг 5. Создаём сервисный аккаунт и назначаем ему роль. Он нам нужен, чтобы мы могли использовать образ из Container Registry, потому что по умолчанию он приватный. Также создадим и добавим аккаунту роль lockbox.payloadViewer.

Шаг 6. Поставим тайм-аут на работу контейнера. Рекомендуем взять значение с запасом, потому что мы не знаем, сколько времени могут занимать запросы к mongo-express. Например, 10 секунд.

Шаг 7. Создаём ревизию контейнера. Создавать новую ревизию необходимо при загрузке новой версии Docker-образа в Container Registry и при изменении настроек ревизии.

Работа по запуску контейнера закончена, теперь мы можем дать к нему публичный доступ и перейти по ссылке, чтобы увидеть административную панель, запущенную на техническом домене Serverless Containers. Здесь можно создавать таблицы, добавлять и удалять документы. А логи работы приложения будут записываться в сервис Yandex Cloud Logging.

Шаг 8. Настраиваем авторизацию через API Gateway. Мы протестировали работу приложения, теперь настроим работу через API-шлюз, ограничив к приложению доступ по IP-адресу. Для этого добавим возможность авторизации в приложении через интеграцию API Gateway со специальной функцией-авторайзером.

Пример спецификации для создания интеграции с авторизацией можно посмотреть здесь.

В неё вам необходимо добавить интеграцию с созданным контейнером и указать корректные id контейнера, функции и сервисных аккаунтов.

Подведём итоги

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

Мы показали, как пошагово можно запустить в Serverless Containers контейнер, — если у вас есть готовый Docker-образ, это будет несложно.

Следите за новостями — мы рассказываем в блоге о том, как можно эффективно пользоваться нашими сервисами.

Serverless Containers

Тарифы

Узнать цены и рассчитать стоимость

Мероприятия

Календарь событий Yandex Cloud

Найти партнёра

Смотреть каталог партнёров
Запускаем контейнерные приложения в Yandex Serverless Containers
Войдите, чтобы сохранить пост