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 upda…


This content originally appeared on DEV Community and was authored by Wycliffe A. Onyango

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

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

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

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

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.


This content originally appeared on DEV Community and was authored by Wycliffe A. Onyango


Print Share Comment Cite Upload Translate Updates
APA

Wycliffe A. Onyango | Sciencx (2025-09-23T05:34:43+00:00) 100 Days of DevOps: Day 51. Retrieved from https://www.scien.cx/2025/09/23/100-days-of-devops-day-51/

MLA
" » 100 Days of DevOps: Day 51." Wycliffe A. Onyango | Sciencx - Tuesday September 23, 2025, https://www.scien.cx/2025/09/23/100-days-of-devops-day-51/
HARVARD
Wycliffe A. Onyango | Sciencx Tuesday September 23, 2025 » 100 Days of DevOps: Day 51., viewed ,<https://www.scien.cx/2025/09/23/100-days-of-devops-day-51/>
VANCOUVER
Wycliffe A. Onyango | Sciencx - » 100 Days of DevOps: Day 51. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2025/09/23/100-days-of-devops-day-51/
CHICAGO
" » 100 Days of DevOps: Day 51." Wycliffe A. Onyango | Sciencx - Accessed . https://www.scien.cx/2025/09/23/100-days-of-devops-day-51/
IEEE
" » 100 Days of DevOps: Day 51." Wycliffe A. Onyango | Sciencx [Online]. Available: https://www.scien.cx/2025/09/23/100-days-of-devops-day-51/. [Accessed: ]
rf:citation
» 100 Days of DevOps: Day 51 | Wycliffe A. Onyango | Sciencx | https://www.scien.cx/2025/09/23/100-days-of-devops-day-51/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.