LAB K102: Kubernetes Quick Dive

In this lab you are going to deploy the instavote application stack as described here in a kubernetes environment using kubectl commands. Later, you would learn how to do the same by writing declarive yaml syntax.

Purpose of this lab is to quickly get your app up and running and demonstrate kubernetes key features such as scheduling, high availability, scalability, load balancing, service discovery etc.

Deploying app with kubernetes

Launch vote application with kubernetes. (simiar to docker run command)

kubectl  run vote --image=schoolofdevops/vote:v1

Since the above command is now deprecated, you could also use a alternate command such as

Following is an alternate. run it only if you have not used kubectl run above

kubectl create deployment vote --image=schoolofdevops/vote:v1

You could now validate that the instance of vote app is running by using the following commands,

kubectl get pods

kubectl get deployments

Scalability

Scale the vote app to run 4 instances.

kubectl scale deployment vote --replicas=4
kubectl get deployments,pods

High Availability

kubectl get pods

The above command will list pods. Try to delete a few pods and observe how it affects the availability of your application.

kubectl delete pods vote-xxxx vote-yyyy
kubectl get deploy,rs,pods

Load Balancing

Publish the application (similar to using -P for port mapping)



kubectl expose deployment vote --type=NodePort --port 80

kubectl get svc

Connect to the app, refresh the page to see it load balancing. Also try to vote and observe what happens.

Deploying a new version

kubectl scale deployment vote --replicas=12

kubectl set image deployment vote vote=schoolofdevops/vote:v2

watch the rolling update in action

watch kubectl get deploy,rs,pods

Service Discovery

Pre Test: Try to submit a vote from the frontend vote app. Does that work ?

Now lets launch rest of the apps.

kubectl  create deployment  redis  --image=redis:alpine

kubectl expose deployment redis --port 6379

optionally, you could launch rest of the services.

kubectl  create deployment  worker --image=schoolofdevops/worker

kubectl  create deployment  db --image=postgres:9.4

kubectl expose deployment db --port 5432

kubectl create deployment  result --image=schoolofdevops/vote-result

kubectl expose deployment result --type=NodePort --port 80

Post Tests:

  • Try to submit a vote from the frontend vote app. Does that work ? If yes, try to deduce how it could connect to the backend applications such as redis.
  • Access results ui application. When you submit vote, do the results change ?

Cleaing up

Once you are done observing, you could delete it with the following commands,


kubectl delete deploy db redis vote worker result

kubectl delete svc db redis result vote

Summary

When you deploy an application in kubernetes, you submit it to the api server/ cluster manager. Kubernetes automatically schedules it on a cluster, networks the pods, provides service discovery. In addition as you observed, your application is scalable, high available and is already running behind a load balancer.