Автор выбрал фонд Free and Open Source Fund для получения пожертвования в рамках программы Write for DOnations.
Обычно для хостинга программного приложения в сети Интернет требуется наличие возможностей по управлению инфраструктурой, планированию и мониторингу для создания надежной системы. В отличие от такого традиционного подхода, бессерверная архитектура (также известная как function as a service или FaaS) разбивает ваше приложение на функции. Эти функции без сохранения состояния полностью независимы и срабатывают при событии. Контролируемое вами выполнение функций осуществляется через API, а не через явно выделенную инфраструктуру и базовые аппаратные средства. Функции обладают масштабируемой структурой, они портативны, их быстрее настроить и проверить по сравнению с обычными приложениями. Для работы бессерверной архитектуры в основном требуется независимый от платформы способ упаковки и контроля функций.
OpenFaas - это система с открытым исходным кодом для внедрения бессерверной архитектуры на Kubernetes с использованием контейнеров Docker для хранения и запуска функций. Она позволяет упаковать любую программу в контейнер и обеспечить ее работу в виде функции с помощью командной строки или интегрированного веб-интерфейса пользователя. OpenFaaS отлично поддерживает метрику и автоматически масштабирует функции при увеличении нагрузки.
В этом руководстве вы развернете OpenFaaS в кластере DigitalOcean Kubernetes на вашем домене и защитите ее при помощи сертификатов TLS от Let’s Encrypt. Вы также познакомитесь с веб-интерфейсом пользователя и развернете существующие и новые функции при помощи официального инструмента командной строки faas-cli. В результате вы получите гибкую систему для развертывания бессерверных функций.
kubectl
по умолчанию. Кластер должен иметь минимум 8 Гб ОЗУ и 4 ядра процессора для работы OpenFaas (или более при увеличенной нагрузке). Инструкции по настройке kubectl
описаны в шаге Подключение кластера, где вы создадите ваш кластер. Процесс создания кластера Kubernetes в DigitalOcean, см. Быстрое начало работы с Kubernetes.stable
из шага 2 из руководства Установка программного обеспечения в кластерах Kubernetes с помощью диспетчера пакетов Helm 3.openfaas.your_domain
. Вы можете купить доменное имя на Namecheap, получить его бесплатно на Freenom или воспользоваться услугами любого предпочитаемого регистратора доменных имен.Примечание. Доменное имя, которое вы будете использовать в этом руководстве, должно отличаться от имени из предварительного руководства “Настройка Nginx Ingress на DigitalOcean Kubernetes с помощью Helm”.
На этом шаге вы установите OpenFaaS для кластера Kubernetes с помощью Helm и опубликуете ее на вашем домене.
В предварительном руководстве по контроллеру Nginx Ingress вы создали образцы Services и Ingress. Они не нужны в этом руководстве, удалите их, выполнив следующие команды:
- kubectl delete -f hello-kubernetes-first.yaml
- kubectl delete -f hello-kubernetes-second.yaml
- kubectl delete -f hello-kubernetes-ingress.yaml
Поскольку вы развертываете функции в виде объектов Kubernetes, сохраняйте их и OpenFaaS в отдельных пространствах имен в вашем кластере. Пространство имен для OpenFaaS будет называться openfaas
, а пространство имен для функций openfaas-fn
. Создайте пространства в кластере, выполнив следующую команду:
- kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
Вывод должен выглядеть так:
Outputnamespace/openfaas created
namespace/openfaas-fn created
Далее вам необходимо добавить репозиторий OpenFaaS в Helm для хостинга чарта OpenFaaS. Для этого запустите следующую команду:
- helm repo add openfaas https://openfaas.github.io/faas-netes/
В результате в Helm появится следующее:
Output"openfaas" has been added to your repositories
Обновите кэш чарта в Helm:
- helm repo update
Вывод должен выглядеть так:
OutputHang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "openfaas" chart repository
...Successfully got an update from the "jetstack" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈
Перед установкой OpenFaaS вам необходимо настроить некоторые параметры чарта. Параметры хранятся в файле values.yaml
на вашем компьютере. Создайте и откройте этот файл в текстовом редакторе:
- nano values.yaml
Добавьте следующие строки:
functionNamespace: openfaas-fn
generateBasicAuth: true
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: "nginx"
hosts:
- host: openfaas.your_domain
serviceName: gateway
servicePort: 8080
path: /
Сначала укажите пространство имен для сохранения функций, присвоив значение openfaas-fn
переменной functionNamespace
. Установка значения true
для generateBasicAuth
приведет к тому, что Helm будет запрашивать обязательную аутентификацию при доступе к веб-интерфейсу пользователя OpenFaaS и создаст имя администратора и пароль для доступа.
Далее активируйте создание Ingress и продолжите настройку конфигурации для использования контроллера Nginx Ingress и обслуживания шлюза
OpenFaaS на вашем домене.
Замените openfaas.your_domain
на предпочтительный для вас домен из предварительного руководства. После внесения изменений сохраните и закройте файл.
Установите OpenFaaS в пространство имен openfaas
с заданными значениями:
- helm upgrade openfaas --install openfaas/openfaas --namespace openfaas -f values.yaml
Результат будет выглядеть следующим образом:
OutputRelease "openfaas" does not exist. Installing it now.
NAME: openfaas
LAST DEPLOYED: ...
NAMESPACE: openfaas
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
To verify that openfaas has started, run:
kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
To retrieve the admin password, run:
echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode)
В результате вам сообщат, что установка выполнена успешно. Выполните следующую команду для получения пароля для учетной записи admin
.
- echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode) | tee openfaas-password.txt
В результате вы получите декодированный пароль, который будет одновременно записан в файл openfaas-password.txt
при помощи tee
. Запомните пароль для учетной записи admin
в OpenFaas.
Для отображения контейнеров OpenFaaS выполните следующую команду:
- kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
Когда все перечисленные развертывания получат статус ready
, нажмите CTRL + C
для выхода.
Далее перейдите к домену через ваш веб-браузер. При запросе введите имя пользователя admin
и соответствующий пароль. Вы увидите веб-интерфейс пользователя OpenFaaS:
Вы успешно установили OpenFaaS и опубликовали ее панель управления в вашем домене. Защитите ее при помощи сертификатов TLS от Let’s Encrypt.
На этом шаге вы защитите ваш опубликованный домен при помощи сертификатов Let’s Encrypt от Cert-Manager.
Измените конфигурацию Ingress в values.yaml
. Откройте его для редактирования:
- nano values.yaml
Добавьте выделенные строки:
generateBasicAuth: true
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: letsencrypt-prod
tls:
- hosts:
- openfaas.your_domain
secretName: openfaas-crt
hosts:
- host: openfaas.your_domain
serviceName: gateway
servicePort: 8080
path: /
В блоке tls
определяется Secret, где сертификаты для ваших сайтов (перечислены под hosts
) будут сохранять сертификаты, выпущенные letsencrypt-prod
ClusterIssuer. В общем, каждый Ingress в вашем кластере должен иметь свой Secret.
Замените openfaas.your_domain
на желаемый домен, а затем сохраните и закройте файл.
Примените изменения, внесенные в ваш кластер, с помощью следующей команды:
- helm upgrade openfaas --install openfaas/openfaas --namespace openfaas -f values.yaml
Вывод должен выглядеть так:
OutputRelease "openfaas" has been upgraded. Happy Helming!
NAME: openfaas
LAST DEPLOYED: ...
NAMESPACE: openfaas
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
To verify that openfaas has started, run:
kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
To retrieve the admin password, run:
echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode)
Дождитесь, пока серверы Let’s Encrypt выпустят сертификат для вашего домена. Обычно это занимает несколько минут. Вы можете отслеживать прогресс выполнения задачи при помощи следующей команды:
- kubectl describe certificate openfaas-crt -n openfaas
Конечная часть полученного результата будет выглядеть примерно так:
OutputEvents:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal GeneratedKey 24m cert-manager Generated a new private key
Normal Requested 16m cert-manager Created new CertificateRequest resource "openfaas-crt-1017759607"
Normal Issued 16m cert-manager Certificate issued successfully
Когда в последней строке полученного результата отобразится Certificate issued successfully
, выполните выход, нажав CTRL + C
. Обновите домен в браузере для тестирования. Слева от адресной строки появится замок, это будет обозначать, что ваше соединение защищено.
Вы защитили ваш домен OpenFaaS при помощи бесплатных сертификатов TLS от Let’s Encrypt. Далее вы сможете использовать веб-интерфейс пользователя для управления функциями.
В этом разделе вы познакомитесь с веб-интерфейсом пользователя OpenFaaS, научитесь разворачивать, управлять и вызывать функции.
Веб-интерфейс пользователя OpenFaaS состоит из двух частей: в левой части указаны все развернутые функции, а в центральной части находится подробная информация о выбранной функции, с которой можно взаимодействовать.
Для развертывания новой функции нажмите кнопку Deploy New Function под логотипом OpenFaaS вверху слева. На экране появится диалоговое окно, где вас попросят выбрать функцию:
На вкладке FROM STORE находятся готовые функции из официального магазина функций OpenFaaS. Вы можете использовать их. Каждая функция имеет короткое описание, также можно увидеть исходный код, нажав на значок ссылки справа от нужной функции. Для развертывания функции из списка в магазине, выберите ее, а затем нажмите кнопку DEPLOY.
Вы можете также использовать собственную функцию, для этого перейдите на вкладку CUSTOM:
Здесь необходимо указать образ Docker вашей функции, специально настроенный для OpenFaaS и доступный в реестре Docker (например в Docker Hub). На этом шаге вы развернете готовую функцию из магазина OpenFaaS, далее вы научитесь создавать и разворачивать пользовательские функции в Docker Hub.
Вы развернете функцию NodeInfo
, которая возвращает информацию о компьютере, где она развернута. Информация может включать, например, данные об архитектуре ЦП, количестве ядер, общем объеме ОЗУ и времени работы (в секундах).
Выберите NodeInfo из списка готовых функций в магазине и нажмите DEPLOY. На экране появится список развернутых функций.
Выберите развернутую функцию в центральной части экрана, чтобы получить основную информацию о ней.
Статус функции обновляется в режиме реального времени и должен быстро переключиться на Ready
. Если статус Not Ready
сохраняется, это может означать, что в вашем кластере недостаточно ресурсов для приема нового пода. См. Как изменить размер дроплета для решения этой проблемы.
После появления Ready
развернутая функция станет доступна по указанному URL-адресу. Для проверки перейдите по URL в вашем браузере, или выполните вызов функции с панели Invoke function под информацией о функции.
Вы можете выбирать между Text, JSON и Download, чтобы указать тип ожидаемого ответа. Если необходим запрос POST
вместо GET
, введите данные по запросу в поле Request body.
Для вызова функции nodeinfo
нажмите кнопку INVOKE. OpenFaaS создаст и выполнит запрос HTTP согласно выбранным опциям, а также заполнит поля ответа полученными данными.
Ответ HTTP 200 OK
означает, что запрос был выполнен успешно. Тело ответа будет содержать системную информацию, собранную функцией NodeInfo. Это будет означать, что функция доступна и работает правильно.
Для удаления функции выберите ее из списка и нажмите на значок корзины в правом верхнем углу страницы. Нажмите OK при запросе для подтверждения действия. После чего статус функции изменится на Not Ready
(это будет означать, что функция была удалена из кластера).В скором времени функция пропадет из пользовательского интерфейса.
На этом шаге вы использовали веб-интерфейс пользователя OpenFaaS для развертывания и управления функциями. Далее вы научитесь развертывать и управлять функциями OpenFaaS при помощи командной строки.
В этом разделе вы настроите faas-cli для работы с вашим кластером. Далее вы научитесь развертывать и управлять функциями с помощью командной строки.
Сохраните домен OpenFaas в переменной среды OPENFAAS_URL
, чтобы не указывать его при каждом использовании faas-cli. Значение домена будет автоматически браться из переменной среды и использоваться во время выполнения функции.
Откройте .bash_profile
в вашей домашней директории для редактирования:
- nano ~/.bash_profile
Добавьте следующую строку:
. . .
export OPENFAAS_URL=https://openfaas.your_domain
Замените openfaas.your_domain
на желаемый домен, а затем сохраните и закройте файл.
Чтобы не входить в систему еще раз, самостоятельно оцените файл:
- . ~/.bash_profile
Убедитесь, что faas-cli установлен на вашем компьютере. Если он не установлен, следуйте инструкциям из официальной документации.
Настройте ваши учетные данные для входа, выполнив следующую команду:
- cat ~/openfaas-password.txt | faas-cli login --username admin --password-stdin
Вывод будет выглядеть следующим образом:
OutputCalling the OpenFaaS server to validate the credentials...
credentials saved for admin https://openfaas.your_domain
Для развертывания функции из магазина, выполните следующую команду:
- faas store deploy function_name
Разверните nodeinfo
, выполнив:
- faas store deploy nodeinfo
Результат будет выглядеть примерно следующим образом:
OutputDeployed. 202 Accepted.
URL: https://openfaas.your_domain/function/nodeinfo
Для получения списка развернутых функций выполните faas list
:
- faas list
На экране появятся установленные функции:
OutputFunction Invocations Replicas
nodeinfo 0 1
Для подробной информации по развернутой функции выполните faas describe
:
- faas describe nodeinfo
Результат будет выглядеть примерно следующим образом:
Name: nodeinfo
Status: Ready
Replicas: 1
Available replicas: 1
Invocations: 0
Image: functions/nodeinfo-http:latest
Function process:
URL: https://openfaas.your_domain/function/nodeinfo
Async URL: https://openfaas.your_domain/async-function/nodeinfo
Labels: faas_function : nodeinfo
uid : 514253614
Annotations: prometheus.io.scrape : false
Для вызова функции выполните faas invoke
:
- faas invoke nodeinfo
На экране появится следующее сообщение:
OutputReading from STDIN - hit (Control + D) to stop.
Далее можно сделать запрос. Для запроса используйте POST
вместо GET
. После ввода данных или в случае, если вы захотите сделать запрос GET
, нажмите CTRL + D
. Интерфейс faas-cli выполнит необходимый запрос и отобразит ответ наподобие ответа веб-интерфейса пользователя.
Для удаления функции выполните faas remove
:
- faas remove nodeinfo
На экране появится следующее сообщение:
OutputDeleting: nodeinfo.
Removing old function.
Выполните faas list
еще раз, чтобы убедится в удалении nodeinfo
:
OutputFunction Invocations Replicas
На этом шаге вы научились развертывать, выводить в виде списка, вызывать и удалять функции в кластере при помощи командной строки faas-cli. На следующем шаге вы создадите свою функцию и развернете ее в кластере.
Сейчас вы создадите образец функции Node.JS при помощи командной строки faas-cli и развернете его в кластере.
Созданная функция будет упакована в виде контейнера Docker и опубликована в Docker Hub. Для публикования контейнеров войдите в систему, выполнив следующую команду:
- docker login
Для завершения процесса входа введите ваше имя пользователя и пароль Docker Hub.
Образец функции Node.JS сохраняется в папке sample-js-function
. Создайте файл с помощью следующей команды:
- mkdir sample-js-function
Перейдите в директорию:
- cd sample-js-function
Поместите шаблон JS функции в директорию, выполнив следующую команду:
- faas new sample-js --lang node
Итоговый результат будет выглядеть следующим образом:
Output2020/03/24 17:06:08 No templates found in current directory.
2020/03/24 17:06:08 Attempting to expand templates from https://github.com/openfaas/templates.git
2020/03/24 17:06:10 Fetched 19 template(s) : [csharp csharp-armhf dockerfile go go-armhf java11 java11-vert -x java8 node node-arm64 node-armhf node12 php7 python python-armhf python3 python3-armhf python3-debian ru by] from https://github.com/openfaas/templates.git
Folder: sample-js created.
___ _____ ____
/ _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) | __/ | | | _| (_| | (_| |___) |
\___/| .__/ \___|_| |_|_| \__,_|\__,_|____/
|_|
Function created in folder: sample-js
Stack file written: sample-js.yml
...
Код самой функции находится в папке sample-js
, а конфигурация OpenFaas для нее в файле sample-js.yaml
. В директории sample-js
(которая напоминает обычный проект Node.JS) находятся два файла — handler.js
и package.json
.
handler.js
содержит фактический код JS для возврата ответа при вызове функции. Содержимое handler выглядит следующим образом:
"use strict"
module.exports = async (context, callback) => {
return {status: "done"}
}
Он экспортирует lambda function с двумя параметрами, context
с данными запроса и callback
, которые вы можете использовать для обратной передачи данных запроса вместо выполнения обычного возврата.
Откройте этот файл для редактирования:
- nano sample-js/handler.js
Измените выделенную строку следующим образом:
"use strict"
module.exports = async (context, callback) => {
return {status: "<h1>Hello Sammy!</h1>"}
}
После внесения изменений сохраните и закройте файл. При вызове этой функции OpenFaaS на экране появится сообщение Hello Sammy!
в ответ на запрос.
Далее откройте файл конфигурации для редактирования:
- nano sample-js.yml
Он будет выглядеть следующим образом:
version: 1.0
provider:
name: openfaas
gateway: https://openfaas.your_domain
functions:
sample-js:
lang: node
handler: ./sample-js
image: sample-js:latest
Он определяет openfaas
и шлюз по умолчанию для provider
. Затем определяет функцию sample-js
, ее язык (node
), handler и имя образа Docker, которые необходимо изменить для включения вашего имени пользователя учетной записи Docker Hub, например:
version: 1.0
provider:
name: openfaas
gateway: http://127.0.0.1:8080
functions:
sample-js:
lang: node
handler: ./sample-js
image: your_docker_hub_username/sample-js:latest
Сохраните и закройте файл.
Создайте образ Docker, переместите его в Docker Hub и разверните в вашем кластере. Выполните все действия одновременно, используя следующую команду:
- faas up -f sample-js.yml
На экране появится большой объем данных (в основном из Docker), которые будут завершаться примерно следующим:
Output. . .
[0] < Pushing sample-js [your_docker_hub_username/sample-js:latest] done.
[0] Worker done.
Deploying: sample-js.
Deployed. 202 Accepted.
URL: https://openfaas.your_domain/function/sample-js
Вызовите вашу новую развернутую функцию, чтобы проверить, что она работает:
- faas invoke sample-js
Нажмите CTRL + D
. На экране появится следующее:
Output<h1>Hello Sammy!</h1>
Это означает, что функция упакована и развернута правильно.
Вы можете удалить функцию, выполнив команду:
- faas remove sample-js
Вы успешно создали и развернули пользовательскую функцию Node.JS в OpenFaaS в вашем кластере.
Вы развернули OpenFaaS в вашем кластере DigitalOcean Kubernetes и готовы развернуть и начать пользоваться как готовыми, так и пользовательскими функциями. Вы научились внедрять архитектуру Function as a Service, которая поможет вам оптимизировать использование ресурсов и увеличит производительность ваших приложений.
Подробная информация по продвинутым возможностям OpenFaaS, например, по автоматическому масштабированию развернутых функций и мониторингу их работы содержится в официальной документации.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!