Working with deployments in Kubernetes: Rollback and rolling updates
How to manage rolling updates using deployment in Kubernetes?
A Kubernetes deployment is a resource object in Kubernetes that provides declarative updates to applications. It allows you to explain an application’s life cycle, such as which images to use for the app, the number of pods replicas for the app, and the mechanism in which the should be updated
In part 1 of working with deployments we covered:
Working With Deployment In Kubernetes
What is Deployment in Kubernetes? How to maintain a rolling update of our application ?
- What is K8s deployment?
- How to create deployment using YAML specifications and deploy it in minikube k8s cluster?
- How to edit and update deployment?
Today in part 2 we will cover :
- Revisit updating and rolling out deployments
- How to roll back the update using deployment?
- How to check the rollback and rollout status?
Revisiting Updating Deployments in K8s:
When you want to make any changes to the deployment type workloads, you can do so by changing the specifications defined in
A Deployment’s rollout is triggered if and only if the Deployment’s pod template (i.e,
.spec.template) is modified. If you modify the scaling parameter, it will not rollout, but if you are changing the deployment labels or container images info, it will trigger the deployment rollout to update it.
Let’s first create a deployment-type workload and deploy it in our Minikube cluster.
As a pre-requisite, you must have minikube installed, if not follow the given link below to get started with minikube installation.
minikube is local Kubernetes, focusing on making it easy to learn and develop for Kubernetes. All you need is Docker…
Defining Deployment, Rolling it out & Managing Rollback :
Defining Deployment Using the imperative command:
Here we are making use of imperative commands to create a deployment named:
With a docker image = nginx having 3 replicas, as using the kubectl CLI as shown below:
$ kubectl create deployment test-deploy --image=nginx --replicas=3
When you run the above command in your command line /terminal and execute :
$ kubectl get deployments
In the output image below you can see that our test-deploy workload is up and running in the clusters
Now as our deployment workload is up and ready, let’s make some changes to it and try to roll back the same.
Updating the test-deploy file :
As discussed earlier, if any changes like labels or container images of the deployment template are identified then only an update will be triggered against the given deployment.
Let’s update the nginx Pods to use the
nginx:1.16.1 image, instead of the
nginx:1.14.2 image, which we used earlier to create our deployment
We can update the image type by using the below given imperative command
$ kubectl set image deployment.v1.apps/test-deploy nginx=nginx:1.16.1
We can see below that our test-deploy file has been updated with a new nginx version
Let’s use describe command to see the change in the deployment:
$ kubectl describe deploy test-deploy
As can be seen in the highlighted output below, the deployment has been updated with a new nginx image type :
Rolling back the Update in the deployment:
What if the update in the deployment has created some mess and your deployment workload is crashing and not stable. Don’t worry Kubernetes has a roll-back feature in place.
In K8s by default, all of the Deployment’s rollout history is kept in the system so that you can roll back anytime you want (you can change that by modifying the revision history limit).
Let’s understand how to roll back the deployment by example
Earlier we have rolled out an update by changing the nginx image to
Suppose that while updating the deployment one mess with
Suppose that while updating the deployment developer by mistake changes the nginx image name to
nginx:1.191 , which is not a valid nginx version.
$kubectl set image deployment/nginx-deployment nginx=nginx:1.191
Now let’s check the rollout status by using the below-given commands:
$kubectl rollout status deployment/test-deploy
We can see from the output that our test-deploy roll-out is kind of stuck. So as a k8s cluster administrator/developer, you need to roll back the updates.
We can further investigate the issue by running
$kubectl get pods
You can see that the test-deploy workload is showing an error: ImagePullBackOff
Now if we want to roll back the new update to its older version, you can use the rollout undo command
Rolling Back to an Older Version:
To roll back the existing deployment to any previous version, k8s provides a rollout undo functionality
Type the following command on your terminal
$ kubectl rollout undo deployment/nginx-deployment
The output below clearly shows that the deployment has been rolled back
Let’s go ahead and check the deployment status
$ kubectl rollout status deployment/test-deploy$ kubectl get deployment test-deploy
we can see that our deployment has now rolled back and is up and running.
Rolling Back to a specific version:
We can also roll back the deployment to a specific version. As K8s maintains the revision history of the deployment workload
So let's check the history to find the revision details and then pick the specific revision tag to roll back
$ kubectl rollout history deployment/nginx-deployment
We can see that our test-deploy file has got three revisions 1,3,4
Now if we want to roll back to a specific revision tag we can use the following command
$ kubectl rollout undo deployment/test-deploy --to-revision=3
Let’s see the output :
Let’s check the test-deploy workload details, first, we will use describe command and then see the revision history details
$ kubectl describe deployment test-deploy$ kubectl rollout history deployment/test-deploy
The output will look like this:
We can see in describe command output that our deployment with revision version 3 has been revised and our rollout history shows the revision version as 1,4,5 which earlier was, 1,3,4
What’s next In working with the deployment Series?
We will continue our learning journey by discussing
- How one can scale up the Deployment to facilitate more load in the given k8s cluster
- How to pause the running deployment?