Project 1: Deploy Chat Application (3-Tier) using React, Node.js, and MongoDB on Minikube.
Steps to Deploy a 3-Tier Chat Application on Minikube
1. Install Minikube on Windows
Install Minikube following the official guide.
Verify the installation:
minikube start minikube status
2. Clone the Repository
Clone your chat application repository from GitHub or any other source:
git clone https://github.com/imkiran13/full-stack-chat-app.git
cd full-stack-chat-app
3. Prepare Docker Images
Log in to DockerHub using a personal access token:
go to account settings>personal access token >Generatedocker login -u imkiran13
Navigate to the respective directories for the frontend and backend:
For the frontend:
cd frontend docker build -t imkiran13/chatapp-frontend:latest . docker push imkiran13/chatapp-frontend:latest
For the backend:
cd backend docker build -t imkiran13/chatapp-backend:latest . docker push imkiran13/chatapp-backend:latest
4. Create Kubernetes Manifests
Create a folder manifests/
to organize the Kubernetes configurations:
mkdir manifests
cd manifests
Required Manifest Files
Namespace: Define a dedicated namespace for your application.
Secrets: Store sensitive credentials.
MongoDB: Deployment, Service, PV, PVC.
Backend: Deployment, Service.
Frontend: Deployment, Service.
Ingress: Configure Ingress for application routing.
Here’s a brief of each file:
1. namespace.yml
apiVersion: v1
kind: Namespace
metadata:
name: chat-app
2. secrets.yml
apiVersion: v1
kind: Secret
metadata:
name: chatapp-secrets
namespace: chat-app
type: Opaque
data:
jwt: ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKSVV6STFOaUo5LmV5SnBjM01pT2lKUGJteHBibVVnU2xkVUlFSjFhV3hrWlhJaUxDSnBZWFFpT2pFM016YzRNRGsyTkRZc0ltVjRjQ0k2TVRjMk9UTTBOVFkwTml3aVlYVmtJam9pZDNkM0xtVjRZVzF3YkdVdVkyOXRJaXdpYzNWaUlqb2lhbkp2WTJ0bGRFQmxlR0Z0Y0d4bExtTnZiU0lzSWtkcGRtVnVUbUZ0WlNJNklrcHZhRzV1ZVNJc0lsTjFjbTVoYldVaU9pSlNiMk5yWlhRaUxDSkZiV0ZwYkNJNkltcHliMk5yWlhSQVpYaGhiWEJzWlM1amIyMGlMQ0pTYjJ4bElqcGJJazFoYm1GblpYSWlMQ0pRY205cVpXTjBJRUZrYldsdWFYTjBjbUYwYjNJaVhYMC5NY29mWkRHeHpiNkRaQnpUaTBjV3V4V242R00tZ2lMbGQ0YXpfeEFUc1NBCg==
Replace <base64-encoded-username>
and <base64-encoded-password>
with base64-encoded values of your MongoDB username and password:
echo -n 'your-password' | base64
3. mongodb-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb-deployment
namespace: chat-app
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
name: mongodb-pod
namespace: chat-app
labels:
app: mongodb
spec:
containers:
- name: chatapp-mongodb
image: mongo:latest
ports:
- containerPort: 27017
env:
- name: MONGO_INITDB_ROOT_USERNAME
value: mongoadmin
- name: MONGO_INITDB_ROOT_PASSWORD
value: secret
volumes:
- name: mongo-data
persistentVolumeClaim:
claimName: mongodb-pvc
4. mongodb-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-pv
namespace: chat-app
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 5Gi
hostPath:
path: /data
5. mongodb-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongodb-pvc
namespace: chat-app
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
6. mongodb-service.yml
apiVersion: v1
kind: Service
metadata:
name: mongodb
namespace: chat-app
spec:
selector:
app: mongodb
ports:
- port: 27017
targetPort: 27017
7. backend-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-deployment
namespace: chat-app
spec:
replicas: 1
selector:
matchLabels:
app: backend
template:
metadata:
name: backend-pod
namespace: chat-app
labels:
app: backend
spec:
containers:
- name: chatapp-backend
image: imkiran13/chatapp-backend:latest
ports:
- containerPort: 5001
env:
- name: NODE_ENV
value: production
- name: MONGODB_URI
value: "mongodb://mongoadmin:secret@mongodb:27017/dbname?authSource=admin"
- name: JWT_SECRET
valueFrom:
secretKeyRef:
name: chatapp-secrets
key: jwt
- name: PORT
value: "5001"
Replace <username>
and <password>
with your MongoDB credentials or secrets.
8. backend-service.yml
apiVersion: v1
kind: Service
metadata:
name: backend
namespace: chat-app
spec:
selector:
app: backend
ports:
- port: 5001
targetPort: 5001
9. frontend-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend-deployment
namespace: chat-app
spec:
replicas: 1
selector:
matchLabels:
app: frontend
template:
metadata:
name: frontend-pod
namespace: chat-app
labels:
app: frontend
spec:
containers:
- name: chatapp-frontend
image: imkiran13/chatapp-frontend
ports:
- containerPort: 80
env:
- name: NODE_ENV
value: production
10. frontend-service.yml
apiVersion: v1
kind: Service
metadata:
name: frontend
namespace: chat-app
spec:
selector:
app: frontend
ports:
- port: 80
targetPort: 80
11. ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: chatapp-ingress
namespace: chat-app
labels:
name: chatapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- host: chat-tws.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: frontend
port:
number: 80
- pathType: Prefix
path: "/api"
backend:
service:
name: backend
port:
number: 5001
5. Deploy Minikube Ingress Controller
Enable Minikube’s built-in NGINX ingress controller:
minikube addons enable ingress
6. Apply All Manifest Files
Apply the namespace first:
kubectl apply -f namespace.yml
Run the following commands to apply the manifests:
kubectl apply -f secrets.yml
kubectl apply -f mongodb-pv.yml
kubectl apply -f mongodb-pvc.yml
kubectl apply -f mongodb-deployment.yml
kubectl apply -f mongodb-service.yml
kubectl apply -f backend-deployment.yml
kubectl apply -f backend-service.yml
kubectl apply -f frontend-deployment.yml
kubectl apply -f frontend-service.yml
kubectl apply -f ingress.yml
7. Verify All Resources
Check the status of all deployments and services:
kubectl get all -n chat-app
kubectl get ingress -n chat-app
8. Port Forwarding
Forward ports for debugging and local access:
Frontend:
kubectl port-forward svc/frontend 80:80 -n chat-app &
Backend:
kubectl port-forward svc/backend 5001:5001 -n chat-app &
9. Access the Application
Frontend: http://localhost:80
Backend: localhost:50001
10. Dashboard Access
Start Minikube dashboard to monitor resources:
minikube dashboard
Let me know if you'd like more details or customizations!