Как установить и защитить OpenFaaS с помощью Docker Swarm на Ubuntu 16.04

Автор выбралDiversity in Tech Fund для получения пожертвования в рамках программыWrite for DOnations.

Вступление

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

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

OpenFaaS - это бесплатная среда с открытым исходным кодом для создания и размещения бессерверных функций. Благодаря официальной поддержке какDocker Swarm, так иKubernetes, он позволяет развертывать ваши приложения с помощью мощного API, интерфейса командной строки или веб-интерфейса. Он поставляется со встроенными метриками, предоставляемымиPrometheus, и поддерживает автоматическое масштабирование по запросу, а также масштабирование с нуля.

В этом руководстве вы настроите и используете OpenFaaS с Docker Swarm, работающим в Ubuntu 16.04, а также защитите его веб-интерфейс и API, настроивTraefik с помощьюLet’s Encypt. Это обеспечивает безопасную связь между узлами в кластере, а также между OpenFaaS и его операторами.

Предпосылки

Чтобы следовать этому руководству, вам понадобится:

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

  • git,curl иjq установлены на вашем локальном компьютере. Вы будете использоватьgit для клонирования репозитория OpenFaaS,curl для тестирования API иjq для преобразования необработанных ответовJSON из API в удобочитаемый JSON. Чтобы установить необходимые зависимости для этой установки, используйте следующие команды:sudo apt-get update && sudo apt-get install git curl jq

  • Докер установлен, выполнив шаги 1 и 2How To Install and Use Docker on Ubuntu 16.04.

  • АккаунтDocker Hub. Для развертывания функций в OpenFaaS их необходимо будет опубликовать в общедоступном реестре контейнеров. Мы будем использовать Docker Hub для этого урока, поскольку он бесплатный и широко используется. Обязательно выполните аутентификацию с помощью Docker на локальном компьютере с помощью командыdocker login.

  • Docker Machine установлен послеHow To Provision and Manage Remote Docker Hosts with Docker Machine on Ubuntu 16.04.

  • Токен личного доступа DigitalOcean. Чтобы создать токен, выполнитеthese instructions.

  • Кластер Docker Swarm из 3 узлов, подготовленный следующимиHow to Create a Cluster of Docker Containers with Docker Swarm and DigitalOcean on Ubuntu 16.04.

  • Полностью зарегистрированное доменное имя с записью A, указывающей на один из экземпляров Docker Swarm. На протяжении всего руководства вы будете видетьexample.com в качестве примера домена. Вы должны заменить его на свой собственный домен, который вы можете приобрести наNamecheap или получить бесплатно наFreenom. Вы также можете использовать другой регистратор домена по вашему выбору.

[[шаг-1 -—- загрузка-openfaas-and-install-the-openfaas-cli]] == Шаг 1. Загрузка OpenFaaS и установка OpenFaaS CLI

Чтобы развернуть OpenFaaS на вашем Docker Swarm, вам нужно будет загрузить манифесты и сценарии развертывания. Самый простой способ получить их - это клонировать официальный репозиторий OpenFaas и проверить соответствующий тег, который представляет релиз OpenFaaS.

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

В этом руководстве вы развернете OpenFaaS v0.8.9. Хотя шаги по развертыванию других версий должны быть аналогичными, обязательно проверьтеproject changelog, чтобы убедиться, что нет критических изменений.

Сначала перейдите в свой домашний каталог и выполните следующую команду, чтобы клонировать репозиторий в каталог~/faas:

cd ~
git clone https://github.com/openfaas/faas.git

Перейдите во вновь созданный каталог~/faas:

cd ~/faas

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

git checkout 0.8.9

Вывод содержит сообщение об успешной проверке и предупреждение о внесении изменений в эту ветку:

OutputNote: checking out '0.8.9'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b 

HEAD is now at 8f0d2d1 Expose scale-function endpoint

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

После загрузки репозитория OpenFaaS с необходимыми файлами манифеста, давайте приступим к установке FaaS CLI.

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

cd ~
curl -sSL -o faas-cli.sh https://cli.openfaas.com

Это загрузит сценарийfaas-cli.sh в ваш домашний каталог. Перед выполнением сценария рекомендуется проверить содержимое:

less faas-cli.sh

Вы можете выйти из предварительного просмотра, нажавq. После того как вы проверили содержимое скрипта, вы можете приступить к установке, предоставив исполняемому файлу права на выполнение скрипта и выполнив его. Выполните сценарий от имени пользователя root, чтобы он автоматически скопировался на вашPATH:

chmod +x faas-cli.sh
sudo ./faas-cli.sh

Вывод содержит информацию о ходе установки и версии CLI, которую вы установили:

Outputx86_64
Downloading package https://github.com/openfaas/faas-cli/releases/download/0.6.17/faas-cli as /tmp/faas-cli
Download complete.

Running as root - Attempting to move faas-cli to /usr/local/bin
New version of faas-cli installed to /usr/local/bin
Creating alias 'faas' for 'faas-cli'.
  ___                   _____           ____
 / _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 \___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
      |_|

CLI:
 commit:  b5597294da6dd98457434fafe39054c993a5f7e7
 version: 0.6.17

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

На данный момент у вас установлен FaaS CLI. Чтобы узнать больше о командах, которые вы можете использовать, выполните CLI без каких-либо аргументов:

faas-cli

Вывод показывает доступные команды и флаги:

Output  ___                   _____           ____
 / _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 \___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
      |_|


Manage your OpenFaaS functions from the command line

Usage:
  faas-cli [flags]
  faas-cli [command]

Available Commands:
  build          Builds OpenFaaS function containers
  cloud          OpenFaaS Cloud commands
  deploy         Deploy OpenFaaS functions
  help           Help about any command
  invoke         Invoke an OpenFaaS function
  list           List OpenFaaS functions
  login          Log in to OpenFaaS gateway
  logout         Log out from OpenFaaS gateway
  new            Create a new template in the current folder with the name given as name
  push           Push OpenFaaS functions to remote registry (Docker Hub)
  remove         Remove deployed OpenFaaS functions
  store          OpenFaaS store commands
  template       Downloads templates from the specified github repo
  version        Display the clients version information

Flags:
      --filter string   Wildcard to match with function names in YAML file
  -h, --help            help for faas-cli
      --regex string    Regex to match with function names in YAML file
  -f, --yaml string     Path to YAML file describing function(s)

Use "faas-cli [command] --help" for more information about a command.

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

Каталог~/faas содержит файлы из выпуска0.8.9, что означает, что теперь вы можете развернуть OpenFaaS в своем Docker Swarm. Прежде чем сделать это, давайте изменим файл манифеста развертывания, включив в него Traefik, который защитит ваши настройки OpenFaaS, настроив Let Encrypt.

[[step-2 -—- configuring-traefik]] == Шаг 2. Настройка Traefik

Traefik - это обратный прокси-сервер с поддержкой Docker, который поставляется с поддержкой SSL, предоставляемой Let’s Encrypt. Протокол SSL обеспечивает безопасную связь с кластером Swarm за счет шифрования данных, которые вы отправляете и получаете между узлами.

Чтобы использовать Traefik с OpenFaaS, вам нужно изменить манифест развертывания OpenFaaS, включив в него Traefik и указать OpenFaaS использовать Traefik вместо того, чтобы напрямую предоставлять свои услуги Интернету.

Вернитесь в каталог~/faas и откройте манифест развертывания OpenFaaS в текстовом редакторе:

cd ~/faas
nano ~/faas/docker-compose.yml

[.note] #Note: В файле манифеста Docker Compose используетсяYAML formatting, который строго запрещает табуляцию и требует двух пробелов для отступа. Манифест не будет развернут, если файл неправильно отформатирован.
#

Развертывание OpenFaaS состоит из нескольких сервисов, определенных в директивеservices, которые предоставляют зависимости, необходимые для запуска OpenFaaS, OpenFaaS API и веб-интерфейса, а также Prometheus и AlertManager (для обработки метрик).

В начале разделаservices добавьте новую службу с именемtraefik, которая использует образtraefik:v1.6 для развертывания:

~/faas/docker-compose.yml

version: "3.3"
services:
    traefik:
        image: traefik:v1.6
    gateway:
         ...

Изображение Traefik поступает изTraefik Docker Hub repository, где вы можете найти список всех доступных изображений.

Затем давайте проинструктируем Docker запустить Traefik с помощью директивыcommand. Это запустит Traefik, настроит его для работы с Docker Swarm и предоставит SSL с использованием Let Encrypt. Следующие флаги будут настраивать Traefik:

  • --docker.*: эти флаги указывают Traefik использовать Docker и указывают, что он работает в кластере Docker Swarm.

  • --web=true: этот флаг включает веб-интерфейс Traefik.

  • --defaultEntryPoints и--entryPoints: эти флаги определяют точки входа и протоколы, которые будут использоваться. В нашем случае это включает HTTP на порт80 и HTTPS на порт443.

  • --acme.*: эти флаги указывают Traefik использоватьACME для генерации сертификатов Let's Encrypt для защиты вашего кластера OpenFaaS с помощью SSL.

Обязательно замените заполнители доменаexample.com во флагах--acme.domains и--acme.email на домен, который вы собираетесь использовать для доступа к OpenFaaS. Вы можете указать несколько доменов, разделяя их запятой и пробелом. Адрес электронной почты предназначен для уведомлений и предупреждений SSL, включая предупреждения об истечении срока действия сертификата. В этом случае Traefik будет обрабатывать обновления сертификатов автоматически, поэтому вы можете игнорировать предупреждения об истечении срока их действия.

Добавьте следующий блок кода под директивойimage и надgateway:

~/faas/docker-compose.yml

...
    traefik:
        image: traefik:v1.6
        command: -c --docker=true
            --docker.swarmmode=true
            --docker.domain=traefik
            --docker.watch=true
            --web=true
            --defaultEntryPoints='http,https'
            --entryPoints='Name:https Address::443 TLS'
            --entryPoints='Name:http Address::80'
            --acme=true
            --acme.entrypoint='https'
            --acme.httpchallenge=true
            --acme.httpchallenge.entrypoint='http'
            --acme.domains='example.com, www.example.com'
            --acme.email='[email protected]'
            --acme.ondemand=true
            --acme.onhostrule=true
            --acme.storage=/etc/traefik/acme/acme.json
...

Имея директивуcommand, давайте сообщим Traefik, какие порты открывать для Интернета. Traefik использует порт8080 для своих операций, в то время как OpenFaaS будет использовать порт80 для незащищенной связи и порт443 для безопасной связи.

Добавьте следующую директивуports под директивойcommand. Обозначениеport-internet:port-docker гарантирует, что порт на левой стороне доступен Traefik для Интернета и сопоставляется с портом контейнера на правой стороне:

~/faas/docker-compose.yml

        ...
        command:
            ...
        ports:
            - 80:80
            - 8080:8080
            - 443:443
        ...

Затем, используя директивуvolumes, смонтируйте файл сокета Docker с хоста, на котором запущен Docker, в Traefik. Файл сокета Docker связывается с Docker API для управления вашими контейнерами и получения сведений о них, таких как количество контейнеров и их IP-адреса. Вы также смонтируете том с именемacme, который мы определим позже на этом шаге.

Директиваnetworks указывает Traefik использовать сетьfunctions, которая развертывается вместе с OpenFaaS. Эта сеть обеспечивает взаимодействие функций с другими частями системы, включая API.

Директиваdeploy указывает Docker запускать Traefik только на узле диспетчера Docker Swarm.

Добавьте следующие директивы под директивойports:

~/faas/docker-compose.yml

        ...
        volumes:
            - "/var/run/docker.sock:/var/run/docker.sock"
            - "acme:/etc/traefik/acme"
        networks:
            - functions
        deploy:
            placement:
                constraints: [node.role == manager]

На этом этапе служебный блокtraefik должен выглядеть так:

~/faas/docker-compose.yml

version: "3.3"
services:
    traefik:
        image: traefik:v1.6
        command: -c --docker=true
            --docker.swarmmode=true
            --docker.domain=traefik
            --docker.watch=true
            --web=true
            --defaultEntryPoints='http,https'
            --entryPoints='Name:https Address::443 TLS'
            --entryPoints='Name:http Address::80'
            --acme=true
            --acme.entrypoint='https'
            --acme.httpchallenge=true
            --acme.httpchallenge.entrypoint='http'
            --acme.domains='example.com, www.example.com'
            --acme.email='[email protected]'
            --acme.ondemand=true
            --acme.onhostrule=true
            --acme.storage=/etc/traefik/acme/acme.json
        ports:
            - 80:80
            - 8080:8080
            - 443:443
        volumes:
            - "/var/run/docker.sock:/var/run/docker.sock"
            - "acme:/etc/traefik/acme"
        networks:
          - functions
        deploy:
          placement:
            constraints: [node.role == manager]

    gateway:
        ...

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

Службаgateway предоставляет шлюз API, который вы можете использовать для развертывания, запуска и управления своими функциями. Он обрабатывает метрики (через Prometheus) и автоматическое масштабирование, а также размещает веб-интерфейс.

Наша цель - предоставить доступ к службеgateway с помощью Traefik, а не напрямую в Интернет.

Найдите службуgateway, которая должна выглядеть так:

~/faas/docker-compose.yml

...
    gateway:
        ports:
            - 8080:8080
        image: openfaas/gateway:0.8.7
        networks:
            - functions
        environment:
            functions_provider_url: "http://faas-swarm:8080/"
            read_timeout:  "300s"        # Maximum time to read HTTP request
            write_timeout: "300s"        # Maximum time to write HTTP response
            upstream_timeout: "300s"     # Maximum duration of upstream function call - should be more than read_timeout and write_timeout
            dnsrr: "true"               # Temporarily use dnsrr in place of VIP while issue persists on PWD
            faas_nats_address: "nats"
            faas_nats_port: 4222
            direct_functions: "true"    # Functions are invoked directly over the overlay network
            direct_functions_suffix: ""
            basic_auth: "${BASIC_AUTH:-true}"
            secret_mount_path: "/run/secrets/"
            scale_from_zero: "false"
        deploy:
            resources:
                # limits:   # Enable if you want to limit memory usage
                #     memory: 200M
                reservations:
                    memory: 100M
            restart_policy:
                condition: on-failure
                delay: 5s
                max_attempts: 20
                window: 380s
            placement:
                constraints:
                    - 'node.platform.os == linux'
        secrets:
            - basic-auth-user
            - basic-auth-password
...

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

Затем добавьте следующую директивуlables в разделdeploy службыgateway. Эта директива предоставляет конечные точки/ui,/system и/function на порту8080 через Traefik:

~/faas/docker-compose.yml

        ...
        deploy:
            labels:
                - traefik.port=8080
                - traefik.frontend.rule=PathPrefix:/ui,/system,/function
            resources:
            ...

Конечная точка/ui предоставляет веб-интерфейс OpenFaaS, который описан вStep 6 этого руководства. Конечная точка/system - это конечная точка API, используемая для управления OpenFaaS, в то время как конечная точка/function предоставляет конечные точки API для управления и выполнения функций. Step 5 этого руководства подробно описывает OpenFaaS API.

После изменений ваш сервисgateway должен выглядеть так:

~/faas/docker-compose.yml

...
    gateway:
        image: openfaas/gateway:0.8.7
        networks:
            - functions
        environment:
            functions_provider_url: "http://faas-swarm:8080/"
            read_timeout:  "300s"        # Maximum time to read HTTP request
            write_timeout: "300s"        # Maximum time to write HTTP response
            upstream_timeout: "300s"     # Maximum duration of upstream function call - should be more than read_timeout and write_timeout
            dnsrr: "true"               # Temporarily use dnsrr in place of VIP while issue persists on PWD
            faas_nats_address: "nats"
            faas_nats_port: 4222
            direct_functions: "true"    # Functions are invoked directly over the overlay network
            direct_functions_suffix: ""
            basic_auth: "${BASIC_AUTH:-true}"
            secret_mount_path: "/run/secrets/"
            scale_from_zero: "false"
        deploy:
            labels:
                - traefik.port=8080
                - traefik.frontend.rule=PathPrefix:/ui,/system,/function
            resources:
                # limits:   # Enable if you want to limit memory usage
                #     memory: 200M
                reservations:
                    memory: 100M
            restart_policy:
                condition: on-failure
                delay: 5s
                max_attempts: 20
                window: 380s
            placement:
                constraints:
                    - 'node.platform.os == linux'
        secrets:
            - basic-auth-user
            - basic-auth-password
...

Наконец, давайте определим объемacme, используемый для хранения сертификатов Let’s Encrypt. Мы можем определить пустой том, то есть данные не сохранятся, если вы уничтожите контейнер. Если вы уничтожите контейнер, сертификаты будут восстановлены при следующем запуске Traefik.

Добавьте следующую директивуvolumes в последнюю строку файла:

~/faas/docker-compose.yml

...
volumes:
    acme:

Когда вы закончите, сохраните файл и закройте текстовый редактор. На этом этапе вы настроили Traefik для защиты вашего развертывания OpenFaaS и Docker Swarm. Теперь вы готовы развернуть его вместе с OpenFaaS в своем кластере Swarm.

[[step-3 -—- deploying-openfaas]] == Шаг 3. Развертывание OpenFaaS

Теперь, когда вы подготовили манифест развертывания OpenFaaS, вы готовы развернуть его и начать использовать OpenFaaS. Для развертывания вы воспользуетесь скриптомdeploy_stack.sh. Этот сценарий предназначен для использования в операционных системах Linux и macOS, но в каталоге OpenFaaS вы также можете найти соответствующие сценарии дляWindows иARM systems.

Перед развертыванием OpenFaaS вам нужно будет указатьdocker-machine выполнять команды Docker из сценария на одной из машин в Swarm. Для этого урока воспользуемсяSwarm manager.

Если у вас настроена командаdocker-machine use, вы можете использовать ее:

docker-machine use node-1

Если нет, используйте следующую команду:

eval $(docker-machine env node-1)

Сценарийdeploy_stack.sh развертывает все ресурсы, необходимые для работы OpenFaaS должным образом, включая файлы конфигурации, сетевые настройки, службы и учетные данные для авторизации на сервере OpenFaaS.

Давайте выполним скрипт, который займет несколько минут, чтобы завершить развертывание:

~/faas/deploy_stack.sh

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

Запишите эти учетные данные, так как они понадобятся вам в учебном пособии для доступа к веб-интерфейсу и API:

OutputAttempting to create credentials for gateway..
roozmk0y1jkn17372a8v9y63g
q1odtpij3pbqrmmf8msy3ampl
[Credentials]
 username: admin
 password: your_openfaas_password
 echo -n your_openfaas_password | faas-cli login --username=admin --password-stdin

Enabling basic authentication for gateway..

Deploying OpenFaaS core services
Creating network func_functions
Creating config func_alertmanager_config
Creating config func_prometheus_config
Creating config func_prometheus_rules
Creating service func_alertmanager
Creating service func_traefik
Creating service func_gateway
Creating service func_faas-swarm
Creating service func_nats
Creating service func_queue-worker
Creating service func_prometheus

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

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

Сценарий выдал флаги, которые необходимо указать команде, но вам нужно будет добавить дополнительный флаг--gateway с адресом вашего сервера OpenFaaS, поскольку интерфейс командной строки FaaS предполагает, что сервер шлюза работает наlocalhost:

echo -n your_openfaas_password | faas-cli login --username=admin --password-stdin --gateway https://example.com

Вывод содержит сообщение об успешной авторизации:

OutputCalling the OpenFaaS server to validate the credentials...
credentials saved for admin https://example.com

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

[[step-4 -—- deploying-openfaas-sample-functions]] == Шаг 4. Развертывание примеров функций OpenFaaS

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

В проекте OpenFaaS есть несколько примеров функций, и вы можете найти списокavailable functions along with their deployment manifests in the OpenFaaS repository. Некоторые из примеров функций включаютnodeinfo для отображения информации об узле, на котором выполняется функция,wordcount для подсчета количества слов в переданном запросе иmarkdown для преобразования передал ввод уценки в вывод HTML.

Манифестstack.yml в каталоге~/faas развертывает несколько примеров функций вместе с функциями, упомянутыми выше. Вы можете развернуть его с помощью FaaS CLI.

Выполните следующую командуfaas-cli, которая берет путь к манифесту стека и адрес вашего сервера OpenFaaS:

faas-cli deploy -f ~/faas/stack.yml --gateway https://example.com

Вывод содержит коды состояния и сообщения, указывающие, было ли развертывание успешным:

OutputDeploying: wordcount.

Deployed. 200 OK.
URL: https://example.com/function/wordcount

Deploying: base64.

Deployed. 200 OK.
URL: https://example.com/function/base64

Deploying: markdown.

Deployed. 200 OK.
URL: https://example.com/function/markdown

Deploying: hubstats.

Deployed. 200 OK.
URL: https://example.com/function/hubstats

Deploying: nodeinfo.

Deployed. 200 OK.
URL: https://example.com/function/nodeinfo

Deploying: echoit.

Deployed. 200 OK.
URL: https://example.com/function/echoit

Если вы видите какие-либо ошибки, обязательно устраните их, следуя инструкциям на экране.

После завершения развертывания стека перечислите все функции, чтобы убедиться, что они развернуты и готовы к использованию:

faas-cli list --gateway https://example.com

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

OutputFunction                        Invocations     Replicas
markdown                        0               1
wordcount                       0               1
base64                          0               1
nodeinfo                        0               1
hubstats                        0               1
echoit                          0               1

Если вы не видите здесь свои функции, убедитесь, что командаfaas-cli deploy выполнена успешно.

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

[[step-5 -—- using-the-openfaas-api]] == Шаг 5. Использование API OpenFaaS

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

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

Перейдите в веб-браузере наhttp://editor.swagger.io/. Вас должен приветствовать следующий экран:

Swagger Editor Welcome page

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

Давайте импортируем спецификацию OpenFaaS Swagger. В верхнем меню нажмите кнопкуFile, а затем -Import URL:

Swagger Editor Import URL

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

В поле введите ссылку на спецификацию Swagger OpenFaaS API:https://raw.githubusercontent.com/openfaas/faas/master/api-docs/swagger.yml

Swagger Editor Input URL

После нажатия кнопкиOK редактор Swagger покажет вам ссылку на API для OpenFaaS, которая должна выглядеть так:

Swagger Editor OpenFaaS API specification

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

Swagger Editor Endpoint details

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

Затем вы воспользуетесь командойcurl для связи с API, поэтому вернитесь к своему терминалу. С флагом-u вы сможете передать паруadmin:your_openfaas_password, полученную на шаге 3, а флаг-X будет определять метод запроса. Вы также передадите URL своей конечной точкиhttps://example.com/system/functions:

curl -u admin:your_openfaas_password -X GET https://example.com/system/functions

Вы можете увидеть необходимый метод для каждой конечной точки в документации API.

На шаге 4 вы развернули несколько примеров функций, которые должны появиться в выходных данных:

Output[{"name":"base64","image":"functions/alpine:latest","invocationCount":0,"replicas":1,"envProcess":"base64","availableReplicas":0,"labels":{"com.openfaas.function":"base64","function":"true"}},{"name":"nodeinfo","image":"functions/nodeinfo:latest","invocationCount":0,"replicas":1,"envProcess":"","availableReplicas":0,"labels":{"com.openfaas.function":"nodeinfo","function":"true"}},{"name":"hubstats","image":"functions/hubstats:latest","invocationCount":0,"replicas":1,"envProcess":"","availableReplicas":0,"labels":{"com.openfaas.function":"hubstats","function":"true"}},{"name":"markdown","image":"functions/markdown-render:latest","invocationCount":0,"replicas":1,"envProcess":"","availableReplicas":0,"labels":{"com.openfaas.function":"markdown","function":"true"}},{"name":"echoit","image":"functions/alpine:latest","invocationCount":0,"replicas":1,"envProcess":"cat","availableReplicas":0,"labels":{"com.openfaas.function":"echoit","function":"true"}},{"name":"wordcount","image":"functions/alpine:latest","invocationCount":0,"replicas":1,"envProcess":"wc","availableReplicas":0,"labels":{"com.openfaas.function":"wordcount","function":"true"}}]

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

docker service logs func_gateway

По умолчанию ответ API на вызовcurl возвращает необработанный JSON без новых строк, который не читается человеком. Чтобы проанализировать его, направьте ответcurl утилитеjq, которая преобразует JSON в удобочитаемую форму:

curl -u admin:your_openfaas_password -X GET https://example.com/system/functions | jq

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

Output[
  {
    "name": "base64",
    "image": "functions/alpine:latest",
    "invocationCount": 0,
    "replicas": 1,
    "envProcess": "base64",
    "availableReplicas": 0,
    "labels": {
      "com.openfaas.function": "base64",
      "function": "true"
    }
  },
  {
    "name": "nodeinfo",
    "image": "functions/nodeinfo:latest",
    "invocationCount": 0,
    "replicas": 1,
    "envProcess": "",
    "availableReplicas": 0,
    "labels": {
      "com.openfaas.function": "nodeinfo",
      "function": "true"
    }
  },
  {
    "name": "hubstats",
    "image": "functions/hubstats:latest",
    "invocationCount": 0,
    "replicas": 1,
    "envProcess": "",
    "availableReplicas": 0,
    "labels": {
      "com.openfaas.function": "hubstats",
      "function": "true"
    }
  },
  {
    "name": "markdown",
    "image": "functions/markdown-render:latest",
    "invocationCount": 0,
    "replicas": 1,
    "envProcess": "",
    "availableReplicas": 0,
    "labels": {
      "com.openfaas.function": "markdown",
      "function": "true"
    }
  },
  {
    "name": "echoit",
    "image": "functions/alpine:latest",
    "invocationCount": 0,
    "replicas": 1,
    "envProcess": "cat",
    "availableReplicas": 0,
    "labels": {
      "com.openfaas.function": "echoit",
      "function": "true"
    }
  },
  {
    "name": "wordcount",
    "image": "functions/alpine:latest",
    "invocationCount": 0,
    "replicas": 1,
    "envProcess": "wc",
    "availableReplicas": 0,
    "labels": {
      "com.openfaas.function": "wordcount",
      "function": "true"
    }
  }
]

Давайте возьмем одну из этих функций и выполним ее, используя конечную точку API/function/function-name. Эта конечная точка доступна через метод POST, где флаг-d позволяет отправлять данные в функцию.

Например, давайте запустим следующую командуcurl, чтобы выполнить функциюechoit, которая поставляется с OpenFaaS из коробки и выводит строку, которую вы отправили ей в качестве запроса. Вы можете использовать строку"Sammy The Shark", чтобы продемонстрировать:

curl -u admin:your_openfaas_password -X POST https://example.com/function/func_echoit -d "Sammy The Shark"

Результат покажет вамSammy The Shark:

OutputSammy The Shark

Если вы видите ошибку, следуйте инструкциям на экране, чтобы решить проблему, прежде чем продолжить обучение. Вы также можете проверить журналы службыgateway.

На данный момент вы использовали API OpenFaaS для управления и выполнения своих функций. Давайте теперь посмотрим на веб-интерфейс OpenFaaS.

[[step-6 -—- using-the-openfaas-web-ui]] == Шаг 6. Использование веб-интерфейса OpenFaaS

OpenFaaS поставляется с веб-интерфейсом, который можно использовать для добавления новых и выполнения установленных функций. На этом шаге вы установите функцию для генерации QR-кодов из Магазина FaaS и создадите пример кода.

Для начала укажите в браузереhttps://example.com/ui/. Обратите внимание, что косая черта необходима, чтобы избежать ошибки «not found».

В диалоговом окне аутентификации HTTP введите имя пользователя и пароль, полученные при развертывании OpenFaaS на шаге 3.

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

ЩелкнитеDeploy New Functions, чтобы развернуть новую функцию. Вы увидите окно FaaS Store, в котором представлены проверенные сообществом функции, которые вы можете установить одним щелчком мыши:

OpenFaaS Functions store

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

В этом руководстве вы развернете функциюQR Code Generator из FaaS Store. Найдите в списке элементQR Code Generator - Go, щелкните его, а затем нажмите кнопкуDeploy в нижней части окна:

OpenFaaS QR Code Generator function

После нажатияDeploy окноDeploy A New Function закроется, и функция будет развернута. В списке в левой части окна вы увидите список для функцииqrcode-go. Нажмите на эту запись, чтобы выбрать ее. В главном окне функции будет отображаться имя функции, количество реплик, количество вызовов и изображение, а также опция для вызова функции:

OpenFaaS QR Code Function

Давайте создадим QR-код, содержащий URL-адрес вашего домена. В полеRequest body введите содержимое QR-кода, который вы хотите сгенерировать; в нашем случае это будет“example.com”. Когда вы закончите, нажмите кнопкуInvoke.

Когда вы выбираете параметр выводаText илиJSON, функция выводит содержимое файла, которое невозможно использовать или прочитать человеку:

OpenFaaS generated QR code

Вы можете скачать ответ. который в нашем случае будет файл PNG с QR-кодом. Для этого выберите параметрDownload, а затем еще раз щелкнитеInvoke. Вскоре после этого у вас должен быть загружен QR-код, который вы можете открыть с помощью программы просмотра изображений по вашему выбору:

Generated QR code

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

[[step-7 -—- created-functions-with-the-faas-cli]] == Шаг 7 - Создание функций с помощью интерфейса командной строки FaaS

На предыдущих шагах вы настроили интерфейс командной строки FaaS для работы с сервером OpenFaaS. FaaS CLI - это интерфейс командной строки, который вы можете использовать для управления OpenFaaS, а также для установки и запуска функций, как если бы вы использовали API или веб-интерфейс.

По сравнению с веб-интерфейсом или API-интерфейсом интерфейс FaaS CLI содержит шаблоны для многих языков программирования, которые вы можете использовать для создания своих собственных функций. Он также может создавать образы контейнеров на основе кода вашей функции и передавать изображения в реестр изображений, например Docker Hub.

На этом шаге вы создадите функцию, опубликуете ее в Docker Hub, а затем запустите на своем сервере OpenFaaS. Эта функция будет похожа на функцию по умолчаниюechoit, которая возвращает ввод, переданный как запрос.

Мы будем использовать Python для написания нашей функции. Если вы хотите узнать больше о Python, вы можете ознакомиться с нашимиHow To Code in Python 3 tutorial series и нашимиHow To Code in Python eBook.

Перед созданием новой функции давайте создадим каталог для хранения функций FaaS и перейдем к нему:

mkdir ~/faas-functions
cd ~/faas-functions

Выполните следующую команду, чтобы создать новую функцию Python с именемecho-input. Не забудьте заменитьyour-docker-hub-username своим именем пользователя Docker Hub, поскольку позже вы отправите функцию в Docker Hub:

faas-cli new echo-input --lang python --prefix your-docker-hub-username --gateway https://example.com

Вывод содержит подтверждение об успешном создании функции. Если у вас нет загруженных шаблонов, CLI загрузит шаблоны в текущем каталоге:

Output2018/05/13 12:13:06 No templates found in current directory.
2018/05/13 12:13:06 Attempting to expand templates from https://github.com/openfaas/templates.git
2018/05/13 12:13:11 Fetched 12 template(s) : [csharp dockerfile go go-armhf node node-arm64 node-armhf python python-armhf python3 python3-armhf ruby] from https://github.com/openfaas/templates.git
Folder: echo-input created.
  ___                   _____           ____
 / _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 \___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
      |_|


Function created in folder: echo-input
Stack file written: echo-input.yml

Результатом выполнения командыfaas-cli new является вновь созданный каталог~/faas-fucntions/echo-input, содержащий код функции и файлecho-input.yml. Этот файл содержит информацию о вашей функции: на каком языке он находится, его имя и сервер, на котором вы его развернете.

Перейдите в каталог~/faas-fucntions/echo-input:

cd ~/faas-fucntions/echo-input

Чтобы увидеть содержимое каталога, выполните:

ls

Каталог содержит два файла:handler.py, который содержит код вашей функции, иrequirements.txt, который содержит модули Python, необходимые для функции.

Поскольку в настоящее время нам не требуются какие-либо нестандартные модули Python, файлrequirements.txt пуст. Вы можете проверить это с помощью командыcat:

cat requirements.txt

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

В файлеhandler.py уже есть пример кода обработчика, который возвращает полученный ответ в виде строки. Давайте посмотрим на код:

nano handler.py

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

def handle(req):
    """handle a request to the function
    Args:
        req (str): request body
    """

    return req

Давайте изменим его, чтобы включить дополнительный текст, заменив строку в директивеreturn следующим образом:

    return "Received message: " + req

Когда вы закончите, сохраните файл и закройте текстовый редактор.

Далее, давайте создадим образ Docker из исходного кода функции. Перейдите в каталогfaas-functions, в котором находится файлecho-input.yml:

cd ~/faas-functions

Следующая команда создает образ Docker для вашей функции:

faas-cli build -f echo-input.yml

Вывод содержит информацию о ходе сборки:

Output[0] > Building echo-input.
Clearing temporary build folder: ./build/echo-input/
Preparing ./echo-input/ ./build/echo-input/function
Building: sammy/echo-input with python template. Please wait..
Sending build context to Docker daemon  7.168kB
Step 1/16 : FROM python:2.7-alpine
 ---> 5fdd069daf25
Step 2/16 : RUN apk --no-cache add curl     && echo "Pulling watchdog binary from Github."     && curl -sSL https://github.com/openfaas/faas/releases/download/0.8.0/fwatchdog > /usr/bin/fwatchdog     && chmod +x /usr/bin/fwatchdog     && apk del curl --no-cache
 ---> Using cache
 ---> 247d4772623a
Step 3/16 : WORKDIR /root/
 ---> Using cache
 ---> 532cc683d67b
Step 4/16 : COPY index.py           .
 ---> Using cache
 ---> b4b512152257
Step 5/16 : COPY requirements.txt   .
 ---> Using cache
 ---> 3f9cbb311ab4
Step 6/16 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> dd7415c792b1
Step 7/16 : RUN mkdir -p function
 ---> Using cache
 ---> 96c25051cefc
Step 8/16 : RUN touch ./function/__init__.py
 ---> Using cache
 ---> 77a9db274e32
Step 9/16 : WORKDIR /root/function/
 ---> Using cache
 ---> 88a876eca9e3
Step 10/16 : COPY function/requirements.txt .
 ---> Using cache
 ---> f9ba5effdc5a
Step 11/16 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> 394a1dd9e4d7
Step 12/16 : WORKDIR /root/
 ---> Using cache
 ---> 5a5893c25b65
Step 13/16 : COPY function           function
 ---> eeddfa67018d
Step 14/16 : ENV fprocess="python index.py"
 ---> Running in 8e53df4583f2
Removing intermediate container 8e53df4583f2
 ---> fb5086bc7f6c
Step 15/16 : HEALTHCHECK --interval=1s CMD [ -e /tmp/.lock ] || exit 1
 ---> Running in b38681a71378
Removing intermediate container b38681a71378
 ---> b04c045b0994
Step 16/16 : CMD ["fwatchdog"]
 ---> Running in c5a11078df3d
Removing intermediate container c5a11078df3d
 ---> bc5f08157c5a
Successfully built bc5f08157c5a
Successfully tagged sammy/echo-input:latest
Image: your-docker-hub-username/echo-input built.
[0] < Building echo-input done.
[0] worker done.

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

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

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

Выполните следующую команду, чтобы отправить созданный образ в указанный вами репозиторий в Docker Hub:

faas-cli push -f echo-input.yml

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

Output[0] > Pushing echo-input.
The push refers to repository [docker.io/sammy/echo-input]
320ea573b385: Pushed
9d87e56f5d0c: Pushed
6f79b75e7434: Pushed
23aac2d8ecf2: Pushed
2bec17d09b7e: Pushed
e5a0e5ab3be6: Pushed
e9c8ca932f1b: Pushed
beae1d55b4ce: Pushed
2fcae03ed1f7: Pushed
62103d5daa03: Mounted from library/python
f6ac6def937b: Mounted from library/python
55c108c7613c: Mounted from library/python
e53f74215d12: Mounted from library/python
latest: digest: sha256:794fa942c2f593286370bbab2b6c6b75b9c4dcde84f62f522e59fb0f52ba05c1 size: 3033
[0] < Pushing echo-input done.
[0] worker done.

Наконец, когда ваш образ помещен в Docker Hub, вы можете использовать его для развертывания функции на вашем сервере OpenFaaS.

Чтобы развернуть вашу функцию, запустите командуdeploy, которая берет путь к манифесту, описывающему вашу функцию, а также адрес вашего сервера OpenFaaS:

faas-cli deploy -f echo-input.yml --gateway https://example.com

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

OutputDeploying: echo-input.

Deployed. 200 OK.
URL: https://example.com/function/echo-input

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

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

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

Выполните следующую команду, чтобы вызвать функциюecho-input:

faas-cli invoke echo-input --gateway https://example.com

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

OutputReading from STDIN - hit (Control + D) to stop.

Введите текст, который вы хотите отправить в функцию, например:

Sammy The Shark!

Когда вы закончите, нажмитеENTER, а затемCTRL + D, чтобы завершить запрос. ЯрлыкCTRL + D в терминале используется для регистрации конца файла (EOF). CLI OpenFaaS прекращает чтение с терминала после получения EOF.

Через несколько секунд команда выведет ответ функции:

OutputReading from STDIN - hit (Control + D) to stop.
Sammy The Shark!
Received message: Sammy The Shark!

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

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

Заключение

В этом руководстве вы использовали безсерверную архитектуру и OpenFaaS для развертывания и управления своими приложениями с помощью API OpenFaaS, веб-интерфейса пользователя и интерфейса командной строки. Вы также обезопасили свою инфраструктуру, используя Traefik для предоставления SSL с использованием Let Encrypt.

Если вы хотите узнать больше о проекте OpenFaaS, вы можете проверить ихwebsite иproject’s official documentation.

Related