Бессерверные контейнеры: куда смотреть, когда обычных функций не хватает

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

При работе с бессерверными функциями разработчикам необходимо подстраиваться под поддерживаемые провайдером языки программирования и библиотеки. Эта проблема решается с помощью бессерверных контейнеров: они позволяют запускать в облаке собственные Docker-контейнеры, каждому из которых выделяется отдельное ядро со своей изолированной вычислительной средой. В результате мы дополняем стандартные бонусы serverless-подхода, такие как масштабирование и Pay-as-you-go, гибкой настройкой окружения.

Чем отличается реализация бессерверных контейнеров и бессерверных функций

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

  • упаковать приложение в контейнеры,

  • указать требования к процессору и памяти,

  • определить политики сетевого взаимодействия и IAM,

  • запустить приложение.

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

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

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

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

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

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

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

Где уже реализованы бессерверные контейнеры

Amazon ECS + AWS Fargate

Amazon Elastic Container Service — это сервис работы с контейнерами без оркестрации. Он поддерживает два типа запуска: на базе сервиса EC2 с управлением виртуальными машинами EC2 и на базе сервиса Fargate в бессерверном режиме.

Важно изучить все ограничения при запуске контейнеров в бессерверном режиме. Например, если у вас есть модули, для которых требуется 0,7 vCPU и 1 ГБ оперативной памяти, Fargate переведёт эти требования на 1 vCPU и 2 ГБ оперативной памяти. При этом минимально можно задать 0,25 vCPU и 500 МБ памяти.

Yandex Serverless Containers

Сервис Serverless Containers от Yandex.Cloud стал общедоступным в сентябре 2021 года. Из Docker-образа, размещённого в Yandex Container Registry, создаётся ревизия контейнера, которая содержит информацию, необходимую для запуска контейнера. Сервис использует Yandex Cloud Functions для развёртывания контейнеров, поэтому вызвать контейнер можно аналогично вызову функций:

  • через HTTPS,

  • с помощью триггера Yandex Cloud Functions,

  • с помощью расширения Yandex API Gateway.

Чтобы лучше разобраться, как работают бессерверные контейнеры в Yandex.Cloud, можно сравнить по документации концепции сервисов Serverless Containers и Cloud Functions. Увидим параллели между контейнерами и функциями, ревизиями контейнера и версиями функций. Контейнеры работают на той же инфраструктуре и на базе тех же технологий, что и функции; доступны те же интеграции по логированию, мониторингу и т. д. Масштабирование работает аналогичным образом: если количество вызовов контейнера увеличивается, сервис автоматически создаёт дополнительные экземпляры.

Для сравнения технических возможностей и расчётов важно обратить внимание на указываемое количество ядер и памяти, тарификация распространяется и на них. В Serverless Containers требуется указывать от 1 ядра и 128 МБ памяти. Получается более гибкая настройка по памяти и менее варьируемая по ядрам, чем Fargate.

Azure Container Instances

С Azure Container Instances можно запускать приложения в контейнерах на Linux и Windows в бессерверном режиме, по умолчанию без необходимости использования оркестраторов. Поскольку подготовка и обслуживание инфраструктуры сводятся к указанию необходимого количества ядер и памяти, ACI лучше всего подходят для развёртывания изолированных экземпляров контейнеров для простых приложений, которым не требуются расширенные возможности, такие как масштабирование по требованию или обнаружение служб с несколькими контейнерами.

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

Cloud Run от Google

Бессерверная платформа Cloud Run позволяет работать с контейнерами как с Kubernetes, так и без него. Как и с остальными провайдерами, отсутствует необходимость управления инфраструктурой: пишем код, готовим Docker-образ, определяем ядра, память и запускаем приложение.

При этом Google позволяет настроить выделение CPU не только во время обработки запроса, но и вне запуска контейнера. Процессор будет доступен, даже если нет входящих запросов, но тогда плата будет взиматься за весь жизненный цикл экземпляра контейнера, а не только за время обработки запроса. Из интересного в квотах и лимитах — масштабирование до 1 тыс. контейнеров и отсутствие ограничений памяти по зоне доступности.

Что можно реализовать с бессерверными контейнерами

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

Обработка данных

Veolia разрабатывает промышленные системы водоочистки и системы переработки отходов. Система собирает метрики качества воды и другие показатели, которые агрегируются в компании. Приложение работает, когда данные поступают, обрабатываются и передаются уже готовые обратно клиентам компании.

Обработка и создание контента

Humen.Ai занимается разработкой приложения для создания видеоконтента при помощи искусственного интеллекта. Приложение Sway: Magic Dance обрабатывает исходное видео пользователя и применяет выбранную танцевальную анимацию. Благодаря планированию запуска контейнеров с помощью ECS, видео обрабатывается и создается практически в режиме реального времени.

Использование ботов

В этом примере бот для Discord запущен в контейнерах от Azure Container Instance. Запуск в контейнере так прост, что вместо использования ACI можно разместить код на другой облачной платформе. Подобный подход может быть использован с ботами для любой системы.

Реализация CI/CD

Разработчики платформы END. оптимизировали процессы CI/CD, используя Fargate для развёртывания задач в режиме реального времени. В качестве основного инструмента CI/CD использовался Bitbucket, логика находится в оркестраторе, который отвечает за клонирование кода приложения и репозиториев Terraform, создание и отправку образов Docker в Amazon ECR и развёртывание новых задач в Fargate с помощью сценария-оболочки AWS CLI.

Кому обратить внимание на бессерверные контейнеры

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

Если вам интересна экосистема Serverless-сервисов и все, что с этим связано, заходите в наше сообщество в Telegram, где можно обсудить serverless в целом.

Источник: https://habr.com/ru/post/583396/


Интересные статьи

Интересные статьи

#Палеонтология@phanerozoiБез долгих прелюдий, а то как-то раз меня обвинили, что в постах о подобных животинах, я водой текст заливаю, хотя там сухо и никто не утону...
Лет восемь назад работал я в одном… а в прочем, не важно где. Делали мы там всякие разные интересные вещи. В том числе занимались системами технического зрения для роботов. Роботы б...
Те, кто собираются открывать интернет-магазин, предварительно начитавшись в интернете о важности уникального контента, о фильтрах, накладываемых поисковиками за копирование материалов с других ресурсо...
Пренеприятнейшая история случилась с одним моим знакомым. Но насколько она оказалась неприятной для Михаила настолько же занимательной для меня. Надо сказать, что приятель мой вполне себе UNIX-п...
Голосование по сокращенному синтаксису для функций завершено (51 "за", 8 "против"). Было: $result = array_filter($paths, function ($v) use ($names) { return in_array($v, $names); }); Ста...