DEV Community

Wycliffe A. Onyango
Wycliffe A. Onyango

Posted on

100 Days of DevOps: Day 68

Guestbook Application Deployment on Kubernetes

Objective

The Nautilus Application Development Team has completed the Guestbook application, ready for deployment. The DevOps team was tasked with deploying the backend and frontend components on the Kubernetes cluster.

Infrastructure Overview

Architecture

The Guestbook application consists of three main components:

  1. Redis Master (Backend Tier 1)
  2. Redis Slave (Backend Tier 2)
  3. Frontend (User Interface)

Each component runs as a separate Kubernetes Deployment and Service.

Deployment Details

1. Redis Master Deployment and Service

Deployment Name: redis-master
Replicas: 1
Container Name: master-redis-nautilus
Image: redis
Resources:

  • CPU: 100m
  • Memory: 100Mi Port: 6379

Service Name: redis-master
Type: ClusterIP
Port / TargetPort: 6379

YAML – redis-master

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-master
  labels:
    app: redis
    role: master
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
      role: master
  template:
    metadata:
      labels:
        app: redis
        role: master
    spec:
      containers:
        - name: master-redis-nautilus
          image: redis
          ports:
            - containerPort: 6379
          resources:
            requests:
              cpu: "100m"
              memory: "100Mi"
---
apiVersion: v1
kind: Service
metadata:
  name: redis-master
  labels:
    app: redis
    role: master
spec:
  ports:
    - port: 6379
      targetPort: 6379
  selector:
    app: redis
    role: master
Enter fullscreen mode Exit fullscreen mode

2. Redis Slave Deployment and Service

Deployment Name: redis-slave
Replicas: 2
Container Name: slave-redis-nautilus
Image: gcr.io/google_samples/gb-redisslave:v3
Environment Variable:

  • GET_HOSTS_FROM: dns Resources:
  • CPU: 100m
  • Memory: 100Mi Port: 6379

Service Name: redis-slave
Type: ClusterIP
Port / TargetPort: 6379

YAML – redis-slave

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-slave
  labels:
    app: redis
    role: slave
spec:
  replicas: 2
  selector:
    matchLabels:
      app: redis
      role: slave
  template:
    metadata:
      labels:
        app: redis
        role: slave
    spec:
      containers:
        - name: slave-redis-nautilus
          image: gcr.io/google_samples/gb-redisslave:v3
          ports:
            - containerPort: 6379
          env:
            - name: GET_HOSTS_FROM
              value: "dns"
          resources:
            requests:
              cpu: "100m"
              memory: "100Mi"
---
apiVersion: v1
kind: Service
metadata:
  name: redis-slave
  labels:
    app: redis
    role: slave
spec:
  ports:
    - port: 6379
      targetPort: 6379
  selector:
    app: redis
    role: slave
Enter fullscreen mode Exit fullscreen mode

3. Frontend Deployment and Service

Deployment Name: frontend
Replicas: 3
Container Name: php-redis-nautilus
Image:
gcr.io/google-samples/gb-frontend@sha256:a908df8486ff66f2c4daa0d3d8a2fa09846a1fc8efd65649c0109695c7c5cbff
Environment Variable:

  • GET_HOSTS_FROM: dns Resources:
  • CPU: 100m
  • Memory: 100Mi Port: 80

Service Name: frontend
Type: NodePort
Port: 80
NodePort: 30009

YAML – frontend

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: guestbook
      tier: frontend
  template:
    metadata:
      labels:
        app: guestbook
        tier: frontend
    spec:
      containers:
        - name: php-redis-nautilus
          image: gcr.io/google-samples/gb-frontend@sha256:a908df8486ff66f2c4daa0d3d8a2fa09846a1fc8efd65649c0109695c7c5cbff
          ports:
            - containerPort: 80
          env:
            - name: GET_HOSTS_FROM
              value: "dns"
          resources:
            requests:
              cpu: "100m"
              memory: "100Mi"
---
apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30009
  selector:
    app: guestbook
    tier: frontend
Enter fullscreen mode Exit fullscreen mode

Verification Steps

  1. Applied all manifests:
   kubectl apply -f redis-master.yaml
   kubectl apply -f redis-slave.yaml
   kubectl apply -f frontend.yaml
Enter fullscreen mode Exit fullscreen mode
  1. Checked pod status:
   kubectl get pods -o wide
Enter fullscreen mode Exit fullscreen mode
  1. Verified services:
   kubectl get svc
Enter fullscreen mode Exit fullscreen mode

Example output:

   NAME           TYPE        CLUSTER-IP     PORT(S)          AGE
   redis-master   ClusterIP   10.96.128.12   6379/TCP         5m
   redis-slave    ClusterIP   10.96.47.45    6379/TCP         5m
   frontend       NodePort    10.96.78.133   80:30009/TCP     5m
Enter fullscreen mode Exit fullscreen mode

Conclusion

All components of the Guestbook application were successfully deployed on the Kubernetes cluster.
The frontend, Redis master, and Redis slave tiers are operational and communicating correctly via internal services.
The application is accessible externally via NodePort 30009.

Top comments (0)