DEV Community

Wycliffe A. Onyango
Wycliffe A. Onyango

Posted on

100 Days of DevOps: Day 51

Rolling Update of an NGINX Deployment on Kubernetes

This article documents the process of performing a rolling update on a Kubernetes deployment to update the NGINX web server to version 1.18. The deployment, named nginx-deployment, was updated to reflect recent changes from the application development team.

1. Initiating the Rolling Update

To start the rolling update, the kubectl set image command was used. This command tells Kubernetes to update the nginx-container within the nginx-deployment to use the new nginx:1.18 image. Kubernetes then begins the rolling update process, which creates new pods with the updated image while gracefully terminating the old ones, ensuring the application remains available.

thor@jumphost ~$ kubectl set image deployment/nginx-deployment nginx-container=nginx:1.18 deployment.apps/nginx-deployment image updated 
Enter fullscreen mode Exit fullscreen mode

2. Verifying the Rollout Status

After initiating the update, the kubectl rollout status command was used to monitor the progress. The command confirms that the new pods have been successfully created and are ready to serve traffic.

thor@jumphost ~$ kubectl rollout status deployment/nginx-deployment deployment "nginx-deployment" successfully rolled out 
Enter fullscreen mode Exit fullscreen mode

3. Checking for Pods in the Correct Namespace

Initially, a check for pods using the label app=nginx failed to show any resources. This is because the deployment's pods were located in the default namespace, while the initial command may have been looking in a different or unspecified namespace. To resolve this, kubectl get pods was run with the --all-namespaces flag. This command correctly located the pods and showed them running in the default namespace.

thor@jumphost ~$ kubectl get pods -l app=nginx No resources found in default namespace. thor@jumphost ~$ kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE default nginx-deployment-58cf54c7f6-hzwvn 1/1 Running 0 2m43s default nginx-deployment-58cf54c7f6-w4wh4 1/1 Running 0 2m51s default nginx-deployment-58cf54c7f6-wznkx 1/1 Running 0 2m41s kube-system coredns-5d78c9869d-bn6v4 1/1 Running 0 13m kube-system coredns-5d78c9869d-g75tz 1/1 Running 0 13m kube-system etcd-kodekloud-control-plane 1/1 Running 0 13m kube-system kindnet-grrg5 1/1 Running 0 13m kube-system kube-apiserver-kodekloud-control-plane 1/1 Running 0 13m kube-system kube-controller-manager-kodekloud-control-plane 1/1 Running 0 13m kube-system kube-proxy-jtxjl 1/1 Running 0 13m kube-system kube-scheduler-kodekloud-control-plane 1/1 Running 0 13m local-path-storage local-path-provisioner-6bc4bddd6b-54lws 1/1 Running 0 13m 
Enter fullscreen mode Exit fullscreen mode

4. Final Verification

The last step was to confirm that the new pods were indeed using the correct nginx:1.18 image. This was done by using the kubectl describe pod command on one of the new pods, nginx-deployment-58cf54c7f6-hzwvn. The output clearly showed that the nginx-container's image had been updated to the desired version.

thor@jumphost ~$ kubectl describe pod nginx-deployment-58cf54c7f6-hzwvn Name: nginx-deployment-58cf54c7f6-hzwvn Namespace: default Priority: 0 Service Account: default Node: kodekloud-control-plane/172.17.0.2 Start Time: Tue, 23 Sep 2025 05:17:44 +0000 Labels: app=nginx-app pod-template-hash=58cf54c7f6 Annotations: <none> Status: Running IP: 10.244.0.9 IPs: IP: 10.244.0.9 Controlled By: ReplicaSet/nginx-deployment-58cf54c7f6 Containers: nginx-container: Container ID: containerd://df902a1d0ebdef8caad17cab31cddec1af4a4c5f6152b0933e6e460c8b7a9fbd Image: nginx:1.18 Image ID: docker.io/library/nginx@sha256:e90ac5331fe095cea01b121a3627174b2e33e06e83720e9a934c7b8ccc9c55a0 Port: <none> Host Port: <none> State: Running Started: Tue, 23 Sep 2025 05:17:45 +0000 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-smr26 (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: kube-api-access-smr26: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 7m41s default-scheduler Successfully assigned default/nginx-deployment-58cf54c7f6-hzwvn to kodekloud-control-plane Normal Pulled 7m41s kubelet Container image "nginx:1.18" already present on machine Normal Created 7m41s kubelet Created container nginx-container Normal Started 7m40s kubelet Started container nginx-container 
Enter fullscreen mode Exit fullscreen mode

The output confirms the successful update and shows that the new pods are running and healthy. This completes the rolling update process for the NGINX application.

Top comments (0)