diff --git a/Z2/app/Dockerfile b/Z2/app/Dockerfile new file mode 100644 index 0000000..e8d1758 --- /dev/null +++ b/Z2/app/Dockerfile @@ -0,0 +1,12 @@ +FROM node:18 + +WORKDIR /app + +COPY package.json . +RUN npm install + +COPY . . + +EXPOSE 3000 + +CMD ["node", "server.js"] \ No newline at end of file diff --git a/Z2/app/package.json b/Z2/app/package.json new file mode 100644 index 0000000..e9401ff --- /dev/null +++ b/Z2/app/package.json @@ -0,0 +1,9 @@ +{ + "name": "k8s-app", + "version": "1.0.0", + "main": "server.js", + "dependencies": { + "express": "^4.18.2", + "pg": "^8.11.0" + } +} \ No newline at end of file diff --git a/Z2/app/server.js b/Z2/app/server.js new file mode 100644 index 0000000..acaae26 --- /dev/null +++ b/Z2/app/server.js @@ -0,0 +1,25 @@ +const express = require("express"); +const { Pool } = require("pg"); + +const app = express(); + +const pool = new Pool({ + host: "postgres-service", + user: "postgres", + password: "postgres", + database: "testdb", + port: 5432, +}); + +app.get("/", async (req, res) => { + try { + const result = await pool.query("SELECT NOW()"); + res.send("DB Time: " + result.rows[0].now); + } catch (err) { + res.send("Database not ready"); + } +}); + +app.listen(3000, () => { + console.log("Server running on port 3000"); +}); \ No newline at end of file diff --git a/Z2/k8s/deployment.yaml b/Z2/k8s/deployment.yaml new file mode 100644 index 0000000..09a5dc0 --- /dev/null +++ b/Z2/k8s/deployment.yaml @@ -0,0 +1,21 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: web-app + namespace: my-app-namespace +spec: + replicas: 2 + selector: + matchLabels: + app: web-app + template: + metadata: + labels: + app: web-app + spec: + containers: + - name: web-app + image: my-web-app:latest + imagePullPolicy: Never + ports: + - containerPort: 3000 \ No newline at end of file diff --git a/Z2/k8s/namespace.yaml b/Z2/k8s/namespace.yaml new file mode 100644 index 0000000..424f47a --- /dev/null +++ b/Z2/k8s/namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: my-app-namespace \ No newline at end of file diff --git a/Z2/k8s/service.yaml b/Z2/k8s/service.yaml new file mode 100644 index 0000000..b38a40a --- /dev/null +++ b/Z2/k8s/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: web-service + namespace: my-app-namespace +spec: + type: NodePort + selector: + app: web-app + ports: + - port: 80 + targetPort: 3000 + nodePort: 30007 \ No newline at end of file diff --git a/Z2/k8s/statefulset.yaml b/Z2/k8s/statefulset.yaml new file mode 100644 index 0000000..8d79352 --- /dev/null +++ b/Z2/k8s/statefulset.yaml @@ -0,0 +1,73 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: postgres-pv +spec: + capacity: + storage: 1Gi + accessModes: + - ReadWriteOnce + hostPath: + path: "/mnt/s/docker/Z2/data/postgres" +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: postgres-pvc + namespace: my-app-namespace +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +--- +apiVersion: v1 +kind: Service +metadata: + name: postgres-service + namespace: my-app-namespace +spec: + ports: + - port: 5432 + clusterIP: None + selector: + app: postgres +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: postgres + namespace: my-app-namespace +spec: + serviceName: "postgres-service" + replicas: 1 + selector: + matchLabels: + app: postgres + template: + metadata: + labels: + app: postgres + spec: + containers: + - name: postgres + image: postgres:15 + env: + - name: POSTGRES_PASSWORD + value: postgres + - name: POSTGRES_DB + value: testdb + ports: + - containerPort: 5432 + volumeMounts: + - name: postgres-storage + mountPath: /var/lib/postgresql/data + volumeClaimTemplates: + - metadata: + name: postgres-storage + spec: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 1Gi \ No newline at end of file diff --git a/Z2/scripts/prepare-app.sh b/Z2/scripts/prepare-app.sh new file mode 100644 index 0000000..61c4ea3 --- /dev/null +++ b/Z2/scripts/prepare-app.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +echo "Building Docker image..." +docker build -t my-web-app:latest ./app + +echo "Creating volume directory..." +mkdir -p ./data/postgres + +echo "Done." \ No newline at end of file diff --git a/Z2/scripts/start-app.sh b/Z2/scripts/start-app.sh new file mode 100644 index 0000000..b19029c --- /dev/null +++ b/Z2/scripts/start-app.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +echo "Creating namespace..." +kubectl apply -f k8s/namespace.yaml + +echo "Deploying database..." +kubectl apply -f k8s/statefulset.yaml + +echo "Deploying web app..." +kubectl apply -f k8s/deployment.yaml + +echo "Creating service..." +kubectl apply -f k8s/service.yaml + +echo "App started!" \ No newline at end of file diff --git a/Z2/scripts/stop-app.sh b/Z2/scripts/stop-app.sh new file mode 100644 index 0000000..b13476e --- /dev/null +++ b/Z2/scripts/stop-app.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +echo "Deleting all resources..." +kubectl delete namespace my-app-namespace + +echo "App stopped!" \ No newline at end of file