[Перевод] Представляя функции как сервис — OpenFaaS

Прим перев.: OpenFaaS — serverless-фреймворк, формально представленный в августе, но появившийся около года назад и быстро укрепившийся на самой вершине проектов GitHub по тегу Kubernetes. Опубликованный ниже текст — перевод технической части официального анонса проекта от его автора Alex Ellis, который хорошо известен в сообществе своим энтузиазмом в области Docker (имеет статус Docker Captain).

o7tczwuxng5h7hwufgzi_fr78ve.png

Functions as a Service или OpenFaaS — фреймворк для создания serverless-функций поверх контейнеров. Я начал проект как proof of concept в октябре прошлого года, когда хотел понять, можно ли запускать Alexa skills или функции AWS Lambda в Docker Swarm. Начальные успехи привели меня к публикации в декабре того же года первой версии кода на Golang в GitHub.

Эта публикация предлагает быстрое введение в бессерверные (serverless) вычисления и рассказывает о трёх главных возможностях, появившихся в FaaS за последние 500 коммитов.

1j3tv6rpigmyu2zldwrn3dbvrak.png

С момента первого коммита FaaS набирал популярность: получил более 4000 звёздочек на GitHub (уже более 7000 на сегодняшний день — прим. перев.) и небольшое сообщество разработчиков и хакеров, которые рассказывали о нём на различных встречах, писали свои функции и вносили изменения в код. Значимым событием для меня стало получение места среди главных сессий Moby Cool Hacks на Dockercon в Остине в апреле. Стоявшая перед этими выступлениями задача звучала как расширение границ того, для чего был создан Docker.

wvlt5kqcubwizmxtuqan8hqe8v0.jpeg

Что такое serverless?


Архитектура эволюционирует


Serverless («бессерверный») — неудачное название. Мы говорим о новом архитектурном паттерне для управляемых событиями (event-driven) систем. Serverless-функции часто используются как связующее звено между другими сервисами или в архитектуре, управляемой событиями. Раньше мы называли подобное сервисной шиной (service bus).

kdkr-ilw0xie0ogrpmjuufmpyhk.png
Serverless — это эволюция

Serverless-функции


Бессерверная функция — это небольшая, отдельная и ориентированная на повторное использование часть кода, которая:

  • недолго живёт,
  • не является демоном (запускаемым на долгое время),
  • не запускает TCP-сервисы,
  • не является stateful,
  • использует существующие у вас сервисы или сторонние ресурсы,
  • выполняется за несколько секунд (по умолчанию в AWS Lambda).


Также важно различать serverless-продукты от IaaS-провайдеров и проекты программного обеспечения с открытым кодом (Open Source).

С одной стороны, у нас есть такие serverless-реализации от IaaS-провайдеров, как Lambda, Google Cloud Functions и функции Azure, а с другой — фреймворки вроде OpenFaaS, позволяющие выполнять тяжёлую работу платформам оркестровки вроде Docker Swarm или Kubernetes.

deen2qw2tqx1ntwoalkh4it9yjc.png
Cloud native: используй свой любимый кластер.

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

В чём особенность OpenFaaS?


OpenFaaS построен на основе технологий, являющихся индустриальным стандартом в мире cloud native:

h5yvp8dzgb-brl2obk1eau4jrvm.jpeg
Стек OpenFaaS

Особенность проекта OpenFaaS заключается в том, что каждый процесс может стать serverless-функцией с помощью компонента watchdog и контейнера Docker. Это означает три вещи:

  • вы можете запускать код на любом языке программирования;
  • на любое время, какое требуется;
  • где угодно.


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

Например:


Команда cat или sha512sum может быть функцией, не требующей каких-либо изменений, поскольку функции взаимодействуют через stdin/stdout. Windows-функции также поддерживаются в Docker CE.

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

Посмотрим на 3 самые значимые фичи, которые появились с момента DockerCon (т.е. с апреля по август 2017 года — прим. перев.): CLI и шаблоны для функций, поддержка Kubernetes и асинхронная обработка.

1. Новый CLI


Простое развёртывание


Консольный интерфейс (CLI) был добавлен в проект FaaS, чтобы упростить функции деплоя и добавить им поддержку скриптования. До сих пор для этих целей можно было использовать пользовательский интерфейс (UI) к API Gateway или curl. Появившийся CLI позволяет определять функции в YAML-файле и деплоить их в тот же API Gateway.

Finnian Anderson написал замечательное введение в FaaS CLI на Practical Dev / dev.to.

Скрипт утилиты и brew


Для установки CLI есть специальный скрипт, а John McCabe помог с рецептом для brew:

$ brew install faas-cli


или:

$ curl -sL https://cli.get-faas.com/ | sudo sh


Шаблоны


С помощью шаблонов в CLI достаточно написать обработчика на любимом языке программирования, после чего CLI воспользуется шаблоном для сборки этого обработчика в Docker-контейнер со всей магией FaaS.

Подготовлены два шаблона: для Python и Node.js, —, но легко создать и свой собственный.

CLI поддерживает три действия:

  • -action build — локально создаёт Docker-образы из шаблонов;
  • -action push — загружает (push’ит) образы в выбранный реестр или Hub;
  • -action deploy — разворачивает FaaS-функции.


Если у вас кластер из 1 узла, нет необходимости push’ить образы перед их деплоем.

Вот пример конфигурационного файла CLI в формате YAML (sample.yml):

provider:
  name: faas
  gateway: http://localhost:8080

functions:
  url_ping:
    lang: python
    handler: ./sample/url_ping
    image: alexellis2/faas-urlping


А вот минимальный (пустой) обработчик для функции на Python:

def handle(req):
    print(req)


Пример, проверяющий код состояния у URL по HTTP (./sample/url_ping/handler.py):

import requests

def print_url(url):  
    try:
        r =  requests.get(url,timeout = 1)
        print(url +" => " + str(r.status_code))
    except:
        print("Timed out trying to reach URL.")

def handle(req):  
    print_url(req)


Если требуются дополнительные модули PIP, добавьте к своему обработчику (handler.py) файл requirements.txt.

$ faas-cli -action build -f ./sample.yml


После такой команды появится Docker-образ под названием alexellis2/faas-urlping, который можно загрузить в Docker Hub с помощью -action push и задеплоить с -action deploy.

CLI для FaaS доступен в этом репозитории.

2. Поддержка Kubernetes


Будучи капитаном Docker, я в основном занимаюсь изучением Docker Swarm и статьями о нём, однако меня всегда интересовал и Kubernetes. Начав изучать, как настроить Kubernetes в Linux и Mac, я уже написал три руководства об этом, и их хорошо встретили в сообществе.

Проектируя поддержку Kubernetes


Получив хорошее понимание того, как перенести концепции Docker Swarm на Kubernetes, я подготовил прототип и портировал весь код за несколько дней. Выбор пал на создание нового микросервисного демона, взаимодействующего с Kubernetes, — вместо добавления дополнительных зависимостей в основную кодовую базу FaaS.

FaaS проксирует вызовы к новому демону через стандартный RESTful-интерфейс для таких операций, как Deploy/List/Delete/Invoke и Scale.

Такой подход означает, что пользовательский интерфейс, CLI и автомасштабирование заработали из коробки без необходимости вносить изменения. Получившийся микросервис поддерживается в новом GitHub-репозитории под названием FaaS-netes и доступен в Docker Hub. Его настройка в кластере занимает около 60 секунд.

Демонстрация поддержки Kubernetes


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

Но подождите… ведь есть другие фреймворки, которые работают на Kubernetes?


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

У FaaS есть привязки для родного API у Docker Swarm и Kubernetes, то есть он использует объекты, с которыми вы уже работали для управления Deployments и Services. Это означает, что здесь меньше магии и нуждающегося в расшифроке кода, когда дело доходит до сути написания новых приложений.

При выборе фреймворка стоит учитывать, хотите ли вы привносить в проекты новые возможности или исправления. Например, OpenWhisk написан на Scala, а большинство других — на Golang.

  • Funktion;
  • Iron Functions;
  • OpenWhisk;
  • Kubeless;
  • Fission;
  • FaaS-netes.


3. Асинхронная обработка


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

  • это событие, и вызывающему оператору не нужен результат;
  • исполнение или инициализация выполняется долго — например, TensorFlow / Machine Learning;
  • принимается большое количество запросов в рамках пакетного задания;
  • вы хотите ограничить скорость.


Прототип для асинхронной обработки начинался с распределённой очереди. Реализация использует NATS Streaming, но может быть расширена для работы с Kafka или любой другой абстракцией, выглядящей как очередь.

qdsr7msxdztn8w1rh7j41aieaxs.jpeg
Иллюстрация из Twitter-анонса асинхронного режима в FaaS

Асинхронный вызов с NATS Streaming в качестве бэкенда включён в кодовую базу проекта. Инструкция по его использованию доступна здесь.

Приветствуются любые изменения


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

Для каждого всегда что-нибудь найдётся, и всё это помогает проекту двигаться вперёд.

Любую обратную связь, идеи, предложения отправляйте @alexellisuk или через один из репозиториев GitHub.

Не уверены, с чего начать?

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

P.S. от переводчика


Месяц назад автором этого материала была также опубликована инструкция по началу работы с OpenFaaS  на Kubernetes 1.8 с использованием Minikube.

Если вас интересует тема serverless под Kubernetes, стоит также обратить внимание (как минимум) на проекты Kubeless и Fission, а более полный список приводит сам автор статьи выше. Вероятно, мы про них ещё напишем в нашем блоге, а пока — читайте среди прошлых материалов:

  • «Kubernetes 1.9: обзор основных новшеств»;
  • «Зачем нужен Kubernetes и почему он больше, чем PaaS?»;
  • «Инфраструктура с Kubernetes как доступная услуга».

© Habrahabr.ru