diff --git a/z2/.env b/z2/.env index 9ad3de2..d10eece 100644 --- a/z2/.env +++ b/z2/.env @@ -1,7 +1,7 @@ -DB_HOST=db -DB_PORT=3306 -DB_USER=todo_user -DB_PASSWORD=SilneHeslo123. -DB_NAME=zkt_zadanie -SESSION_SECRET=EsteSilnejsieHeslo123. +DB_HOST=db +DB_PORT=3306 +DB_USER=todo_user +DB_PASSWORD=SilneHeslo123. +DB_NAME=zkt_zadanie +SESSION_SECRET=EsteSilnejsieHeslo123. PORT=3000 \ No newline at end of file diff --git a/z2/.gitattributes b/z2/.gitattributes index dfdb8b7..ca255e2 100644 --- a/z2/.gitattributes +++ b/z2/.gitattributes @@ -1 +1 @@ -*.sh text eol=lf +*.sh text eol=lf diff --git a/z2/README.md b/z2/README.md index 52c5912..c09eff4 100644 --- a/z2/README.md +++ b/z2/README.md @@ -1,14 +1,14 @@ - -1. Je to jednoduchá TO-DO aplikácia kde si rôzni užívatelia možu pridávať a mazať svoje pripomienky, označiť ich za hotové a filtrovať na základe dátumu. - -2. Konfigurácia kontajnerov bola rozelená na tri samostatné služby a to frontend, backend a databáza, a sú spravované pomocou Docker compose súboru. Databázovy kontajner využíva obraz mysql, backend je postavený na obraze node:20 a frontend na nginx. - -3. V aplikacii saq použil namespace todo-app. Využívajú sa 4 objekty a to Deployment na frontend a backend, StatefulSet pre databázu a Service pre ich vzájomné prepojenie. Na uloženie dát databázy sa navyše používajú aj objekty PersistentVolume a PersistentVolumeClaim. - -4. Aplikácia využíva sieť Kubernetes, vďaka ktorej spolu frontend, backend a databáza komunikujú cez názvy služieb, napríklad frontend sa pripája na backend cez názov backend. Dáta databázy sa ukladajú do trvalého zväzku, aby zostali zachované aj po reštarte, pričom v pôvodnej Docker Compose verzii túto úlohu plnil zväzok todo_mysql_data. - -5. Konfigurácia kontajnerov bola rozelená na tri samostatné služby a to frontend, backend a databáza. Databázovy kontajner využíva obraz mysql, backend je postavený na obraze node:20 a frontend na nginx. V prostredí Kubernetes boli tieto kontajnery nasadené pomocou objektov Deployment a StatefulSet. - -6. Po naklonovaní repozitára sa v ňom bude nachádzať priečinok z2, ktorý obsahuje aplikáciu aj skripty a YAML súbory potrebné pre nasadenie do Kubernetes. Pred samotným spustením je potrebné prejsť do priečinka z2 a postupne spustiť skripty ./prepare-app.sh, ./start-app.sh. Pre pozastavenie aplikácie je na to určený skript ./stop-app.sh a prípadne ./remove-app.sh na vymazanie aplikácie. - + +1. Je to jednoduchá TO-DO aplikácia kde si rôzni užívatelia možu pridávať a mazať svoje pripomienky, označiť ich za hotové a filtrovať na základe dátumu. + +2. Konfigurácia kontajnerov bola rozelená na tri samostatné služby a to frontend, backend a databáza, a sú spravované pomocou Docker compose súboru. Databázovy kontajner využíva obraz mysql, backend je postavený na obraze node:20 a frontend na nginx. + +3. V aplikacii saq použil namespace todo-app. Využívajú sa 4 objekty a to Deployment na frontend a backend, StatefulSet pre databázu a Service pre ich vzájomné prepojenie. Na uloženie dát databázy sa navyše používajú aj objekty PersistentVolume a PersistentVolumeClaim. + +4. Aplikácia využíva sieť Kubernetes, vďaka ktorej spolu frontend, backend a databáza komunikujú cez názvy služieb, napríklad frontend sa pripája na backend cez názov backend. Dáta databázy sa ukladajú do trvalého zväzku, aby zostali zachované aj po reštarte, pričom v pôvodnej Docker Compose verzii túto úlohu plnil zväzok todo_mysql_data. + +5. Konfigurácia kontajnerov bola rozelená na tri samostatné služby a to frontend, backend a databáza. Databázovy kontajner využíva obraz mysql, backend je postavený na obraze node:20 a frontend na nginx. V prostredí Kubernetes boli tieto kontajnery nasadené pomocou objektov Deployment a StatefulSet. + +6. Po naklonovaní repozitára sa v ňom bude nachádzať priečinok z2, ktorý obsahuje aplikáciu aj skripty a YAML súbory potrebné pre nasadenie do Kubernetes. Pred samotným spustením je potrebné prejsť do priečinka z2 a postupne spustiť skripty ./prepare-app.sh, ./start-app.sh. Pre pozastavenie aplikácie je na to určený skript ./stop-app.sh a prípadne ./remove-app.sh na vymazanie aplikácie. + 7. Aplikáciu si na webovom rozhraní pozriete cez port 30080, teda localhost:30080 \ No newline at end of file diff --git a/z2/deployment.yml b/z2/deployment.yml index a78fb92..9dabb9a 100644 --- a/z2/deployment.yml +++ b/z2/deployment.yml @@ -1,51 +1,51 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: todo-app ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: backend - namespace: todo-app -spec: - replicas: 1 - selector: - matchLabels: - app: backend - template: - metadata: - labels: - app: backend - spec: - containers: - - name: backend - image: z2-backend:latest - imagePullPolicy: IfNotPresent - ports: - - containerPort: 3000 - envFrom: - - secretRef: - name: backend-env ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: frontend - namespace: todo-app -spec: - replicas: 1 - selector: - matchLabels: - app: frontend - template: - metadata: - labels: - app: frontend - spec: - containers: - - name: frontend - image: z2-frontend:latest - imagePullPolicy: IfNotPresent - ports: - - containerPort: 80 +apiVersion: v1 +kind: Namespace +metadata: + name: todo-app +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: backend + namespace: todo-app +spec: + replicas: 1 + selector: + matchLabels: + app: backend + template: + metadata: + labels: + app: backend + spec: + containers: + - name: backend + image: z2-backend:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 3000 + envFrom: + - secretRef: + name: backend-env +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend + namespace: todo-app +spec: + replicas: 1 + selector: + matchLabels: + app: frontend + template: + metadata: + labels: + app: frontend + spec: + containers: + - name: frontend + image: z2-frontend:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 80 diff --git a/z2/remove-app.sh b/z2/remove-app.sh index a2b45e8..d076635 100644 --- a/z2/remove-app.sh +++ b/z2/remove-app.sh @@ -1,9 +1,11 @@ #!/bin/bash -kubectl delete -f service.yml -kubectl delete -f statefulset.yml -kubectl delete -f deployment.yml -kubectl delete secret backend-env -n todo-app -kubectl delete namespace todo-app -docker rmi z2-backend:latest -docker rmi z2-frontend:latest +kubectl delete deployment backend frontend -n todo-app --ignore-not-found=true +kubectl delete service backend frontend db -n todo-app --ignore-not-found=true +kubectl delete statefulset db -n todo-app --ignore-not-found=true +kubectl delete configmap mysql-init-script -n todo-app --ignore-not-found=true +kubectl delete pvc mysql-pvc -n todo-app --ignore-not-found=true +kubectl delete pv mysql-pv --ignore-not-found=true +kubectl delete secret backend-env -n todo-app --ignore-not-found=true +kubectl delete namespace todo-app --ignore-not-found=true +docker rmi z2-backend:latest z2-frontend:latest \ No newline at end of file diff --git a/z2/service.yml b/z2/service.yml index ddb1240..81b6111 100644 --- a/z2/service.yml +++ b/z2/service.yml @@ -1,39 +1,39 @@ -apiVersion: v1 -kind: Service -metadata: - name: db - namespace: todo-app -spec: - selector: - app: db - ports: - - port: 3306 - targetPort: 3306 - type: ClusterIP ---- -apiVersion: v1 -kind: Service -metadata: - name: backend - namespace: todo-app -spec: - selector: - app: backend - ports: - - port: 3000 - targetPort: 3000 - type: ClusterIP ---- -apiVersion: v1 -kind: Service -metadata: - name: frontend - namespace: todo-app -spec: - selector: - app: frontend - ports: - - port: 80 - targetPort: 80 - nodePort: 30080 - type: NodePort +apiVersion: v1 +kind: Service +metadata: + name: db + namespace: todo-app +spec: + selector: + app: db + ports: + - port: 3306 + targetPort: 3306 + type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + name: backend + namespace: todo-app +spec: + selector: + app: backend + ports: + - port: 3000 + targetPort: 3000 + type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + name: frontend + namespace: todo-app +spec: + selector: + app: frontend + ports: + - port: 80 + targetPort: 80 + nodePort: 30080 + type: NodePort diff --git a/z2/start-app.sh b/z2/start-app.sh index cd0c60d..98d89e4 100644 --- a/z2/start-app.sh +++ b/z2/start-app.sh @@ -1,5 +1,6 @@ #!/bin/bash -kubectl apply -f deployment.yml kubectl apply -f service.yml kubectl apply -f statefulset.yml +kubectl wait --for=condition=ready pod/db-0 -n todo-app --timeout=180s +kubectl apply -f deployment.yml \ No newline at end of file diff --git a/z2/statefulset.yml b/z2/statefulset.yml index 35c4bb1..d7b599d 100644 --- a/z2/statefulset.yml +++ b/z2/statefulset.yml @@ -1,91 +1,111 @@ -apiVersion: v1 -kind: PersistentVolume -metadata: - name: mysql-pv -spec: - capacity: - storage: 1Gi - accessModes: - - ReadWriteOnce - persistentVolumeReclaimPolicy: Retain - hostPath: - path: /tmp/todo-mysql-data ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: mysql-pvc - namespace: todo-app -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 1Gi ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: mysql-init-script - namespace: todo-app -data: - init.sql: | - CREATE TABLE IF NOT EXISTS users ( - id INT AUTO_INCREMENT PRIMARY KEY, - username VARCHAR(100) NOT NULL UNIQUE, - password VARCHAR(255) NOT NULL - ); - - CREATE TABLE IF NOT EXISTS tasks ( - id INT AUTO_INCREMENT PRIMARY KEY, - user_id INT NOT NULL, - title VARCHAR(255) NOT NULL, - description TEXT NOT NULL, - deadline DATE NOT NULL, - status TINYINT(1) NOT NULL DEFAULT 0, - FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE - ); ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: db - namespace: todo-app -spec: - serviceName: db - replicas: 1 - selector: - matchLabels: - app: db - template: - metadata: - labels: - app: db - spec: - containers: - - name: mysql - image: mysql:8.0 - ports: - - containerPort: 3306 - env: - - name: MYSQL_ROOT_PASSWORD - value: "NajsilnejsieHeslo123." - - name: MYSQL_DATABASE - value: "zkt_zadanie" - - name: MYSQL_USER - value: "todo_user" - - name: MYSQL_PASSWORD - value: "SilneHeslo123." - volumeMounts: - - name: mysql-storage - mountPath: /var/lib/mysql - - name: mysql-init-volume - mountPath: /docker-entrypoint-initdb.d/init.sql - subPath: init.sql - volumes: - - name: mysql-storage - persistentVolumeClaim: - claimName: mysql-pvc - - name: mysql-init-volume - configMap: - name: mysql-init-script +apiVersion: v1 +kind: PersistentVolume +metadata: + name: mysql-pv +spec: + capacity: + storage: 1Gi + accessModes: + - ReadWriteOnce + persistentVolumeReclaimPolicy: Retain + hostPath: + path: /tmp/todo-mysql-data +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: mysql-pvc + namespace: todo-app +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: mysql-init-script + namespace: todo-app +data: + init.sql: | + CREATE TABLE IF NOT EXISTS users ( + id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(100) NOT NULL UNIQUE, + password VARCHAR(255) NOT NULL + ); + + CREATE TABLE IF NOT EXISTS tasks ( + id INT AUTO_INCREMENT PRIMARY KEY, + user_id INT NOT NULL, + title VARCHAR(255) NOT NULL, + description TEXT NOT NULL, + deadline DATE NOT NULL, + status TINYINT(1) NOT NULL DEFAULT 0, + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE + ); +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: db + namespace: todo-app +spec: + serviceName: db + replicas: 1 + selector: + matchLabels: + app: db + template: + metadata: + labels: + app: db + spec: + containers: + - name: mysql + image: mysql:8.0 + ports: + - containerPort: 3306 + env: + - name: MYSQL_ROOT_PASSWORD + value: "NajsilnejsieHeslo123." + - name: MYSQL_DATABASE + value: "zkt_zadanie" + - name: MYSQL_USER + value: "todo_user" + - name: MYSQL_PASSWORD + value: "SilneHeslo123." + volumeMounts: + - name: mysql-storage + mountPath: /var/lib/mysql + - name: mysql-init-volume + mountPath: /docker-entrypoint-initdb.d/init.sql + subPath: init.sql + startupProbe: + exec: + command: + - sh + - -c + - mysqladmin ping -h 127.0.0.1 -uroot -pNajsilnejsieHeslo123. --silent + initialDelaySeconds: 10 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 30 + readinessProbe: + exec: + command: + - sh + - -c + - mysqladmin ping -h 127.0.0.1 -uroot -pNajsilnejsieHeslo123. --silent + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 10 + volumes: + - name: mysql-storage + persistentVolumeClaim: + claimName: mysql-pvc + - name: mysql-init-volume + configMap: + name: mysql-init-script \ No newline at end of file diff --git a/z2/stop-app.sh b/z2/stop-app.sh index 1ce2cc8..7876276 100644 --- a/z2/stop-app.sh +++ b/z2/stop-app.sh @@ -1,5 +1,5 @@ #!/bin/bash -kubectl delete -f service.yml -kubectl delete -f statefulset.yml -kubectl delete -f deployment.yml +kubectl delete deployment backend frontend -n todo-app --ignore-not-found=true +kubectl delete service backend frontend -n todo-app --ignore-not-found=true +kubectl delete statefulset db -n todo-app --ignore-not-found=true \ No newline at end of file