Разворачиваем 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
- Получаем содержимое этого репозитория:
$ 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