Изграждане на три-компонентно приложение в 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

Редизайн на Turnstile Puzzle

Завръщането към темата е вдъхновено от магистърската ми теза, защитена в средата на 1996-та година. По това време все още се ползваше Windows 3.x, а Windows 95 беше новост.

От днешна гледна точка външния вид на играта изглежда в известна степен наивен, но тогава техническите възможности позволяваха това ниво. В голяма степен модата за изглед на системните игри от типа на Minesweeper също оказа влияние. Заглавието също последва тогавашната тенденция – WinCircles.

Играта в подредено състояние
Общ вид на играта

Тъй като алгоритъма е от сферата на комбинаториката, това спомогна програмирането на софтуера да бъде сведено до относително проста задача.

Интересен факт е, че играта е била патентована като настолна през 1983-та година от Douglas A. Engel с патент US4,415,158 по подобие на кубчето на Рубик.

Turnstile, произведен от Binary Arts (сега ThinkFun)

Първоначално играта е наречена Engel’s Enigma, но по-късно е пусната на пазара като The Puzzler с три различни нива на трудност:

  1. Novice: Частите от един диск са сини, останалите червени.
  2. Challenger: Горната половина на дисковете е зелена, долната половина жълта, а трите крайни части в средата са черни.
  3. Avenger: Като Turnstile, но в жълто, червено, зелено, синьо и черно и са използвани бели ръбове, за да ги разделят. Няма цветни маркировки по ръба на пъзела.

WinCircles е допълнена с полагане на шестоъгълна мрежа върху кръговете и съответно повече цветове, което повишава нивото на трудност над това на Avenger.

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

  • Понижаване на нивото на трудност до Avenger;
  • Осъвременяване на външния вид;
  • Планиране на софтуерното програмиране за останалите класически нива;
  • Изследване на възможностите за производство на играта за екрани с жестове, например в Android и iOS;
  • Контрол на версиите като метод в процеса на разработката на потребителския интерфейс;

Относно съществуващи образци, краткото проучване показва следното:

  • В Google Play се предлагаше игра с име Puzzler, но вече не може да се инсталира.
Екранът на Puzzler
  • Към момента за Android е останала единствено играта Enigma Puzzle, но и тя е с доста архаичен вид и некачествено изпълнение на жестовете.
Екранът на Enigma Puzzle
  • В Apple App Store не съм правил проучвания.

Най-итересното, което намерих за старт на редизайна е страницата за Turnstile / Twinspin, Puzzler на Jaap Scherphuis. Този ресурс предлага и добро описание на алгоритъма.

За прототипа избрах web технологията, с която работя най-бързо, а за обектите на потребителския интерфейс – SVG формат, който е векторен и дава по-добра основа както за последващо изграждане на responsive web layout, така и за работа с мобилните платформи.
Работното заглавие на играта е WheelsPuzzle.

В заключение споделям, че изпитах истинско удоволствие от свършената до момента работа. Надявам се, че все повече ще ми остава време и играта ще придобие своя продуктов вид за мобилните платформи.

Има и прототип за Gnome, който се надявам в скоро време да пакетирам в RPM и DEB. А защо не и това да е повод да усвоя пакетирането в Snap и Flatpak?

GNOME 40 върху Fedora 34

На 24 март 2021 излезе GNOME 40 и това е първата версия, която използва новата система за номериране на версиите (предишната е 3.38). Поддържа и наскоро издадения GTK 4.
Друг повод за инсталацията е и наскоро излязлата Fedora 34.
Използваният хардуер е реновиран Lenovo ThinkPad T520 с процесор Intel i5 на 2.5 GHz с 2 ядра и 4 нишки, 8 GB RAM и HDD на 5400 оборота, за нуждите на онлайн обучението на децата.

Това, което от GNOME 3 насам все още не мога да приема е ограничаването на потребителя да няма възможност нативно да си пуска иконите на работния плот. Разработчиците изписаха тонове мастило защо това е много важно и как страхотно променя потребителското изживяване в положителна посока и т.н.
За абсолютно начинаещи може би да са прави, но за потребители като мен, които винаги са работили с папки върху десктопа, както и за потребители идващи с навици от други работни среди – едва ли имат сериозни аргументи.

За да се избегне горното неудобство се прибягва до инсталирането на приставка, а в GNOME 40 друга изненада за мен е, че управлението на приставките от Tweaks е премахнато и се разчита на интеграцията от сайта GNOME Shell Extensions. Положителното е, че има учтиво предупреждение след завършването на инсталацията.

И така, следващата стъпка след инсталирането на операционната система и работната среда от Fedora 34 x86_64 Live DVD, е активирането на приставката за Firefox GNOME Shell integration.

С времето съм установил, че най-добрата за мен приставка за показването на иконите върху десктопа е Desktop Icons NG (DING).

След инсталирането и активирането на приставката, иконите върху десктопа са видими.

Друго неудобство за мен е, че по подразбиране десктопа не се появява в страничния панел на файловия мениджър, което преди конфигурирах или през команден ред или през Dconf Editor, но сега не ми се отдаде и прибягнах до това да си направя препратка.

Има и една промяна, която не мога да преценя дали е положителна, а именно, че при активиране на дейностите панела с приложенията се показва отдолу, вместо вляво и работните плотове се плъзгат в центъра на екрана вместо вдясно.

В заключение ще добавя, че като цяло работната среда е подобрена, а необходимите ми допълнителни настройки приложих с относително малко усилия.

Също така тествах производителността на графиката със сесията по подразбиране, която е Wayland и не установих проблеми.

Следващото предизвикателство е преходът на личния ми лаптоп от Fedora 33 и GNOME 3 към Fedora 34 и GNOME 40.
Предвид написаното по-горе, дори и миграцията да не мине гладко, допускам, че една свежа инсталация ще реши въпроса.

Elastic Stack за начинаещи

Стекът като такъв

Базиран на отворен код, Elastic Stack ви позволява надеждно да събирате данни от произволен източник във всеки един формат и да търсите, анализирате и визуализирате в реално време.

Компоненти на стека

Започнете в облака

Направете 14-дневна проба на Elasticsearch – услуга за търсене в приложения или сайтове. Не е необходима кредитна карта.

Сърцето на Elastic Stack

Elasticsearch е разпределена и сигурна машина за търсене и анализ, способна да обслужва все по-голям брой случаи на употреба. Сърцето на Elastic Stack съхранява централизирано данните, за да можете да откриете търсеното.

Beats – Леки доставчици на данни

Beats е платформа за еднопосочни изпращания на данни. Те се инсталират като леки агенти и изпращат данни от стотици или хиляди машини до Logstash или Elasticsearch.

Logstash – Централизиране, трансформиране и съхраняване на данни

Logstash е софтуер с отворен код и сървърен процесор за обработка на данни, който взема данни едновременно от множество източници, преобразува ги и след това ги изпраща в хранилище.

Кибана – Вашият прозорец към Elastic Stack

Kibana ви позволява да визуализирате данните си от Elasticsearch и да навигирате в Elastic Stack, така че да можете да направите всичко и да научите, защо нещо се стартира в 2:00 сутринта, а и да разберете колко дъждовен може да е вашият ден 🙂

ELK инфографика

Характеристики на стека

От корпоративна сигурност и API за разработчици, подходящи за машинно обучение и анализи на графики, Elastic Stack доставя функции (по-рано пакетирани като X-Pack), направени и поддържани от Elastic Co., за да им се насладите.

Elastic Stack решения

Искате ли просто да отстраните регистрационен файл? Или знаете кои IP адреси да се блокират? Или да индексирате милиони документи за бързо търсене? Ето само няколко начина, по които Elastic Stack събира за вас данни.

Всичко това ще видите на OpenFest.org последната седмица на октомври.

© 2018. Всички права запазени. Elasticsearch е търговска марка на Elasticsearch BV, регистрирана в САЩ и в други страни.