From 92a9d51e80480f837e1181c9d74305555e379ac7 Mon Sep 17 00:00:00 2001
From: Jesus Galaz <jesusgalazr@icloud.com>
Date: Fri, 13 Dec 2024 20:26:26 +0100
Subject: [PATCH] feat(kubernetes): complete Kubernetes setup for todo-app with
 Minikube

- Added Kubernetes deployment specs for `todo-app` and `mongodb`
- Configured NodePort service for external access
- Verified application functionality using `minikube service`
- Enabled persistent storage for MongoDB using PersistentVolumeClaim
- Removed unused `ingress.yml` file
- Provided compatibility for ARM64 and Linux environments
---
 docker-compose.yml      | 47 -----------------------------------------
 mongodb-deployment.yml  | 44 ++++++++++++++++++++++++++++++++++++++
 mongodb-service.yml     | 10 +++++++++
 nginx.conf              | 38 ---------------------------------
 todo-app-deployment.yml | 25 ++++++++++++++++++++++
 todo-app-service.yml    | 11 ++++++++++
 6 files changed, 90 insertions(+), 85 deletions(-)
 delete mode 100644 docker-compose.yml
 create mode 100644 mongodb-deployment.yml
 create mode 100644 mongodb-service.yml
 delete mode 100644 nginx.conf
 create mode 100644 todo-app-deployment.yml
 create mode 100644 todo-app-service.yml

diff --git a/docker-compose.yml b/docker-compose.yml
deleted file mode 100644
index fc10e49..0000000
--- a/docker-compose.yml
+++ /dev/null
@@ -1,47 +0,0 @@
-services:
-  mongodb:
-    image: mongo:latest
-    container_name: mongodb
-    ports:
-      - "27017:27017"
-    environment:
-      - MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME}
-      - MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD}
-      - MONGO_INITDB_DATABASE=todo-app
-
-  todo-app-1:
-    build:
-      context: .
-      dockerfile: Dockerfile
-    container_name: todo-app-1
-    ports:
-      - "3001:3000"
-    depends_on:
-      - mongodb
-    environment:
-      - MONGO_URI=${MONGO_URI}
-      - PORT=3000
-
-  todo-app-2:
-    build:
-      context: .
-      dockerfile: Dockerfile
-    container_name: todo-app-2
-    ports:
-      - "3002:3000"
-    depends_on:
-      - mongodb
-    environment:
-      - MONGO_URI=${MONGO_URI}
-
-  nginx:
-    image: nginx:latest
-    container_name: nginx
-    ports:
-      - "80:80"
-    depends_on:
-      - todo-app-1
-      - todo-app-2
-    volumes:
-      - "./nginx.conf:/etc/nginx/nginx.conf:ro"
-      - "/var/log/nginx/access.log:/var/log/nginx/access.log"
diff --git a/mongodb-deployment.yml b/mongodb-deployment.yml
new file mode 100644
index 0000000..58fa9fd
--- /dev/null
+++ b/mongodb-deployment.yml
@@ -0,0 +1,44 @@
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: mongo-pvc
+spec:
+  accessModes:
+    - ReadWriteOnce
+  resources:
+    requests:
+      storage: 1Gi
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: mongodb
+  labels:
+    app: mongodb
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: mongodb
+  template:
+    metadata:
+      labels:
+        app: mongodb
+    spec:
+      containers:
+        - name: mongodb
+          image: mongo:latest
+          ports:
+            - containerPort: 27017
+          env:
+            - name: MONGO_INITDB_ROOT_USERNAME
+              value: mongoAdmin
+            - name: MONGO_INITDB_ROOT_PASSWORD
+              value: someRandomPassword123$
+          volumeMounts:
+            - name: mongo-data
+              mountPath: /data/db
+      volumes:
+        - name: mongo-data
+          persistentVolumeClaim:
+            claimName: mongo-pvc
diff --git a/mongodb-service.yml b/mongodb-service.yml
new file mode 100644
index 0000000..00a4a7d
--- /dev/null
+++ b/mongodb-service.yml
@@ -0,0 +1,10 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: mongodb
+spec:
+  ports:
+    - port: 27017
+      targetPort: 27017
+  selector:
+    app: mongodb
diff --git a/nginx.conf b/nginx.conf
deleted file mode 100644
index 737504a..0000000
--- a/nginx.conf
+++ /dev/null
@@ -1,38 +0,0 @@
-events {
-    # Set the maximum number of simultaneous connections that can be opened by a worker process
-    worker_connections 1024;
-}
-
-http {
-    # Define an upstream group for load balancing the todo-app services
-    upstream todo-app {
-        ip_hash;
-        server todo-app-1:3000;  # First server in the upstream group
-        server todo-app-2:3000;  # Second server in the upstream group
-    }
-
-    # Define a custom log format for capturing upstream request details
-    log_format upstreamlog '[$time_local] $remote_addr - $remote_user - $request '
-                           '"$status" $body_bytes_sent '
-                           '"$http_referer" "$http_user_agent" '
-                           '"$gzip_ratio" '
-                           '${host} $request_uri '
-                           '$upstream_addr ';
-
-    server {
-        listen 80;  # Listen on port 80 for incoming HTTP requests
-        location / {
-            # Proxy requests to the upstream todo-app group
-            proxy_pass http://todo-app;
-            proxy_http_version 1.1;  # Use HTTP/1.1 for proxying
-            proxy_set_header Upgrade $http_upgrade;  # Set the Upgrade header
-            proxy_set_header Connection 'upgrade';  # Set the Connection header to upgrade
-            proxy_set_header Host $host;  # Forward the original Host header
-            proxy_cache_bypass $http_upgrade;  # Bypass cache for upgraded requests
-            # Log access requests using the defined upstream log format
-            access_log /var/log/nginx/access.log upstreamlog;
-        }
-    }
-}
-
-
diff --git a/todo-app-deployment.yml b/todo-app-deployment.yml
new file mode 100644
index 0000000..ef1d8dd
--- /dev/null
+++ b/todo-app-deployment.yml
@@ -0,0 +1,25 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: todo-app
+  labels:
+    app: todo-app
+spec:
+  replicas: 2
+  selector:
+    matchLabels:
+      app: todo-app
+  template:
+    metadata:
+      labels:
+        app: todo-app
+    spec:
+      containers:
+        - name: todo-app
+          image: todo-app:latest
+          imagePullPolicy: IfNotPresent
+          ports:
+            - containerPort: 3000
+          env:
+            - name: MONGO_URI
+              value: mongodb://mongoAdmin:someRandomPassword123$@mongodb:27017/todo-app?authSource=admin
diff --git a/todo-app-service.yml b/todo-app-service.yml
new file mode 100644
index 0000000..1fe97a5
--- /dev/null
+++ b/todo-app-service.yml
@@ -0,0 +1,11 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: todo-app
+spec:
+  ports:
+    - port: 3000
+      targetPort: 3000
+  selector:
+    app: todo-app
+  type: NodePort
-- 
GitLab