Блог Слёрм

Бессерверные вычисления на основе OpenWhisk. Часть 4

Сегодня рассмотрим процесс развертывания OpenWhisk поверх Kubernetes с исправленными командами для работоспособности с актуальными версиями приложений. Также будет описан процесс запуска функций OpenWhisk с использованием Knative и TektonCD в Kubernetes с использованием среды исполнения Nodejs.

Разворачиваем OpenWhisk на Kubernetes


За несколько дней я провела эксперимент по развертыванию OpenWhisk в Kubernetes для создания простого и быстрого полигона для отработки задач. А поскольку я новичок в Kubernetes — полагаю, что полтора дня было потрачено на успешное развертывание. В этом репозитории есть очень понятные инструкции для развертывания OpenWhisk в Kubernetes. Здесь будут инструкции для развертывания, сделанные для Mac (я также буду делать все на Linux, потому что предпочитаю Linux. — прим. переводчика).

1. Устанавливаем пакетный менеджер asdf, после чего автоматически исправляем ~/.bash_profile или его аналог так:

$ brew install asdf
$ [ -s "/usr/local/opt/asdf/asdf.sh" ] && . /usr/local/opt/asdf/asdf.sh
$ source ~/.bash_profile

[На Linux этот шаг не нужен, хотя brew есть. — прим. переводчика]

2. Добавляем плагины minikube и kubelet:

$ asdf plugin-add kubectl
$ asdf plugin-add minikube

[Опять же пропускаем этот шаг на Linux. — прим. переводчика]

3. Ставим minikube и kubelet:

$ asdf install kubectl 1.9.0
$ asdf global kubectl 1.9.0
$ asdf install minikube 0.25.2
$ asdf global minikube 0.25.2

[ставятся конкретные версии, но я проверял все на последних доступных версиях для Linux; подозреваю, что можно смело ставить latest. — прим. переводчика]

На Linux этот шаг делается примерно так (все ставится в ~/bin, который у меня прописан в PATH, прим. переводчика): https://xpaste.pro/p/jo5NJGmS

4. Создаем виртуальную машину minikube (должен быть предварительно установлен VirtualBox): https://xpaste.pro/p/Vc2m8KDV

[У меня все работает с командой minikube start , без параметров и со значениями по-умолчанию. — прим. переводчика]

Скопировать код

5. Переключаем сеть в Docker в неразборчивый режим:

$ minikube ssh -- sudo ip link set docker0 promisc on

6. Создаем namespace и помечаем рабочий узел:

$ kubectl create namespace openwhisk
$ kubectl label nodes --all openwhisk-role=invoker

7. Получаем содержимое репозитория и переопределяем тип для ingress в файле mycluster.yaml:

Скопировать код

8. Устанавливаем Helm и проводим развертывание с его помощью: https://xpaste.pro/p/U2NKdtv7

[На Linux с последними версиями (была доступна v3.0.1) будет чуть по-другому. — прим. переводчика]

Посмотреть код: https://xpaste.pro/p/nHbvAzhx

9. Проверяем, что все поднялось (STATUS = Running или Completed):

Скопировать код

10. Настраиваем wsk для работы: https://xpaste.pro/p/Iul9XMVk

Проверяем:

$ wsk -i list
Entities in namespace: default
packages
actions
triggers
rules

Проблемы и их решения


getsockopt: connection refused


Посмотреть код: https://xpaste.pro/p/c4xwYJs4

Проверяем, что контейнеры в namespace openwhisk в статусе Running, т.к. иногда оно падает с ошибками CreateContainerConfigError.

Invoker still initializing — Init:1/2


Процесс скачивания всевозможных сред выполнения может занять много времени. Для ускорения можно указать сокращенный минимальный список в файле mycluster.yaml:

whisk:
runtimes: "runtimes-minimal-travis.json"

Контейнер с именем -install-packages- вываливается в Error


Просто нарастите таймауты для liveness тестов.

Установка OpenWhisk поверх Knative


Priti Desai проводила установку поверх кластера в облаке IBM, а также на обычном minikube, используя Knative Build и BuildTemplates. Я тоже буду устанавливать поверх minukube, по мотивам того, как это было описано в нашем блоге ранее — с использованием последних версий ПО. Поскольку Knative Build и BuildTemplates официально объявлены устаревшими, буду использовать рекомендуемую замену в виде Tekton Pipelines. Дальнейшая часть статьи написана после прочтения документации к Tekton Pipelines, но основана на идеях Priti. Для работы потребуется доступ к некоторой Docker Registry — я, как и оригинальный автор, буду использовать DockerHub.

Скопировать код


Сборка и работа OpenWhisk поверх Knative

  1. Получаем содержимое этого репозитория:

$ git clone https://github.com/tektoncd/catalog/
$ cd catalog/openwhisk

1. Выставляем в виде переменных окружения данные для доступа к Registry и сохраняем их в виде секрета Kubernetes: https://xpaste.pro/p/rYK0xqqX

Проверяем:

Скопировать код

2. Создаем учетную запись для сборки окружений:

$ kubectl apply -f service-account.yaml

Проверяем:

Скопировать код

3. Создаем задачу для сборки образа для OpenWhisk

$ kubectl apply -f openwhisk.yaml
task.tekton.dev/openwhisk created

4. Запускаем задачу для сборки образа (на примере NodeJS):

Создаем файл taskrun.yaml с содержимым: https://xpaste.pro/p/PkxjnxGb


Применяем актуальные данные для этого файла:

$ sed 's/${DOCKER_USERNAME}/'"$DOCKER_USERNAME"'/' -i taskrun.yaml

Применяем:

$ kubectl apply -f taskrun.yaml
pipelineresource.tekton.dev/openwhisk-nodejs-runtime-git created
pipelineresource.tekton.dev/openwhisk-nodejs-helloworld-image created
taskrun.tekton.dev/openwhisk-nodejs-helloworld created

Проверка работы заключается в получении имени pod`а, просмотра его статуса. Также можно посмотреть журнал выполнения каждого шага, например: https://xpaste.pro/p/Rr1eVB5T

После выполнения у нас в Registry появится образ, который может быть развернут с помощью утилиты kn, предназначенной для работы с Knative сервисами, например: https://xpaste.pro/p/bwmFgoDF

В случае использования Gloo проверить работоспособность можно так: https://xpaste.pro/p/c7835mL6

Статьи по теме:
Бессерверные вычисления на основе OpenWhisk. Часть 1
Бессерверные вычисления на основе OpenWhisk. Часть 2
Бессерверные вычисления на основе OpenWhisk. Часть 3
DevOps