⏪ धडा 10 — Rollback आणि history: वही कालच्या पानावर उलटा
📍 तुम्ही इथे आहात: 12 पैकी धडा 10 · मागील: lesson-09-self-heal-drift · पुढील: lesson-11-helm-kustomize-envs
📦 या ब्रँचमध्ये काय आहे
धडे 01–09, आणि त्यासोबत operations मधली सर्वात शांत महाशक्ती: GitOps मध्ये,
rollback म्हणजे फक्त git revert — आणि तुमचा audit trail आपोआप लिहिला जातो.
🧒 5 वर्षांच्या मुलाला समजावल्यासारखे
वहीच्या मंगळवारच्या पानावर लिहिले होते "खोली 3B निळी रंगवा". खोली निळी झाली. बुधवारी सगळ्यांचे एकमत: तो निळा रंग भयंकर आहे. 🎨😱
जुने जग: घाबरगुंडी, जुना रंगाचा डबा शोधा, जुना रंग आठवा, मध्यरात्री हाताने पुन्हा रंगवा, आणि आपण बरोबर आठवले अशी आशा करा.
वहीचे जग: एक पान मागे उलटा. 📖⏪ सोमवारच्या पानावर जे लिहिले होते
नेमके तेच सांगणारे नवे पान लिहा (हेच git revert — ते बुधवारची चूक पुसत नाही,
ते "बुधवारचे उलटवा" असे एक पान जोडते). केअरटेकर ते वाचतो आणि शांतपणे
पुन्हा रंगवतो. माणसाचे फक्त दहा सेकंदांचे काम.
आणि शाळेची नोंदवही? वहीच्या पानांचा इतिहास म्हणजे प्रत्येक विनंतीची नोंद: कोणी कोणते पान, केव्हा आणि का बदलले (commit message). केअरटेकर त्याने प्रत्यक्षात काय केले आणि केव्हा याची दुसरी, छोटी नोंद ठेवतो — ArgoCD ची sync history. Auditor 🕵️ दोन्ही वाचते आणि लवकर घरी जाते.
🗺️ आकृती
flowchart LR
A["commit A<br/>image: v1 ✅"] --> B["commit B<br/>image: v2 💥 bad!"]
B --> C["commit C = revert B<br/>image: v1 again ✅"]
C -->|"3 robot syncs C<br/>cluster back on v1"| argo["🤖 ArgoCD"]
B -.->|"1 bad version ships<br/>via git, at least!"| B
C -.->|"2 git revert - 10 seconds"| C
argo -.->|"4 git = desired-state history 🧾<br/>ArgoCD history = what actually synced"| argo
❓ काय
git revert <sha>जुना commit उलटवणारा एक नवा commit बनवतो — history जशीच्या तशी राहते (तुमच्या deploy repo वर कधीच force-push करू नका!). ArgoCD नवा commit पाहतो आणि sync करतो; cluster शांतपणे मागे जातो, कोणत्याही deploy सारख्याच rolling-update सुरक्षिततेसह.- ArgoCD चे स्वतःचे History & Rollback बटण देखील आहे (ते मागील
revision पुन्हा sync करू शकते) — आगीच्या सरावात उत्तम. पण लक्षात ठेवा:
automatedsync चालू असताना UI मधून केलेला rollback वही पुन्हा उलटवून टाकते — टिकणारा rollback म्हणजे git revert. वहीच बदलली पाहिजे. - एक नव्हे, दोन histories. Git history = desired-state बदलांचा इतिहास
(
git log -p k8s/— कोणी/काय/केव्हा; PR सांगतो का). ArgoCD ची sync history = प्रत्यक्षात काय sync झाले (argocd app history hello-school, किंवा History tab): एखादा sync fail होऊ शकतो, manual होकाराची वाट पाहू शकतो, किंवा काही मिनिटे उशिरा होऊ शकतो, आणि git ला त्याबद्दल काहीच माहीत नसते. मिळून त्या CI logs + kubectl events वरून timeline पुन्हा जुळवण्याची गरज संपवतात.
🤔 हे pipeline rollbacks पेक्षा सरस का
Pipeline rollback ही एक नवी पुढची कृती असते (जुन्या parameters सह पुन्हा चालवा — ते अजूनही valid असतील अशी आशा करा). GitOps rollback हे एक state घोषणा असते: "desired = जे आधी होते ते". Pipeline पुन्हा चालवायची नाही, शिळे parameters नाहीत, "deploy job बिघडला आहे आणि तोच rollback tool पण आहे" असा single point of failure नाही. आणि ते 1 किंवा 50 clusters वर अगदी सारखेच चालते.
✅ खड्डा 4 बुजला. "खोली 3B मध्ये आत्ता काय आहे?" याचे उत्तर आता काय पाठवले गेले याच्या टपालखान्याच्या नोंदीतून मिळत नाही: वही हेच live सत्य आहे (Synced ✅ म्हणजे खोली == पान), आणि sync history सांगते की प्रत्येक पान प्रत्यक्षात केव्हा apply झाले.
🔧 कसे (या repo मध्ये)
Demo Deployment k8s/deployment.yaml मध्ये
image: nginxdemos/hello:plain-text pin करते. git मधली ती ओळ बदलणे
हाच deploy; तो commit revert करणे हाच rollback. एवढीच संपूर्ण
यंत्रणा. (म्हणूनच GitOps repos ठराविक tags pin करतात, कधीच
:latest नाही — बदलणारा tag प्रत्यक्षात काय चालू आहे ते लपवतो, आणि "revert"
काहीच उलटवणार नाही.)
🧪 करून पाहा (तुमच्या fork वर)
# point your Application at YOUR fork first (lesson 07), then:
# 1) ship a "bad" version — change the image tag in k8s/deployment.yaml:
# image: nginxdemos/hello:latest # pretend this one is broken
git add k8s/deployment.yaml && git commit -m "ship v2" && git push
kubectl -n gitops-school get pods -w # rollout happens by itself; Ctrl+C
# 2) uh oh. roll back in one move:
git revert --no-edit HEAD && git push
kubectl -n gitops-school get pods -w # ...and it calmly walks back. 🎉
# 3) read your free audit log:
git log --oneline -- k8s/ # every desired-state change, forever
argocd app history hello-school 2>/dev/null || echo "or: UI → hello-school → History" # what actually synced
✅ तपासा — तुम्हाला काय दिसायला हवे
चुकीच्या commit नंतर: kubectl -n gitops-school get deploy hello-school -o jsonpath='{.spec.template.spec.containers[0].image}' ~3 मिनिटांत नवा tag दाखवते. git revert + push नंतर: पुन्हा जुना tag, नेहमीच्या rolling update द्वारे. argocd app history hello-school (किंवा History tab) दोन्ही syncs त्यांच्या git SHAs सह दाखवते — प्रत्यक्षात काय चालले याची तीच नोंद आहे.
🧹 स्वच्छता
तुमच्या fork मध्ये आता दोन जास्तीचे commits आहेत — बदल आणि त्याचा revert. तोच audit trail आहे; तो ठेवा. Cluster मध्ये साफ करण्यासारखे काही नाही.
⚠️ नेहमीच्या चुका
- automated sync चालू असताना UI च्या Rollback बटणाने rollback करणे — वही काही मिनिटांत चुकीचा commit पुन्हा apply करते; टिकणारा rollback म्हणजे revert
- "undo" करण्यासाठी
git reset --hard+ force-push — ज्या history मुळे rollback विश्वासार्ह होता तीच तुम्ही नष्ट करता :latestpin करणे — tag बदललाच नाही म्हणून revert काहीच बदलत नाही- git history ला एखादी गोष्ट चालली याचा पुरावा समजणे — प्रत्यक्षात काय sync झाले, आणि केव्हा, हे sync history सांगते
🏭 प्रत्यक्ष वापरात हे का महत्त्वाचे: GitOps rollback हा इतर कोणत्याही PR सारखाच एक PR असतो, आणि म्हणूनच तो शांत असतो: तेच review, तेच checks, तोच audit. Image tag एका छोट्या वेगळ्या file मध्ये (किंवा values file मध्ये) ठेवा, म्हणजे revert फक्त एक ओळ बदलेल.
⏭️ पुढे
एका खोलीत एक app छान आहे — पण प्रत्यक्ष जीवनात dev/staging/prod आणि दहा services असतात. Templates आणि app-of-apps pattern.
git checkout lesson-11-helm-kustomize-envs