Тази процедура е използвана в работилницата на 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) и след като бъде изградено, предоставя проста уеб страница с възможност за получаване на ежедневен цитат, който е различен всеки ден или произволен цитат от базата данни с цитати.
Предварително се изисква да са подготвени на локален компютър:
- Връзка към Интернет (за изтегляне имиджите на контейнерите)
- Kubernetes клъстър (интеграция с Kubeadm и Fedora Coreos)
- NFS share (или друг Persistent Storage)
- HAProxy (или друг Load Balancer)
СТЪПКИ
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