HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 Сегодня рассмотрим процесс развертывания OpenWhisk поверх Kubernetes с исправленными командами для работоспособности с актуальными версиями приложений. Также будет описан процесс запуска функций OpenWhisk с использованием Knative и TektonCD в Kubernetes с использованием среды исполнения Nodejs.<h2>Разворачиваем OpenWhisk на Kubernetes</h2>
1 Сегодня рассмотрим процесс развертывания OpenWhisk поверх Kubernetes с исправленными командами для работоспособности с актуальными версиями приложений. Также будет описан процесс запуска функций OpenWhisk с использованием Knative и TektonCD в Kubernetes с использованием среды исполнения Nodejs.<h2>Разворачиваем OpenWhisk на Kubernetes</h2>
2 За несколько дней я провела эксперимент по развертыванию OpenWhisk в Kubernetes для создания простого и быстрого полигона для отработки задач. А поскольку я новичок в Kubernetes - полагаю, что полтора дня было потрачено на успешное развертывание. В <a>этом</a> репозитории есть очень понятные инструкции для развертывания OpenWhisk в Kubernetes. Здесь будут инструкции для развертывания, сделанные для Mac (<em>я также буду делать все на Linux, потому что предпочитаю Linux.</em> - прим. переводчика).<p>1. Устанавливаем пакетный менеджер asdf, после чего автоматически исправляем ~/.bash_profile или его аналог так:</p>
2 За несколько дней я провела эксперимент по развертыванию OpenWhisk в Kubernetes для создания простого и быстрого полигона для отработки задач. А поскольку я новичок в Kubernetes - полагаю, что полтора дня было потрачено на успешное развертывание. В <a>этом</a> репозитории есть очень понятные инструкции для развертывания OpenWhisk в Kubernetes. Здесь будут инструкции для развертывания, сделанные для Mac (<em>я также буду делать все на Linux, потому что предпочитаю Linux.</em> - прим. переводчика).<p>1. Устанавливаем пакетный менеджер asdf, после чего автоматически исправляем ~/.bash_profile или его аналог так:</p>
3 <blockquote><em>$ brew install asdf</em></blockquote><blockquote><em>$ [ -s "/usr/local/opt/asdf/asdf.sh" ] &amp;&amp; . /usr/local/opt/asdf/asdf.sh</em></blockquote><blockquote><em>$ source ~/.bash_profile</em></blockquote>[<em>На Linux этот шаг не нужен, хотя brew есть.</em> - прим. переводчика]<p>2. Добавляем плагины minikube и kubelet:</p>
3 <blockquote><em>$ brew install asdf</em></blockquote><blockquote><em>$ [ -s "/usr/local/opt/asdf/asdf.sh" ] &amp;&amp; . /usr/local/opt/asdf/asdf.sh</em></blockquote><blockquote><em>$ source ~/.bash_profile</em></blockquote>[<em>На Linux этот шаг не нужен, хотя brew есть.</em> - прим. переводчика]<p>2. Добавляем плагины minikube и kubelet:</p>
4 <blockquote><em>$ asdf plugin-add kubectl</em></blockquote><blockquote><em>$ asdf plugin-add minikube</em></blockquote>[<em>Опять же пропускаем этот шаг на Linux.</em> - прим. переводчика]<p>3. Ставим minikube и kubelet:</p>
4 <blockquote><em>$ asdf plugin-add kubectl</em></blockquote><blockquote><em>$ asdf plugin-add minikube</em></blockquote>[<em>Опять же пропускаем этот шаг на Linux.</em> - прим. переводчика]<p>3. Ставим minikube и kubelet:</p>
5 <blockquote><em>$ asdf install kubectl 1.9.0</em></blockquote><blockquote><em>$ asdf global kubectl 1.9.0</em></blockquote><blockquote><em>$ asdf install minikube 0.25.2</em></blockquote><blockquote><em>$ asdf global minikube 0.25.2</em></blockquote>[<em>ставятся конкретные версии, но я проверял все на последних доступных версиях для Linux; подозреваю, что можно смело ставить latest.</em> - прим. переводчика]<p>На Linux этот шаг делается примерно так (все ставится в ~/bin, который у меня прописан в PATH, прим. переводчика): <em><a>https://xpaste.pro/p/jo5NJGmS</a></em></p>
5 <blockquote><em>$ asdf install kubectl 1.9.0</em></blockquote><blockquote><em>$ asdf global kubectl 1.9.0</em></blockquote><blockquote><em>$ asdf install minikube 0.25.2</em></blockquote><blockquote><em>$ asdf global minikube 0.25.2</em></blockquote>[<em>ставятся конкретные версии, но я проверял все на последних доступных версиях для Linux; подозреваю, что можно смело ставить latest.</em> - прим. переводчика]<p>На Linux этот шаг делается примерно так (все ставится в ~/bin, который у меня прописан в PATH, прим. переводчика): <em><a>https://xpaste.pro/p/jo5NJGmS</a></em></p>
6 <p>4. Создаем виртуальную машину minikube (должен быть предварительно установлен VirtualBox): <em><a>https://xpaste.pro/p/Vc2m8KDV</a></em></p>
6 <p>4. Создаем виртуальную машину minikube (должен быть предварительно установлен VirtualBox): <em><a>https://xpaste.pro/p/Vc2m8KDV</a></em></p>
7 <p>[<em>У меня все работает с командой</em> minikube start <em>, без параметров и со значениями по-умолчанию.</em> - прим. переводчика]</p>
7 <p>[<em>У меня все работает с командой</em> minikube start <em>, без параметров и со значениями по-умолчанию.</em> - прим. переводчика]</p>
8 <em><a>Скопировать код</a></em><p>5. Переключаем сеть в Docker в неразборчивый режим:</p>
8 <em><a>Скопировать код</a></em><p>5. Переключаем сеть в Docker в неразборчивый режим:</p>
9 <blockquote><em>$ minikube ssh -- sudo ip link set docker0 promisc on</em></blockquote>6. Создаем namespace и помечаем рабочий узел:<blockquote><em>$ kubectl create namespace openwhisk</em></blockquote><blockquote><em>$ kubectl label nodes --all openwhisk-role=invoker</em></blockquote>7. Получаем содержимое репозитория и переопределяем тип для ingress в файле mycluster.yaml:<em><a>Скопировать код</a></em><p>8. Устанавливаем Helm и проводим развертывание с его помощью: <em><a>https://xpaste.pro/p/U2NKdtv7</a></em></p>
9 <blockquote><em>$ minikube ssh -- sudo ip link set docker0 promisc on</em></blockquote>6. Создаем namespace и помечаем рабочий узел:<blockquote><em>$ kubectl create namespace openwhisk</em></blockquote><blockquote><em>$ kubectl label nodes --all openwhisk-role=invoker</em></blockquote>7. Получаем содержимое репозитория и переопределяем тип для ingress в файле mycluster.yaml:<em><a>Скопировать код</a></em><p>8. Устанавливаем Helm и проводим развертывание с его помощью: <em><a>https://xpaste.pro/p/U2NKdtv7</a></em></p>
10 <p>[<em>На Linux с последними версиями (была доступна v3.0.1) будет чуть по-другому.</em> - прим. переводчика]</p>
10 <p>[<em>На Linux с последними версиями (была доступна v3.0.1) будет чуть по-другому.</em> - прим. переводчика]</p>
11 <p>Посмотреть код: <em><a>https://xpaste.pro/p/nHbvAzhx</a></em></p>
11 <p>Посмотреть код: <em><a>https://xpaste.pro/p/nHbvAzhx</a></em></p>
12 <p>9. Проверяем, что все поднялось (STATUS = Running или Completed):</p>
12 <p>9. Проверяем, что все поднялось (STATUS = Running или Completed):</p>
13 <em><a>Скопировать код</a></em><p>10. Настраиваем wsk для работы: <em><a>https://xpaste.pro/p/Iul9XMVk</a></em></p>
13 <em><a>Скопировать код</a></em><p>10. Настраиваем wsk для работы: <em><a>https://xpaste.pro/p/Iul9XMVk</a></em></p>
14 <p>Проверяем:</p>
14 <p>Проверяем:</p>
15 <blockquote><em>$ wsk -i list</em></blockquote><blockquote><em>Entities in namespace: default</em></blockquote><blockquote><em>packages</em></blockquote><blockquote><em>actions</em></blockquote><blockquote><em>triggers</em></blockquote><blockquote><em>rules</em></blockquote><h2>Проблемы и их решения</h2>
15 <blockquote><em>$ wsk -i list</em></blockquote><blockquote><em>Entities in namespace: default</em></blockquote><blockquote><em>packages</em></blockquote><blockquote><em>actions</em></blockquote><blockquote><em>triggers</em></blockquote><blockquote><em>rules</em></blockquote><h2>Проблемы и их решения</h2>
16 <h2>getsockopt: connection refused</h2>
16 <h2>getsockopt: connection refused</h2>
17 Посмотреть код: <em><a>https://xpaste.pro/p/c4xwYJs4</a></em><p>Проверяем, что контейнеры в namespace openwhisk в статусе Running, т.к. иногда оно падает с ошибками CreateContainerConfigError.</p>
17 Посмотреть код: <em><a>https://xpaste.pro/p/c4xwYJs4</a></em><p>Проверяем, что контейнеры в namespace openwhisk в статусе Running, т.к. иногда оно падает с ошибками CreateContainerConfigError.</p>
18 <h2>Invoker still initializing - Init:1/2</h2>
18 <h2>Invoker still initializing - Init:1/2</h2>
19 Процесс скачивания всевозможных сред выполнения может занять много времени. Для ускорения можно указать сокращенный минимальный список в файле mycluster.yaml:<blockquote><em>whisk:</em></blockquote><blockquote><em>runtimes: "runtimes-minimal-travis.json"</em></blockquote><h2>Контейнер с именем <em>-install-packages-</em> вываливается в Error</h2>
19 Процесс скачивания всевозможных сред выполнения может занять много времени. Для ускорения можно указать сокращенный минимальный список в файле mycluster.yaml:<blockquote><em>whisk:</em></blockquote><blockquote><em>runtimes: "runtimes-minimal-travis.json"</em></blockquote><h2>Контейнер с именем <em>-install-packages-</em> вываливается в Error</h2>
20 Просто нарастите таймауты для liveness тестов.<h2>Установка OpenWhisk поверх Knative</h2>
20 Просто нарастите таймауты для liveness тестов.<h2>Установка OpenWhisk поверх Knative</h2>
21 Priti Desai проводила установку поверх кластера в облаке IBM, а также на обычном minikube, используя Knative Build и BuildTemplates. Я тоже буду устанавливать поверх minukube, по мотивам того, как <a>это было описано</a> в нашем блоге ранее - с использованием последних версий ПО. Поскольку Knative Build и BuildTemplates официально объявлены устаревшими, буду использовать рекомендуемую замену в виде Tekton Pipelines. Дальнейшая часть статьи написана после прочтения документации к Tekton Pipelines, но основана на идеях Priti. Для работы потребуется доступ к некоторой Docker Registry - я, как и оригинальный автор, буду использовать DockerHub.<a>Скопировать код</a><em>Сборка и работа OpenWhisk поверх Knative</em><ol><li>Получаем содержимое <a>этого репозитория</a>:</li>
21 Priti Desai проводила установку поверх кластера в облаке IBM, а также на обычном minikube, используя Knative Build и BuildTemplates. Я тоже буду устанавливать поверх minukube, по мотивам того, как <a>это было описано</a> в нашем блоге ранее - с использованием последних версий ПО. Поскольку Knative Build и BuildTemplates официально объявлены устаревшими, буду использовать рекомендуемую замену в виде Tekton Pipelines. Дальнейшая часть статьи написана после прочтения документации к Tekton Pipelines, но основана на идеях Priti. Для работы потребуется доступ к некоторой Docker Registry - я, как и оригинальный автор, буду использовать DockerHub.<a>Скопировать код</a><em>Сборка и работа OpenWhisk поверх Knative</em><ol><li>Получаем содержимое <a>этого репозитория</a>:</li>
22 </ol><blockquote><em>$ git clone https://github.com/tektoncd/catalog/</em></blockquote><blockquote><em>$ cd catalog/openwhisk</em></blockquote>1. Выставляем в виде переменных окружения данные для доступа к Registry и сохраняем их в виде секрета Kubernetes: <a>https://xpaste.pro/p/rYK0xqqX</a><p>Проверяем:</p>
22 </ol><blockquote><em>$ git clone https://github.com/tektoncd/catalog/</em></blockquote><blockquote><em>$ cd catalog/openwhisk</em></blockquote>1. Выставляем в виде переменных окружения данные для доступа к Registry и сохраняем их в виде секрета Kubernetes: <a>https://xpaste.pro/p/rYK0xqqX</a><p>Проверяем:</p>
23 <em><a>Скопировать код</a></em><p>2. Создаем учетную запись для сборки окружений:</p>
23 <em><a>Скопировать код</a></em><p>2. Создаем учетную запись для сборки окружений:</p>
24 <blockquote><em>$ kubectl apply -f service-account.yaml</em></blockquote>Проверяем:<em><a>Скопировать код</a></em><p>3. Создаем задачу для сборки образа для OpenWhisk</p>
24 <blockquote><em>$ kubectl apply -f service-account.yaml</em></blockquote>Проверяем:<em><a>Скопировать код</a></em><p>3. Создаем задачу для сборки образа для OpenWhisk</p>
25 <blockquote><em>$ kubectl apply -f openwhisk.yaml</em></blockquote><blockquote><em>task.tekton.dev/openwhisk created</em></blockquote>4. Запускаем задачу для сборки образа (на примере NodeJS):<p>Создаем файл taskrun.yaml с содержимым: <em><a>https://xpaste.pro/p/PkxjnxGb</a></em></p>
25 <blockquote><em>$ kubectl apply -f openwhisk.yaml</em></blockquote><blockquote><em>task.tekton.dev/openwhisk created</em></blockquote>4. Запускаем задачу для сборки образа (на примере NodeJS):<p>Создаем файл taskrun.yaml с содержимым: <em><a>https://xpaste.pro/p/PkxjnxGb</a></em></p>
26 <p>Применяем актуальные данные для этого файла:</p>
26 <p>Применяем актуальные данные для этого файла:</p>
27 <blockquote><em>$ sed 's/${DOCKER_USERNAME}/'"$DOCKER_USERNAME"'/' -i taskrun.yaml</em></blockquote>Применяем:<blockquote><em>$ kubectl apply -f taskrun.yaml</em></blockquote><blockquote><em>pipelineresource.tekton.dev/openwhisk-nodejs-runtime-git created</em></blockquote><blockquote><em>pipelineresource.tekton.dev/openwhisk-nodejs-helloworld-image created</em></blockquote><blockquote><em>taskrun.tekton.dev/openwhisk-nodejs-helloworld created</em></blockquote>Проверка работы заключается в получении имени pod`а, просмотра его статуса. Также можно посмотреть журнал выполнения каждого шага, например:<em> <a>https://xpaste.pro/p/Rr1eVB5T</a></em><p>После выполнения у нас в Registry появится образ, который может быть развернут с помощью утилиты kn, предназначенной для работы с Knative сервисами, например: <em><a>https://xpaste.pro/p/bwmFgoDF</a></em></p>
27 <blockquote><em>$ sed 's/${DOCKER_USERNAME}/'"$DOCKER_USERNAME"'/' -i taskrun.yaml</em></blockquote>Применяем:<blockquote><em>$ kubectl apply -f taskrun.yaml</em></blockquote><blockquote><em>pipelineresource.tekton.dev/openwhisk-nodejs-runtime-git created</em></blockquote><blockquote><em>pipelineresource.tekton.dev/openwhisk-nodejs-helloworld-image created</em></blockquote><blockquote><em>taskrun.tekton.dev/openwhisk-nodejs-helloworld created</em></blockquote>Проверка работы заключается в получении имени pod`а, просмотра его статуса. Также можно посмотреть журнал выполнения каждого шага, например:<em> <a>https://xpaste.pro/p/Rr1eVB5T</a></em><p>После выполнения у нас в Registry появится образ, который может быть развернут с помощью утилиты kn, предназначенной для работы с Knative сервисами, например: <em><a>https://xpaste.pro/p/bwmFgoDF</a></em></p>
28 <p>В случае использования Gloo проверить работоспособность можно так: <em><a>https://xpaste.pro/p/c7835mL6</a></em></p>
28 <p>В случае использования Gloo проверить работоспособность можно так: <em><a>https://xpaste.pro/p/c7835mL6</a></em></p>
29 <p>Статьи по теме:<a>Бессерверные вычисления на основе OpenWhisk. Часть 1</a><a>Бессерверные вычисления на основе OpenWhisk. Часть 2</a><a>Бессерверные вычисления на основе OpenWhisk. Часть 3</a></p>
29 <p>Статьи по теме:<a>Бессерверные вычисления на основе OpenWhisk. Часть 1</a><a>Бессерверные вычисления на основе OpenWhisk. Часть 2</a><a>Бессерверные вычисления на основе OpenWhisk. Часть 3</a></p>