Files
kodekloud-engineer/kubernetes/level 1/task-12.md

4.5 KiB
Raw Blame History

Assignment

An application deployed on the Kubernetes cluster requires an update with new features developed by the Nautilus application development team. The existing setup includes a deployment named nginx-deployment and a service named nginx-service. Below are the necessary changes to be implemented without deleting the deployment and service:

1.) Modify the service nodeport from 30008 to 32165

2.) Change the replicas count from 1 to 5

3.) Update the image from nginx:1.19 to nginx:latest

Note: The kubectl utility on the jump-host has been configured to work with the Kubernetes cluster.

Solution

Update Deployment + Service (no delete, all patches) — nginx-deployment / nginx-service

Three in-place changes, each as a surgical kubectl patch: replicas 1 → 5, image nginx:1.19 → nginx:latest, service nodePort 30008 → 32165. No object is deleted and no full manifest is reproduced.

Patches

# 1) Replicas 1 -> 5  (strategic-merge patch)
kubectl patch deployment nginx-deployment \
  -p '{"spec":{"replicas":5}}'

# 2) Image nginx:1.19 -> nginx:latest  (strategic-merge, container matched by name)
kubectl patch deployment nginx-deployment \
  -p '{"spec":{"template":{"spec":{"containers":[{"name":"nginx-container","image":"nginx:latest"}]}}}}'

# 3) NodePort 30008 -> 32165  (JSON patch, precise field replace)
kubectl patch service nginx-service \
  --type=json \
  -p='[{"op":"replace","path":"/spec/ports/0/nodePort","value":32165}]'

# Wait for the image change to roll out
kubectl rollout status deployment/nginx-deployment

How it works

Two patch types, chosen per change

kubectl patch supports different strategies; each change uses the one that's cleanest for it.

Strategic-merge patch (default) — used for replicas and image. It deep-merges the JSON fragment into the live object, and it understands Kubernetes list semantics.

  • Replicas{"spec":{"replicas":5}} merges a single scalar field; nothing else in the spec is touched.
  • Image{"spec":{"template":{"spec":{"containers":[{"name":"nginx-container","image":"nginx:latest"}]}}}}. The containers list is merged by the name key, so including name: nginx-container tells Kubernetes to patch that existing container's image rather than replace the whole list or add a second container. This is why the correct container name matters — a wrong name would append a new container instead of updating the existing one.

JSON patch (--type=json) — used for the nodePort. It's an ordered list of explicit operations (RFC 6902). replace on /spec/ports/0/nodePort targets exactly one field of the first port entry. JSON patch is the right tool for editing one element of a list like ports — a strategic-merge patch on a ports array is ambiguous about how to match entries, whereas ports/0 is unambiguous. 32165 is inside the valid NodePort range (3000032767), so the API accepts it.

Why the image patch triggers a rolling update

Changing the container image mutates the pod template. The Deployment controller detects the template change, creates a new ReplicaSet, and rolls nginx:latest pods in while retiring the nginx:1.19 pods incrementally — governed by the live RollingUpdate strategy (maxSurge/maxUnavailable 25%). rollout status blocks until that completes. The replicas patch simply scales the ReplicaSet to 5.

Nothing gets deleted

All three are patch operations that mutate existing objects in place. The service keeps its ClusterIP; the deployment keeps its identity and rollout history. "Without deleting" is satisfied by construction — a delete + recreate would drop the ClusterIP and history.

Equivalent shortcuts

The same results are achievable with purpose-built verbs, if you prefer them over raw patches:

kubectl scale deployment nginx-deployment --replicas=5
kubectl set image deployment/nginx-deployment nginx-container=nginx:latest
# (nodePort still needs a patch/edit — there's no dedicated verb for it)

Verify

kubectl get deployment nginx-deployment
kubectl get deployment nginx-deployment \
  -o jsonpath='{.spec.template.spec.containers[0].image}{"\n"}'
kubectl get service nginx-service \
  -o jsonpath='{.spec.ports[0].nodePort}{"\n"}'

Expected — deployment READY 5/5, image nginx:latest, nodePort 32165.

If the rollout hangs with new pods in ImagePullBackOff, the nginx:latest pull failed (node offline / rate-limited); kubectl describe pod <name> shows the cause.