Deploying 3-tier chat-app on MiniKube

Daksh SawhneyDaksh Sawhney
3 min read

Installing MiniKube on Local

minikube start --driver=docker
minikube status # Verify if minikube is present


Now, pushing docker images of frontend and backend on DockerHub

In order to make deployment for frontend and backend, we need their images retrieved from Docker Hub, so after building images, we need to push them to Docker Hub

Login into CLI with your docker credentials

docker login

Building frontend image and pushing it to Docker Hub

docker build -t dakshsawhneyy/chatapp-frontend ./frontend
docker push dakshsawhneyy/chatapp-frontend

Building backend image and pushing it to Docker Hub

docker build -t dakshsawhneyy/chatapp-backend ./backend
docker push dakshsawhneyy/chatapp-backend

Starting with K8S

Creating Namespace of name chat-app

kubectl create namespace chat-app

Creating Frontend-Deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-deployment
  namespace: chat-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: frontend-cont
        image: dakshsawhneyy/chatapp-frontend
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 80
        env:
        - name: NODE_ENV
          value: production

Creating Frontend-Deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-deployment
  namespace: chat-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend-cont
        image: dakshsawhneyy/chatapp-backend
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 5001
        env:
        - name: NODE_ENV
          value: production
        - name: MONGODB_URI        # they are present in env of Docker File
          value: "mongodb://mongoadmin:secret@mongodb"
        - name: JWT_SECRET
          value: your_jwt_secret    
        - name: PORT
          value: 5001

Creating MongoDB-Deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongo-deployment
  namespace: chat-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongo
  template:
    metadata:
      labels:
        app: mongo
    spec:
      containers:
      - name: mongo-cont
        image: mongo:latest
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 27017
        env:
        - name: MONGO_INITDB_ROOT_USERNAME
          value: root
        - name: MONGO_INITDB_ROOT_PASSWORD
          value: root

Creating Persistent-Volume and Persistent-Volume-Claim for MongoDB

Creating PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongo-pv
  namespace: chat-app
spec:
  capacity:
    storage: 2Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  hostPath:
    path: /data   # for MiniKube

Creating PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mongodb-pvc
  namespace: chat-app
spec:
  resources:
    requests:
      storage: 2Gi
  accessModes:
    - ReadWriteOnce

Now, putting these in deployment of MongoDB

Updating MongoDB Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongo-deployment
  namespace: chat-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongo
  template:
    metadata:
      labels:
        app: mongo
    spec:
      containers:
      - name: mongo-cont
        image: mongo:latest
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 27017
        env:
        - name: MONGO_INITDB_ROOT_USERNAME
          value: root
        - name: MONGO_INITDB_ROOT_PASSWORD
          value: root
      volumes:
      - name: mongo-data
        persistentVolumeClaim:
          claimName: mongodb-pvc

Apply Both PV and PVC

kubectl apply -f mongodb-pv.yml
kubectl get pv -n chat-app
kubectl apply -f mongodb-pvc.yml
kubectl get pv -n chat-app

Apply Deployment of MongoDB

kubectl apply -f mongodb-deployment.yml

Error coming, we need to create service for backend, then weโ€™ll able to run frontend pod

Creating backend-service

apiVersion: v1
kind: Service
metadata:
  name: backend
  namespace: chat-app
spec:
  selector:
    app:  backend
  ports:
  - port: 5001
    targetPort: 5001

Creating frontend-service

apiVersion: v1
kind: Service
metadata:
  name: frontend
  namespace: chat-app
spec:
  selector:
    app:  frontend
  ports:
  - port: 80
    targetPort: 80

Creating MongoDB Service

apiVersion: v1
kind: Service
metadata:
  name: mongo-svc
  namespace: chat-app
spec:
  selector:
    app:  mongo
  ports:
  - port: 27017
    targetPort: 27017

Apply ALL


And Chat-App is running fine on PORT 80 ๐ŸŽ‰๐ŸŽ‰๐ŸŽ‰๐ŸŽ‰

0
Subscribe to my newsletter

Read articles from Daksh Sawhney directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Daksh Sawhney
Daksh Sawhney

Aspiring DevOps & DevSecOps Engineer | Automating Infra with Terraform & Ansible | Kubernetes Enthusiast | Building Scalable Pipelines ๐Ÿคทโ€โ™‚๏ธ