4.7 KiB
VK26 - Skúška #1
Zadanie
Vytvorte webovú aplikáciu, do ktorej viete nahrať súbor, ktorý následne ľubovoľným spôsobom spracujete a výsledok uloží do druhého súboru.
Nahraté súbory musíte ukladať do priečinka input a výsledné súbory do priečinka output.
Riešenie
Toto riešenie je aplikácia v Pythone pomocou frameworku Snowflake Streamlit.
Nahraté súbory sa ukladajú do priečinka input a následne sa vypočíta hash súboru pomocou nastavenéného algoritmu (MD5 alebo SHA256). Výsledný hash sa uloží do súboru v priečinku output s názvom <názov_súboru>.<hash> (mapr. input/example.txt.md5).
Obsah
main.py- hlavný súbor aplikácieinitstuff.py- inicializačný skript pre kubernetes init kontajner
Spustenie
Vytvorenie obrazu
Naprv je potrebné vytvoriť Docker obraz z tohto repozitára. Keďže neskôr budeme pushovať na Docker Hub, je potrebné používať vhodný názov pre obraz. Vhodný formát je <docker-hub-username>/<nazov-aplicacie> Môžete použiť nasledujúci príkaz:
docker build -t br0kenpixel/onlinefilehasherapp .
Push na Docker Hub
Po vytvorení obrazu je potrebné ho pushnúť na Docker Hub, aby sme ho mohli použiť v Kubernetes. Použite nasledujúci príkaz:
docker push br0kenpixel/onlinefilehasherapp
Nezabudnite sa prihlásiť do Docker Hub pomocou docker login pred pushnutím obrazu.
Spustenie v Kubernetes
Najprv vytvoríme namespace pre našu aplikáciu:
kubectl create namespace exam-varga
Následne aplikujeme každú konfiguráciu v k8s priečinku v nasledujúcom poradí:
kubectl apply -f configmap.yaml -n exam-varga
kubectl apply -f pv.yaml -n exam-varga
kubectl apply -f pv2.yaml -n exam-varga
kubectl apply -f pc.yaml -n exam-varga
kubectl apply -f pc2.yaml -n exam-varga
kubectl apply -f svc.yaml -n exam-varga
kubectl apply -f deployment.yaml -n exam-varga
Teotericky by malo stačiť iba deployment.yaml, ale mne to nešlo.
Vysvetlenie Kubernetes konfigurácie
Aplikácia používa 2 volumy na uloženie nahratých súborov a výsledných hashov. Pre každý volume je vytvorený claim.
Porty sú nakonfigurované v svc.yml nasledovne:
port- port, na ktorom beží aplikácia v kontejneritargetPort- port, pomocou ktorého iné pody v clusteru komunikujú s aplikáciou (nevyužíva sa v tomto prípade)nodePort- port, na ktorom je služba dostupná z clusteru (t.j. z vášho počítača)
Prístup k aplikácii
Aplikácia je dostupná na porte 30000. Ako IP adresu použite IP adresu vášho Kubernetes clusteru. Viac info nižšie.
Konfigurácia Kubernetes clusteru
Pre kubernetes je potrebné nakonfigurovať cluster (sada nód - alebo kvázy servery). V Docker Desktop je možné použiť integrovaný Kubernetes cluster.
Docker Desktop odporúčam inštalovať iba na Windows a macOS. Pre Linux je lepšie použiť iba Docker Engine.
Ako kubernetes cluster môžete použiť nástroj Minikube, ktorý je možné nainštalovať na Linux. Minikube poskytuje jednoduchý spôsob, ako spustiť Kubernetes cluster lokálne.
V prípade Linuxu Minikube má rôzne backendy na virtualizáciu clusteru. Najlepšie je použiť kvm2 avšak musíte mať zapnutý modul kvm_intel alebo kvm_amd v závislosti od vášho procesora.
Toto môže byť náročné, nakoľko potrebujete zmeniť boot parametre kernelu.
Cluster sa následne ovláda pomocou kubectl, ktorý je možné nainštalovať podľa oficiálnej dokumentácie.
Získanie IP adresy clusteru
V prípade Windowsu je potrebné využiť port forwarding pomocou kubectl port-forward príkazu. Ak vaše riešenie pozostáva zo zvlášť backendu a frontendu, je potrebné použiť port forwarding pre oba komponenty.
V prípade Minikube s backendom kvm2 nie je potrebné používať port forwarding, pretože Minikube poskytuje prístup k službám automaticky cez NodePort.
IP adresu služby (bežiaca aplikácia) získate pomocou nasledujúceho príkazu:
minikube service onlinefilehasher-service -n exam-varga --url
Príkaz vráti URL adresu, ktorú môžete použiť na prístup k aplikácii.
Využitie obrazu
V prípade Minikube obraz nie je možné využiť z lokálneho počítaťa pretože cluster bežiaci v Minikube je vo virtuálnom stroji a má svoju vlastnú inštaláciu Dockeru. Ak vybuildujete obraz pomocou docker build tak bude dostupný iba v Dockeru na vašom počítači, ale nie v Dockeru v Minikube.
Užitočné príkazy
- Zmazanie podu:
kubectl -n exam-varga delete pod onlinefilehasher-xxxx-xxxx