zkt26/z2/README.md
Bohdan Kapliuk 2718263509 message
2026-04-08 12:36:10 +03:00

3.7 KiB

Zadanie 2 - Kubernetes web application

This project deploys a simple web application into Kubernetes. The user enters a name in the browser, the frontend sends it to the backend API, and the backend stores the value in PostgreSQL. The saved names are then displayed back in the browser.

Used containers

  • z2-frontend:latest - custom Nginx image serving the static frontend and proxying API requests to the backend service.
  • z2-backend:latest - custom Node.js and Express API image that stores and reads user data from PostgreSQL.
  • postgres:15-alpine - database container running inside a StatefulSet with persistent storage.

Kubernetes objects

  • Namespace zkt26-z2 - isolates all application resources into one namespace.
  • Deployment backend-deployment - runs the backend API container.
  • Deployment frontend-deployment - runs the frontend Nginx container.
  • Service backend-service - exposes the backend inside the cluster.
  • Service frontend-service - exposes the frontend on NodePort 30080.
  • Service postgres-service - stable network endpoint for PostgreSQL.
  • PersistentVolume postgres-pv - host storage for PostgreSQL data.
  • PersistentVolumeClaim postgres-pvc - binds storage for the database pod.
  • StatefulSet postgres-statefulset - runs PostgreSQL with persistent data.

Networks and volumes

The application uses the default Kubernetes cluster networking. Pods communicate with each other through Kubernetes services:

  • frontend-service for browser access
  • backend-service for frontend to backend communication
  • postgres-service for backend to database communication

Persistent data is stored using:

  • PersistentVolume postgres-pv
  • PersistentVolumeClaim postgres-pvc

The volume uses hostPath at /tmp/zkt26-postgres-data, so the database data remains available even after the pod restarts.

Container configuration

The frontend container is based on Nginx and includes a custom nginx.conf that proxies /api/* requests to the backend service.

The backend container uses environment variables for the database connection:

  • DB_HOST=postgres-service
  • DB_PORT=5432
  • DB_USER=user
  • DB_PASSWORD=password
  • DB_NAME=mydb

The PostgreSQL container is configured with:

  • POSTGRES_USER=user
  • POSTGRES_PASSWORD=password
  • POSTGRES_DB=mydb

How to prepare, start, stop and delete the application

Run the commands from the z2 directory:

chmod +x prepare-app.sh start-app.sh stop-app.sh
./prepare-app.sh
./start-app.sh

To stop and delete the application:

./stop-app.sh

How to pause the application

The application can be paused by scaling deployments and the stateful set to zero:

kubectl scale deployment frontend-deployment --replicas=0 -n zkt26-z2
kubectl scale deployment backend-deployment --replicas=0 -n zkt26-z2
kubectl scale statefulset postgres-statefulset --replicas=0 -n zkt26-z2

To start it again:

kubectl scale deployment frontend-deployment --replicas=1 -n zkt26-z2
kubectl scale deployment backend-deployment --replicas=1 -n zkt26-z2
kubectl scale statefulset postgres-statefulset --replicas=1 -n zkt26-z2

How to open the web application

After starting the application in a standard Kubernetes environment, open the browser at:

  • http://localhost:30080

If you are using Minikube in WSL with the Docker driver, get the real browser URL with:

minikube service frontend-service -n zkt26-z2 --url

Keep that terminal open and open the printed URL in the browser.

If your Kubernetes environment does not expose NodePort on localhost directly, or if you want a fixed local port, use:

kubectl port-forward service/frontend-service 8080:80 -n zkt26-z2

Then open:

  • http://localhost:8080