We’re going to follow this demo by creating a Deployment for nginx image. Below is the example yaml file that I’m using for creating the Deployment as deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
labels:
tier: frontend
spec:
replicas: 6
template:
metadata:
name: nginx-2
labels:
app: myapp
spec:
containers:
- name: nginx
image: nginx
selector:
matchLabels:
app: myapp
First we’ll create the deployment using the below command and record it:
$ kubectl create -f deployment.yaml --record
Now, let’s quickly check the status of the deployment:
$ kubectl rollout status deployment/myapp-deployment
The above command will give output as below:
Waiting for deployment "myapp-deployment" rollout to finish: 0 of 6 updated replicas are available...
Waiting for deployment "myapp-deployment" rollout to finish: 1 of 6 updated replicas are available...
Waiting for deployment "myapp-deployment" rollout to finish: 2 of 6 updated replicas are available...
Waiting for deployment "myapp-deployment" rollout to finish: 3 of 6 updated replicas are available...
Waiting for deployment "myapp-deployment" rollout to finish: 4 of 6 updated replicas are available...
Waiting for deployment "myapp-deployment" rollout to finish: 5 of 6 updated replicas are available...
deployment "myapp-deployment" successfully rolled out
To view the version history, run below command:
$ kubectl rollout history deployment/myapp-deployment
//You can see below output with change-cause..
deployment.apps/myapp-deployment
REVISION CHANGE-CAUSE
1 kubectl create --filename=deployment.yaml --record=true
Now let’s edit the deployment and change the nginx version to a lower version:
$ kubectl edit deployment myapp-deployment --record
Search for the image name and change the section as below and save with wq! vi command:
containers:
image: nginx:1.18
//output after saving with wq!:
deployment.apps/myapp-deployment edited
Run the status command again to see the effect of Rolling updates:
$ kubectl rollout status deployment/myapp-deployment
You can also run the describe deployment command to check the effect as below:
$ kubectl describe deployment myapp-deployment
//Check the events section in the output as below:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 13m deployment-controller Scaled up replica set myapp-deployment-fd8649446 to 6
Normal ScalingReplicaSet 6m9s deployment-controller Scaled up replica set myapp-deployment-ddbb47dd8 to 2
Normal ScalingReplicaSet 6m9s deployment-controller Scaled down replica set myapp-deployment-fd8649446 to 5
Normal ScalingReplicaSet 6m9s deployment-controller Scaled up replica set myapp-deployment-ddbb47dd8 to 3
Normal ScalingReplicaSet 5m40s deployment-controller Scaled down replica set myapp-deployment-fd8649446 to 4
Normal ScalingReplicaSet 5m40s deployment-controller Scaled up replica set myapp-deployment-ddbb47dd8 to 4
Normal ScalingReplicaSet 5m34s deployment-controller Scaled down replica set myapp-deployment-fd8649446 to 3
Normal ScalingReplicaSet 5m34s deployment-controller Scaled up replica set myapp-deployment-ddbb47dd8 to 5
Normal ScalingReplicaSet 5m27s deployment-controller Scaled down replica set myapp-deployment-fd8649446 to 2
Normal ScalingReplicaSet 5m17s (x3 over 5m26s) deployment-controller (combined from similar events): Scaled down replica set myapp-deployment-fd8649446 to 0
The Annotations in the above description from the output after you run the describe command, will show the revision and the image is now nginx:1.18.
Let’s again change the nginx version using a set mage command and record it and check the status:
$ kubectl set image deployment myapp-deployment nginx=nginx:1.18-perl --record
Check the recorded versions again:
$ kubectl rollout history deployment/myapp-deployment
//output as below:
REVISION CHANGE-CAUSE
1 kubectl create --filename=deployment.yaml --record=true
2 kubectl edit deployment myapp-deployment --record=true
3 kubectl set image deployment myapp-deployment nginx=nginx:1.18-perl --record=true
You can see above how we changed between different nginx versions and the reason for it got recorded. Verify your pods, as all 6 should be running:
$ kubectl get pods
Let’s rollback the last version and see how we move back to the previous version, then check the version again which should show as Revision 4:
$ kubectl rollout undo deployment/myapp-deployment
$ kubectl rollout status deployment/myapp-deployment
$ kubectl describe deployment myapp-deployment
//check the nginx image should be nginx:1.18 in the description..
Check the versions again:
$ kubectl rollout history deployment/myapp-deployment
deployment.apps/myapp-deployment
REVISION CHANGE-CAUSE
1 kubectl create --filename=deployment.yaml --record=true
3 kubectl set image deployment myapp-deployment nginx=nginx:1.18-perl --record=true
4 kubectl edit deployment myapp-deployment --record=true
Please note that the Revision 2 earlier now shows as Revision 4 after undo.
Once you’re done, delete the Deployments as below:
$ kubectl delete deployment myapp-deployment