Павло Щербуха

Logo

Персональна освітня сорінка

Розробка на Node.js, VUE.js, Python, IBM Integration Bus (App Connect Ent) , ORACLE PL/SQL
30 March 2023

ibm cloud Code Engine

by Pavlo Shcherbukha

Постановка проблеми

Років 5 тому було розроблено додаток, частина якого працювала в IBM Cloud на платформі CloudFoundary. Зараз ця платформа виводиться із експлуатації і виникла проблема, куди мінгрувати. Одним з очевидних рішень є міграція та розгортання додатку на serverles платформі CodeEngine, що є одним з варіантів використання kubernetis knative. Початковим крокам з вивченнмя цієї платформи і присвячений цей блог.

Основними відправними моментами є такі твердження:

Посилання на потрібну документацію

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

В результаті багатьох спроб, мені здається, що вибрав оптимальний шлях deployment за допомогою CLI, що дає можливість явно контролювати всі ресурси, які використовуються на кожному кроці deployment. Ну, а далі, ці команди можна вбудувати в яку небуть локальну pipeline, та виконати deployment.

Установка IBM CLI та необхідних плагінів.

Перш за все для работи знадоиться встановити IBM Cloud CLI, за лінком IBM Cloud CLI. Також знадобиться встановити два розширення (plugins):

ibmcloud plugin install code-engine
ibmcloud plugin install container-registry

Перевірка того, що плагіни встановлені:

ibmcloud plugin list

pic-01

І для довідки, щоб отримати перелік всіх плагінів, потрібно виконати команду:

ibmcloud plugin repo-plugins

pic-02

Швидкий логін в IBM CLoud

За звичай в IBM Cloud можна зайти по вашому логін пароль. Але, якщо вам потрібно запустити якийсь devops процес то потрібно виконати описану далі послідовність команд. З її допомгою зненерувати API-KEY і уже його використовувати для входу в IBM Cloud. Ну, щось схоже з логіном то token в RedHat Openshift. Таким чином, в цьому розділі:

Зайдемо в IBM CLoud з допомогою CLI по логін/пароль

Приклад команди ibmcloud login:


 ibmcloud login -a https://cloud.ibm.com -u myname@gmail.com -r eu-gb -g default

Де:

Найменування групи ресурсів. За замовочуваням створбється група ресурсів “default”

Мені не подобається вводити логін і пароль, тому я входжу через onetime password з Cloud Dashboard:

pic-03

І найбільш для мене прийнятний і найшвидший, через явний onetime password:


 ibmcloud login -a https://cloud.ibm.com -u myname@gmail.com  --sso -r eu-gb -g default

де:

Реpультат входу в CLI показано на pic-04.

pic-04

Згенеруємо API-KEY для подальших логінів та Вивантажемо його у вигляді json-файлу

Можливість зайти в CLI і з допомогою згенерированого API-KEY описана за лінком: API-KEY.

Створити API-KEY можна комнадою:

ibmcloud iam api-key-create NAME [-d DESCRIPTION] [--file FILE] [--lock] 

Таким чином, створений API-KEY запишеться в локальний файл и будемо його викорстовувати в подальших опреаціях. Створимо його командою:

ibmcloud iam api-key-create examplekey -d "APIKEY FOR EXAMPLE" --file psh-example-key.json 

Реpультат показано на pic-05.

pic-05

А сам psh-example-key.json вигляає так:pic-06

pic-06

Зайдемо в IBM CLoud з допомогою CLI по API-KEY

ibmcloud login -a cloud.ibm.com --apikey 96**cV-ez*********************** -r eu-gb  -g Default


Або з використанням створеного файла

ibmcloud login -a cloud.ibm.com --apikey @psh-example-key.json -r eu-gb  -g Default

pic-07

На цьому, вивчення можливостей команди login закінчено. Нам цього достатньо.

Deployment додатка в IBM Cloud Engine

Deployment буде виконуватися з Dockerfile, що лежить рядом з source code.

Створити project

Project це сутність, що групує ваші application та jobs в єдине ціле. До нього ж прив’язується Container Registry на який складаються образи створиених app. Project створюється командою ibmcloud ce project create. Створиме проект sh-storage-prh

   ibmcloud ce project create --name sh-storage-prh  

Результат виконання показано на pic-08

pic-08

Довідково:

Прив’язування container registry. Створити API-KEY для доступу до container registry

Щоб створити відповідний API-KEY потрібно зайти так, як показано на pic-13 в IBM Cloud Dashboard та бажано скачати JSON-файл.

pic-13

Прив’язування container registry. Створення сontainer registry

Container registry так же як і docker registry зберігають образи побудованих контейнерів. До проекта прив’язується сontainer registry. Звичайно, до цього потрібно переключитися на відповідний контекст проекту **ibmcloud ce project select.

Створення сontainer registry, що прив’язаний до відповідного Codeengine Project виконується командою ibmcloud ce registry create. При цьомуствориться namesapce та одноіменний secret до нього.


ibmcloud ce registry create --name sh-storage-prh-rgstr --server uk.icr.io --username iamapikey --password ********

В якості ключа –password вносимо отримане значення API-KEY.

Результат виконання показано на pic-10.

pic-10

Перевірити виконання команди можна виконавши ibmcloud ce registry list (отримати список container registry namespaces, створених для code engine):

ibmcloud ce registry list

та

ibmcloud ce registry get

 ibmcloud ce registry get --name sh-storage-prh-rgstr

А secret можна побачити в cloud Dashboard так, як показано на pic-09.

pic-09

На цьому етапі закінчені необхідні передумови для створення додатка і можна переходити безпосередньо до створення додатка Application Depoyment.

Application Depoyment. Створення профіля для побудови контейнера build

Розділ команд build використовується для опису методу побудови контейнера с програмного коду. В моєму випадку програмний код знаходиться в публічному github repo IBM Code Engine Node.js BackEnd with Cloudant, а сам Dockerfile, в якому описано, як будувати знаходиться в корені цього ж repo Dockerfile. В якості базовго образу взято RedHat UBI8 контейнер, адаптований під Node.js.

Виконується командою ibmcloud ce build create Для простоти я зібрав усе в CMD файл /deployent/cli-crt-build.cmd. І, як можете бачити, тут і далі для доступу до container registry використовується secret, що був створений два кроки назад.


set BLDSRC=https://github.com/pavlo-shcherbukha/cenodebesrvc.git
set BLDBRANCH=tz-000001-init
set BLDIMAGE= uk.icr.io/sh-storage-prh-rgstr/sh-storage-be

pause

ibmcloud ce build create --name sh-storage-be-bld --source %BLDSRC% --commit %BLDBRANCH% --strategy dockerfile --size medium --image %BLDIMAGE% --registry-secret sh-storage-prh-rgstr

pause

Успішне виконання команди показано на pic-15, а що побачимо в UI - на pic-14

pic-15

pic-14

Application Depoyment. Безпосередньо побудова контейнера buildrun

Безпосердньо побудова образу виконується командою ibmcloud ce buildrun submit

ibmcloud ce buildrun submit --name sh-storage-be-bld-run --build sh-storage-be-bld

де –build вказує на попередньо створений build.

На pic-16 показано результат виконання команди.

pic-16

подивитися лог виконання можно за допомогою ibmcloud ce buildrun logs

ibmcloud ce buildrun logs --buildrun sh-storage-be-bld-run --follow

Отримати статус виконання можна командою ibmcloud ce buildrun get:

ibmcloud ce buildrun get --name sh-storage-be-bld-run

і результат виконнная

C:\PSHDEV\PSH-WorkShops\github-io\tz-000013-codeengine\code-engine-app\cenodebesrvc\tz-000001-init\cenodebesrvc\deployment>ibmcloud ce buildrun get --name sh-storage-be-bld-run
Getting build run 'sh-storage-be-bld-run'...
For troubleshooting information visit: https://cloud.ibm.com/docs/codeengine?topic=codeengine-troubleshoot-build.
Run 'ibmcloud ce buildrun events -n sh-storage-be-bld-run' to get the system events of the build run.
Run 'ibmcloud ce buildrun logs -f -n sh-storage-be-bld-run' to follow the logs of the build run.
OK

Name:          sh-storage-be-bld-run
ID:            2f5ed2d1-dd55-4df0-abf1-d1df5a1333f7
Project Name:  sh-storage-prh
Project ID:    15716649-8035-45d9-ad3f-d87e886838cd
Age:           4m45s
Created:       2023-05-26T10:43:52+03:00

Summary:       Succeeded
Status:        Succeeded
Reason:        All Steps have completed executing
Source:
  Commit SHA:     f7d05480be091a31b1db9ecc9425dd66e8c22b50
  Commit Author:  Pavlo Shcherbukha
Image Digest:  sha256:6eda768bfe355151080c4f35337d39d14f377e85ef5ca06d9970e013e2a60aa1

Build Name:  sh-storage-be-bld
Image:       uk.icr.io/sh-storage-prh-rgstr/sh-storage-be

C:\PSHDEV\PSH-WorkShops\github-io\tz-000013-codeengine\code-engine-app\cenodebesrvc\tz-000001-init\cenodebesrvc\deployment>

Таким чином, на цьому етапі ми вже маємо побудований контейнер, покладений в IBM container registry. В UI результат можна побачити, пройшовши за кроками, що показані на pic-17

pic-17

Application Depoyment. Запуск application

Запуск application відбувається комнадою ibmcloud ce application create.

Для зручності змінні винеснеі в env та створений cmd файл що знаходиться в репозиторії в ./deployment/cli-crt-app-img.cmd. На цьому етапі задаються env змінні, що необхідні для роботи контейнера. Зв’язування з сервісами IBM хмари виконуються іншою командою, після сторення application. Також хочу звернути увашу на реквізити –cpu 1 –memory 2G, де вказується кількість ресурсів, що виділяються для даного application та –max-scale , –min-scale - що вказують на кількість єкземплярів.


set DB_URL=CLOUDANT_URL=https://****************-bluemix.cloudantnosqldb.appdomain.cloud
set DB_APIKEY=CLOUDANT_APIKEY=*********************************
set DB_NAME=STORAGE_DBNAME=storagedb
set BLDIMAGE= uk.icr.io/sh-storage-prh-rgstr/sh-storage-be
pause

ibmcloud ce application create --name sh-storage-be1 --image %BLDIMAGE% --registry-secret sh-storage-prh-rgstr --env %DB_URL% --env %DB_APIKEY% --env %DB_NAME% --cpu 1 --memory 2G --port 8080

pause


Команда виконується не зразу, а прохожить деякий час, поки application стартоне. Результат виконання показано на pic-18

pic-18

На pic-19 показано, як теж саме побачити через UI, та поставлено наголос, що коли не задана

pic-19

кількість instances, то за замовчуванням їх 0, і додаток не стартонутий. Це означає, що вхідний http запит буде перший раз виконуватися дуже довго. щоб пофіксити, треба задати мінімальну кількість instances 1. Але, з іншої сторони, з application немає доступу до БД cloudant, який виконується командою: ibmcloud ce application bind - тобто зв’язує code engine з іншими хмарними сервісами і наявність 0 instances мене повністю влаштовує, тому що додаток не крешиться із за недоступності сервісую. Тому переходимо до наступного кроку application bind.

Application Depoyment. Зв1язування application з іншими хмарними сервісами application bind

Виконується командою: ibmcloud ce application bind. В даному випадку мені порібно зв’язати appliction з БД Cloudant.


ibmcloud ce application bind --name sh-storage-be1 --service-instance Cloudant-0m   --service-credential "Service credentials-1"

За результатм на pic-20 видно що зв’язування відбулося і application виконує redeployment.

pic-20

Тепер залишився останній крок - це налаштувати горизонтальне та вертикальне масштабування, встановивши кількість інстансів, ЦПУ, пам’ять

Application Depoyment. Масштабування

Оновимо наш application командою ibmcloud ce application update

ibmcloud ce application update --name sh-storage-be1 --cpu 0.5 --memory 2G  --min-scale 1  --max-scale 3

За результатм на pic-21 видно що ми досягли бажаної конфігурації.

pic-21

Тепер можна переходити до тестування додатку.

tags: