This commit is contained in:
Michal Utľák 2026-04-08 22:04:55 +02:00
parent ecde59d1cf
commit d233a0baf1
9 changed files with 235 additions and 212 deletions

12
z2/.env
View File

@ -1,7 +1,7 @@
DB_HOST=db DB_HOST=db
DB_PORT=3306 DB_PORT=3306
DB_USER=todo_user DB_USER=todo_user
DB_PASSWORD=SilneHeslo123. DB_PASSWORD=SilneHeslo123.
DB_NAME=zkt_zadanie DB_NAME=zkt_zadanie
SESSION_SECRET=EsteSilnejsieHeslo123. SESSION_SECRET=EsteSilnejsieHeslo123.
PORT=3000 PORT=3000

2
z2/.gitattributes vendored
View File

@ -1 +1 @@
*.sh text eol=lf *.sh text eol=lf

View File

@ -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. 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. 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. 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. 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. 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. 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 7. Aplikáciu si na webovom rozhraní pozriete cez port 30080, teda localhost:30080

View File

@ -1,51 +1,51 @@
apiVersion: v1 apiVersion: v1
kind: Namespace kind: Namespace
metadata: metadata:
name: todo-app name: todo-app
--- ---
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
name: backend name: backend
namespace: todo-app namespace: todo-app
spec: spec:
replicas: 1 replicas: 1
selector: selector:
matchLabels: matchLabels:
app: backend app: backend
template: template:
metadata: metadata:
labels: labels:
app: backend app: backend
spec: spec:
containers: containers:
- name: backend - name: backend
image: z2-backend:latest image: z2-backend:latest
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- containerPort: 3000 - containerPort: 3000
envFrom: envFrom:
- secretRef: - secretRef:
name: backend-env name: backend-env
--- ---
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
name: frontend name: frontend
namespace: todo-app namespace: todo-app
spec: spec:
replicas: 1 replicas: 1
selector: selector:
matchLabels: matchLabels:
app: frontend app: frontend
template: template:
metadata: metadata:
labels: labels:
app: frontend app: frontend
spec: spec:
containers: containers:
- name: frontend - name: frontend
image: z2-frontend:latest image: z2-frontend:latest
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- containerPort: 80 - containerPort: 80

View File

@ -1,9 +1,11 @@
#!/bin/bash #!/bin/bash
kubectl delete -f service.yml kubectl delete deployment backend frontend -n todo-app --ignore-not-found=true
kubectl delete -f statefulset.yml kubectl delete service backend frontend db -n todo-app --ignore-not-found=true
kubectl delete -f deployment.yml kubectl delete statefulset db -n todo-app --ignore-not-found=true
kubectl delete secret backend-env -n todo-app kubectl delete configmap mysql-init-script -n todo-app --ignore-not-found=true
kubectl delete namespace todo-app kubectl delete pvc mysql-pvc -n todo-app --ignore-not-found=true
docker rmi z2-backend:latest kubectl delete pv mysql-pv --ignore-not-found=true
docker rmi z2-frontend:latest 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

View File

@ -1,39 +1,39 @@
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: db name: db
namespace: todo-app namespace: todo-app
spec: spec:
selector: selector:
app: db app: db
ports: ports:
- port: 3306 - port: 3306
targetPort: 3306 targetPort: 3306
type: ClusterIP type: ClusterIP
--- ---
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: backend name: backend
namespace: todo-app namespace: todo-app
spec: spec:
selector: selector:
app: backend app: backend
ports: ports:
- port: 3000 - port: 3000
targetPort: 3000 targetPort: 3000
type: ClusterIP type: ClusterIP
--- ---
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: frontend name: frontend
namespace: todo-app namespace: todo-app
spec: spec:
selector: selector:
app: frontend app: frontend
ports: ports:
- port: 80 - port: 80
targetPort: 80 targetPort: 80
nodePort: 30080 nodePort: 30080
type: NodePort type: NodePort

View File

@ -1,5 +1,6 @@
#!/bin/bash #!/bin/bash
kubectl apply -f deployment.yml
kubectl apply -f service.yml kubectl apply -f service.yml
kubectl apply -f statefulset.yml kubectl apply -f statefulset.yml
kubectl wait --for=condition=ready pod/db-0 -n todo-app --timeout=180s
kubectl apply -f deployment.yml

View File

@ -1,91 +1,111 @@
apiVersion: v1 apiVersion: v1
kind: PersistentVolume kind: PersistentVolume
metadata: metadata:
name: mysql-pv name: mysql-pv
spec: spec:
capacity: capacity:
storage: 1Gi storage: 1Gi
accessModes: accessModes:
- ReadWriteOnce - ReadWriteOnce
persistentVolumeReclaimPolicy: Retain persistentVolumeReclaimPolicy: Retain
hostPath: hostPath:
path: /tmp/todo-mysql-data path: /tmp/todo-mysql-data
--- ---
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
name: mysql-pvc name: mysql-pvc
namespace: todo-app namespace: todo-app
spec: spec:
accessModes: accessModes:
- ReadWriteOnce - ReadWriteOnce
resources: resources:
requests: requests:
storage: 1Gi storage: 1Gi
--- ---
apiVersion: v1 apiVersion: v1
kind: ConfigMap kind: ConfigMap
metadata: metadata:
name: mysql-init-script name: mysql-init-script
namespace: todo-app namespace: todo-app
data: data:
init.sql: | init.sql: |
CREATE TABLE IF NOT EXISTS users ( CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY, id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(100) NOT NULL UNIQUE, username VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL password VARCHAR(255) NOT NULL
); );
CREATE TABLE IF NOT EXISTS tasks ( CREATE TABLE IF NOT EXISTS tasks (
id INT AUTO_INCREMENT PRIMARY KEY, id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL, user_id INT NOT NULL,
title VARCHAR(255) NOT NULL, title VARCHAR(255) NOT NULL,
description TEXT NOT NULL, description TEXT NOT NULL,
deadline DATE NOT NULL, deadline DATE NOT NULL,
status TINYINT(1) NOT NULL DEFAULT 0, status TINYINT(1) NOT NULL DEFAULT 0,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
); );
--- ---
apiVersion: apps/v1 apiVersion: apps/v1
kind: StatefulSet kind: StatefulSet
metadata: metadata:
name: db name: db
namespace: todo-app namespace: todo-app
spec: spec:
serviceName: db serviceName: db
replicas: 1 replicas: 1
selector: selector:
matchLabels: matchLabels:
app: db app: db
template: template:
metadata: metadata:
labels: labels:
app: db app: db
spec: spec:
containers: containers:
- name: mysql - name: mysql
image: mysql:8.0 image: mysql:8.0
ports: ports:
- containerPort: 3306 - containerPort: 3306
env: env:
- name: MYSQL_ROOT_PASSWORD - name: MYSQL_ROOT_PASSWORD
value: "NajsilnejsieHeslo123." value: "NajsilnejsieHeslo123."
- name: MYSQL_DATABASE - name: MYSQL_DATABASE
value: "zkt_zadanie" value: "zkt_zadanie"
- name: MYSQL_USER - name: MYSQL_USER
value: "todo_user" value: "todo_user"
- name: MYSQL_PASSWORD - name: MYSQL_PASSWORD
value: "SilneHeslo123." value: "SilneHeslo123."
volumeMounts: volumeMounts:
- name: mysql-storage - name: mysql-storage
mountPath: /var/lib/mysql mountPath: /var/lib/mysql
- name: mysql-init-volume - name: mysql-init-volume
mountPath: /docker-entrypoint-initdb.d/init.sql mountPath: /docker-entrypoint-initdb.d/init.sql
subPath: init.sql subPath: init.sql
volumes: startupProbe:
- name: mysql-storage exec:
persistentVolumeClaim: command:
claimName: mysql-pvc - sh
- name: mysql-init-volume - -c
configMap: - mysqladmin ping -h 127.0.0.1 -uroot -pNajsilnejsieHeslo123. --silent
name: mysql-init-script 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

View File

@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
kubectl delete -f service.yml kubectl delete deployment backend frontend -n todo-app --ignore-not-found=true
kubectl delete -f statefulset.yml kubectl delete service backend frontend -n todo-app --ignore-not-found=true
kubectl delete -f deployment.yml kubectl delete statefulset db -n todo-app --ignore-not-found=true