⚽ धडा 11 — Rollouts आणि rollbacks: सामना सुरू असतानाच खेळाडू बदलणे
📍 तुम्ही इथे आहात: 13 पैकी धडा 11 · मागचा: lesson-10-ingress · पुढचा: lesson-12-storage
📦 या ब्रँचमध्ये काय आहे
धडे 01–10, आणि: rolling updates आणि rollbacks — zero downtime ने नवे versions पाठवणे, आणि release खराब निघाला तर सुटकेचा मार्ग. खऱ्या files:
- k8s/deployment.yaml —
strategy:block - .circleci/config.yml — जिथे
kubectl rollout statuspipeline चे फाटक आहे
🧒 5 वर्षांच्या मुलाला समजावल्यासारखे
फुटबॉलचा सामना ⚽. तुमच्या 2 खेळाडूंचा संघ मैदानावर आहे आणि तुम्हाला ताजे खेळाडू आणायचे आहेत — पण खेळ कधीच थांबत नाही. म्हणून प्रशिक्षिका एका वेळी एकच खेळाडू बदलतात:
- ताजी खेळाडू बाजूला warm-up करते 🏃 (नवा pod सुरू होतो).
- पंच ती तयार आहे का ते तपासतात — नाड्या बांधल्या, warm-up झाले 🙋 (readiness probe, धडा 07!).
- मगच दमलेली खेळाडू मैदानाबाहेर जाते (जुना pod संपतो).
- पुढच्या खेळाडूसाठी तेच पुन्हा.
प्रत्येक क्षणी पूर्ण संघ मैदानावर असतो. प्रेक्षकांना काहीच कळत नाही — हाच rolling update.
आणि नवी खेळाडू अगदीच वाईट खेळली तर? 😬 प्रशिक्षिका घाबरत नाहीत आणि नव्या खेळाडूच्या करारासाठी थांबत नाहीत — जुनी खेळाडू अजून बेंचवर आहे. एक हाक: "परत ये!" — हाच rollback. Kubernetes नेमके यासाठीच जुनी संघ-यादी (ReplicaSet) जपून ठेवतो.
🗺️ आकृती
flowchart TB
subgraph before["⏱️ during rollout - never below full team"]
o1["v1 pod ✅ playing"]
o2["v1 pod ✅ playing"]
n1["v2 pod 🏃 warming up<br/>waiting for /readyz"]
end
subgraph after["✅ rollout done"]
n2["v2 pod ✅"]
n3["v2 pod ✅"]
bench["old ReplicaSet v1<br/>scaled to 0 — kept on the bench<br/>for rollback"]
end
before -->|"v2 ready → v1 leaves,<br/>repeat for next"| after
after -.->|"kubectl rollout undo<br/>= bring v1 back on"| before
❓ काय
- दोन knobs असलेली
strategy: RollingUpdate:maxUnavailable: 0— कधीच एक खेळाडू कमी ठेवून खेळू नका (desired replicas च्या खाली कधीच जाऊ नका). सर्वात सुरक्षित setting.maxSurge: 1— बदलाच्या वेळी 1 जादा खेळाडूला परवानगी (थोड्या वेळासाठी 3 pods).
- प्रत्येक नवी image = एक नवा ReplicaSet; जुने rollback साठी ठेवले जातात (0 वर scale केलेले) — हाच बेंच.
kubectl rollout status— "बदल व्यवस्थित पूर्ण झाला का?" — CI च्या फाटकासाठी अगदी योग्य.kubectl rollout undo— तात्काळ rollback.- Readiness probes हे पंच आहेत:
/readyzनाही, तर traffic नाही — बिघडलेल्या v2 ला चेंडू कधीच मिळत नाही, आणिmaxUnavailable: 0मुळे site बंद पाडण्याऐवजी rollout फक्त थांबून राहतो.
🤔 का
पूर्वी deploy म्हणजे "मध्यरात्री maintenance window" 🌙. Rolling updates मुळे deploys कंटाळवाणे होतात: मंगळवारी दुपारी 2 वाजता पाठवा, users ना काहीच कळत नाही. आणि खराब releases कधी येणार हा प्रश्न असतो, येतील का नाही, म्हणून बेंच (rollback) production मधल्या आगीला 10 सेकंदांच्या खांदे उडवण्यात बदलतो. या धड्यात धडे 03 (desired state), 07 (readiness) आणि 04 (फक्त ready pods कडे route करणाऱ्या services) एकत्र जुळतात.
🔧 कसे (या repo मध्ये)
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0 # full team on the field, always
maxSurge: 1 # one warming-up player allowed
CI मध्ये (.circleci/config.yml), kubectl apply नंतर:
kubectl rollout status deployment/school-api — बदल पूर्ण झाला तरच pipeline हिरवी होते.
🧪 करून पाहा
# Ship a "new version" (any image change triggers a rollout):
kubectl -n school set image deployment/school-api school-api=nginxdemos/hello:latest
kubectl -n school rollout status deployment/school-api # watch the substitutions
kubectl -n school get replicasets # old RS at 0 = the bench
# Ship a BROKEN version — and watch Kubernetes protect you:
kubectl -n school set image deployment/school-api school-api=busybox:1.36
kubectl -n school get pods # new pod crash-loops, old pods still serve!
# The 10-second shrug:
kubectl -n school rollout undo deployment/school-api
kubectl -n school rollout history deployment/school-api # the team sheet history
🔧 या धड्यासाठी kubectl
kubectl rollout status/history/undo · kubectl set image
🔗 यावर आधारित: 🤖 ArgoCD शाळा L10 (rollback = git revert)
✅ तपासा — तुम्हाला काय दिसायला हवे
kubectl rollout status pods एका वेळी एक बदलले जात असल्याचे दाखवते; बिघडलेल्या image ला कधीच traffic मिळत नाही; kubectl rollout undo काही सेकंदांत पूर्ववत करते.
🧹 साफसफाई
local cluster: kubectl delete -f k8s/ (किंवा तुम्ही apply केलेली file) — EKS वर चालू राहिलेल्या प्रत्येक गोष्टीचे तासाप्रमाणे बिल लागते
⚠️ नेहमीच्या चुका
maxUnavailableखूप जास्त — तुम्ही संघच मैदानाबाहेर काढला- readiness probe नाही — rollout बिघडलेल्या app वर 'यशस्वी' होतो
⏭️ पुढे
Pods टाकाऊ आहेत — मग जो data टिकायलाच हवा त्याचे काय होते? Volumes, PersistentVolumeClaims, आणि आपला database cluster च्या बाहेर का राहतो: storage आणि state.
git checkout lesson-12-storage