Изграждане на три-компонентно приложение в Kubernetes

Тази процедура е използвана в работилницата на OpenFest 2023 за изграждане на три-компонентно приложение на локален компютър с Kubernetes.

Приложението включва:

  • Persistent Storage, където се съхранява базата данни
  • База данни, която да съхранява данните на приложението
  • Node.js API за свързване с базата данни и предоставяне на бизнес логиката на приложението
  • Web слой, също базиран на код Node.js, за взаимодействие с потребителите

Урокът адаптира публикацията Deploy a 3-tier application on Red Hat OpenShift, като се използва командния ред на Kubernetes.

Всяко от хранилищата от статията за OpenShift е fork в GitHub, както следва:

Приложението се нарича „Цитат на деня“ (Quote of the Day, QOD) и след като бъде изградено, предоставя проста уеб страница с възможност за получаване на ежедневен цитат, който е различен всеки ден или произволен цитат от базата данни с цитати.

Предварително се изисква да са подготвени на локален компютър:

СТЪПКИ

1. Проверка на предварителните изисквания

ping github.com
kubectl get nodes
sudo exportfs -avrf
sudo systemctl status haproxy.service
grep qod-web.localhost.localdomain /etc/hosts

2. Клониране на хранилищата

git clone https://github.com/zdravhub/qod-db.git
git clone https://github.com/zdravhub/qod-api.git
git clone https://github.com/zdravhub/qod-web.git

3. Екран за проследяване състоянието на обектите в Kubernetes

watch -d 'kubectl get all -o wide'

4. Изграждане на Persistent Storage и база данни

cd ~/src/qod-db/deployment/

Прилагане на конфигурацията с променливите, необходими на MariaDB:

kubectl apply -f 01_configMap.yaml

Манифест за persistentVolume и PersistentVolumeClaim за NFS (изисква предварително подготвен NFS share):

kubectl apply -f 02_persistentVolume_NFS.yaml

Разгръщане на самото приложение за базата данни:

kubectl apply -f 03_deployment.yaml
kubectl apply -f 04_service.yaml

От екрана за състоянието се взема името на pod-a на приложението и се изпълнява:

kubectl exec -it pod/qod-db-5dcb85786f-8tqck -- mysql -uuser -ppass qod

След поява на Welcome екрана на MariaDB се прави изход от контейнера на приложенето.

Преминава се в директорията на SQL файловете за импорт:

cd ..

SQL файловете се копират в контейнера на приложението за базата данни:

kubectl cp ./1_createdb.sql qod-db-5dcb85786f-8tqck:1_createdb.sql -c qod-db
kubectl cp ./2_authors.sql qod-db-5dcb85786f-8tqck:2_authors.sql -c qod-db
kubectl cp ./3_genres.sql qod-db-5dcb85786f-8tqck:3_genres.sql -c qod-db
kubectl cp ./4_quotes_sm.sql qod-db-5dcb85786f-8tqck:4_quotes_sm.sql -c qod-db

Влиза се в командния интерпретатор на приложението за базата данни:

kubectl exec -it pod/qod-db-5dcb85786f-8tqck -- bash

Прелистват се SQL файловете за импорт:

ls -l *.sql

Осъществява се самия импорт:

mysql -uuser -ppass qod < 1_createdb.sql
mysql -uuser -ppass qod < 2_authors.sql
mysql -uuser -ppass qod < 3_genres.sql
mysql -uuser -ppass qod < 4_quotes_sm.sql

Вход в MariaDB:

mysql -uuser -ppass qod

Две бързи проверки и изход:

show tables;
select * from genres where genre_id="1";
quit

Съответно изход и от контейнера на приложението.

Проверката на Persistent Storage за базата данни се извършва чрез изтриване на pod-a на приложението:

kubectl delete pod/qod-db-5dcb85786f-8tqck

От екрана за състоянието се взема името на новия pod-a на приложението и се изпълнява:

kubectl exec -it pod/qod-db-5dcb85786f-bmwrh -- mysql -uuser -ppass qod

Бърза проверка и след резултат като от предходния контейнер, изход:

select * from genres where genre_id="1";
quit

Съответно изход и от контейнера на приложението.

5. Изграждане на API за свързване с базата данни и предоставяне на бизнес логиката на приложението

cd ~/src/qod-api/deployment/

Разгръщане на самото API:

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

От екрана за състоянието се взема името на pod-a за API и се прави вход в контейнера:

kubectl exec -it pod/qod-api-7868bc6bfc-jmbgj -- bash

Тества се произволен цитат от базата, изхода е в JSON формат:

curl http://localhost:8080/random

Изход от контейнера на API приложението.

През NodePort 30080 може да се достъпи service/qod-api също:

curl -s http://192.168.124.244:30080/random | jq
curl -s http://192.168.124.233:30080/random | jq

6. Изграждане на Web слоя за взаимодействие с потребителите

cd ~/src/qod-web/deployment/

Разгръщане на самия Web слой:

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

От екрана за състоянието се взема името на pod-a за Web слоя и се прави вход в контейнера:

kubectl exec -it pod/qod-web-84bcdb9b56-x8cmf -- bash

Изпълнява се curl, с очакван изход HTTP/1.1 200 OK

curl -I http://localhost:8080/random

Изход от контейнера на приложението.

В произволен браузър се отива на адреса на приложението:

http://qod-web.localhost.localdomain/

През NodePort 30000 също може да се достъпи service/qod-web също:

http://192.168.124.244:30000/random
http://192.168.124.233:30000/random

Публикувано от

Zdravko Zdravkov

Системен интегратор. Професионалист с богат ИТ и управленски опит. Съосновател на Openintegra. Неговото изкуство е овладяването на хаоса.