# 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 `.` (mapr. `input/example.txt.md5`). ## Obsah - [`main.py`](main.py) - hlavný súbor aplikácie - [`initstuff.py`](initstuff.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 `/` Môžete použiť nasledujúci príkaz: ```bash 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: ```bash 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: ```bash kubectl create namespace exam-varga ``` Následne aplikujeme každú konfiguráciu v [`k8s`](k8s) priečinku v nasledujúcom poradí: ```bash 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 kontejneri - `targetPort` - 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](https://minikube.sigs.k8s.io/docs/), 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](https://kubernetes.io/docs/tasks/tools/). ## 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: ```bashbash 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: ```bash kubectl -n exam-varga delete pod onlinefilehasher-xxxx-xxxx ```