Laboratorium dotyczy utworzenia prostych usług:
- frontend w React'ie
- backend we Flasku
- baza danych MongoDB
Pełny projekt jest dość rozbudowany, ale idąc po kolei...
- zbudować obrazy
backendifrontend - Zpushować je na DockerHub jako obrazy publiczne
UWAGA: frontend jest uruchaminy w wersji debuggowej - zmienna REACT_APP_BACKEND_URL jest wtedy czytany ze środowiska - jakbyśmy chcieli poprawnie ją obsłużyć to powinna być podana jako BUILD_ARG i "wkompilowana" w aplikację. To jest notka na przyszłość.
Wszystkie zasoby powinny być w namespace: student-<nr_albumu>.
Napisać manifesty, które tworzą namespace student-<nr_albumu> a w nim:
- Deployment (2+ repliki), który uruchomi
backend - Deployment (2+ repliki), który uruchomi
frontend - ClusterIP serwis, który będzie przed deploymentem
backend - StatefullSet (1 replika), która uruchomi
mongodb - Headless serwis, który będzie przed StatefullSetem z
mongodb
Zmienne:
backend:MONGODB_HOST- adres headless serwisu, który prowadzi na SS mongodb
mongodb:MONGO_INITDB_ROOT_PASSWORD- ustaw naexample
UWAGA:
Nie ma dostępu do aplikacji z zewnatrz (spoza klastra).
Zmienne pobierane są z ConfigMapy.
Zmienne poufne, jak hasła i nazwy użytkowników, pobierane są z Secreta.
Deployment backend ma skofigurowany healthchecki. Proby - Startup, sprawdzajacy od 15 sekundy, oraz Readiness który co 10 sekund pyta curl http://backend:5000/up
StatefullSet mongodb ma 3 repliki:
- 1 read-write
- 2x read-only
RW jest wskazywana przez serwis Headless, którego URL jest zapisany w zmiennej MONGODB_RW_HOST.
RO i RW (bez Helma trudno tylko RO zrobić) są wskazywane przez inny serwis Headless, którego URL jest zapisany w zmiennej MONGODB_RO_HOST.
Zmienne zastepują MONGODB_HOST.
Mongo korzysta z persistent Volume'ów (wykorzystaj persistentVolumeClaimTemplate).
Mamy Job, który co 2 godziny, począwszy od 1:30, (czyli 1:30, 3:30, 5:30,...), od poniedziałku do piątku wykonuje backup na bazy danych mongo. Backup ma być na kolejny persistentVolume, tym razem bez claim template.
Zrobienie z tego tzw. charta Helm'owego, który w values.yml:
- definiuje obrazy
- może opcjonalnie korzystać z
imagePullSecrets - definiuje ilość poszczególnych replik.
- definiuje rozmiary
- pozwala podawać wszystkie zmienne, które są potrzebne. Ale np.
MONGODB_RO_HOSTjest automatycznie definiowany - pozwala redefniować parametry czasowe Probe'ów
- pozwala dodać opcjonalny
Ingress*
*Ingress wymaga IngressControllera - oddzielne zadanie, zależne od Kubernetesa, którego mamy (docker-desktop, kind, etc.)
Helm trzeba obronić 10 czerwca 2024 na zajęciach.