ЁЯПл The SchoolтА║ЁЯдЦ ArgoCDтА║ЁЯкС рдзрдбрд╛ 02 тАФ Drift: рдЬреЗрд╡реНрд╣рд╛ рд╡рд╛рд╕реНрддрд╡ files рд╢реА рдЬреБрд│рдгреЗ рдерд╛рдВрдмрд╡рддреЗ
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯкС рдзрдбрд╛ 02 тАФ Drift: рдЬреЗрд╡реНрд╣рд╛ рд╡рд╛рд╕реНрддрд╡ files рд╢реА рдЬреБрд│рдгреЗ рдерд╛рдВрдмрд╡рддреЗ

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 02 ┬╖ рдорд╛рдЧреЗ: lesson-01-deploy-by-hand ┬╖ рдкреБрдвреЗ: lesson-03-cicd-push


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбрд╛ 01, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд рдпрд╛ рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕рдЪрд╛ рдЦрд▓рдирд╛рдпрдХ: configuration drift тАФ рддреБрдордЪреЗ YAML рдЬреЗ рд╕рд╛рдВрдЧрддреЗ рдЖрдгрд┐ cluster рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдЬреЗ рдЪрд╛рд▓рд╡рддреЛ рддреНрдпрд╛рддрд▓реА рд╡рд╛рдврдд рдЬрд╛рдгрд╛рд░реА рджрд░реА. рднрд╛рдЧ 2 рдордзрд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрд╛рдп рдпрд╛ рдзрдбреНрдпрд╛рдореБрд│реЗрдЪ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗ.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рд╡рд░реНрдЧрд╛рдд рд╢рд┐рдХреНрд╖рд┐рдХреЗрдЪреНрдпрд╛ рдбреНрд░реЙрд╡рд░рдордзреНрдпреЗ рдПрдХ рдмрд╕рдгреНрдпрд╛рдЪрд╛ рддрдХреНрддрд╛ рдЪрд┐рдХрдЯрд╡рд▓реЗрд▓рд╛ рдЖрд╣реЗ ЁЯЧВя╕П тАФ рдХреЛрдг рдХреБрдареЗ рдмрд╕рддреЗ, рдЭрд╛рдбрд╛рдВрдирд╛ рдкрд╛рдгреА рдШрд╛рд▓рдгрд╛рд░реЗ 2 рдЬрдг, projector рдбрд╛рд╡реАрдХрдбреЗ.

рдкрдг рджрд┐рд╡рд╕реЗрдВрджрд┐рд╡рд╕ рдЫреЛрдЯреНрдпрд╛ рдЧреЛрд╖реНрдЯреА рдШрдбрдд рд░рд╛рд╣рддрд╛рдд, рддрдХреНрддрд╛ рди рдмрджрд▓рддрд╛:

рддреАрди рдорд╣рд┐рдиреНрдпрд╛рдВрдиреА рддрдХреНрддрд╛ рдПрдХ рд╕рд╛рдВрдЧрддреЛ, рдЦреЛрд▓реА рдкреВрд░реНрдгрдкрдгреЗ рд╡реЗрдЧрд│реА рдЕрд╕рддреЗ, рдЖрдгрд┐ рднреАрддреАрджрд╛рдпрдХ рднрд╛рдЧ рд╣рд╛ рдЖрд╣реЗ: ЁЯШ▒

рдкреБрдврдЪреНрдпрд╛ рд╡реЗрд│реА рдХреЛрдгреА рдирд┐рд░рд╛рдЧрд╕рдкрдгреЗ "рдЦреЛрд▓реА рддрдХреНрддреНрдпрд╛рдиреБрд╕рд╛рд░ рдкрд░рдд рд▓рд╛рд╡рддреЗ", рддреЗрд╡реНрд╣рд╛ рддреА рди рдиреЛрдВрджрд╡рд▓реЗрд▓реЗ рд╕рдЧрд│реЗ рдмрджрд▓ рдПрдХрд╛ рдлрдЯрдХреНрдпрд╛рдд рдирд╖реНрдЯ рдХрд░рддреЗ тАФ рдЖрдгрд┐ рдЬрд╛рд╕реНрддреАрдЪрд╛ projector рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рд╣реЛрддрд╛ рддреЗ рдХреЛрдгрд╛рд▓рд╛рдЪ рдЖрдард╡рдд рдирд╛рд╣реА.

рддрдХреНрддрд╛ рдЖрдгрд┐ рдЦреЛрд▓реА рдпрд╛рдВрддрд▓реА рд╣реА рджрд░реА рдореНрд╣рдгрдЬреЗ drift. рд╣реА рдПрдХ рдореЛрдареА рдЪреВрдХ рдирд╛рд╣реА тАФ рд╣реА рд╢рдВрднрд░ рдЫреЛрдЯреЗ "рдлрдХреНрдд рдпрд╛ рд╡реЗрд│реА" рдХреЗрд▓реЗрд▓реЗ рдмрджрд▓ рдЖрд╣реЗрдд, рдЬреЗ рдХрдзреАрдЪ рд▓рд┐рд╣реВрди рдареЗрд╡рд▓реЗ рдЧреЗрд▓реЗ рдирд╛рд╣реАрдд.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
    git["ЁЯУД YAML in git says<br/>replicas: 2<br/>image: v1<br/>limit: 64Mi"]
    cluster["ЁЯПл cluster actually runs<br/>replicas: 5 - Friday panic<br/>image: v2-hotfix-REAL<br/>limit: 512Mi - kubectl edit"]
    boom["ЁЯТе next 'clean' apply from git<br/>silently UNDOES every hotfix"]
    git <-. "1 hand-edits, 'just this once'<br/>2 never written back to git" .-> cluster
    cluster --> boom

тЭУ рдХрд╛рдп

ЁЯдФ рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ

Drift рдореБрд│реЗрдЪ "staging рдордзреНрдпреЗ рдЪрд╛рд▓рд▓реЗ рд╣реЛрддреЗ" рд╣реЗ рдЦреЛрдЯреЗ рдард░рддреЗ, disaster recovery рдЕрдкрдпрд╢реА рд╣реЛрддреЗ ("рдлрдХреНрдд repo рдкреБрдиреНрд╣рд╛ apply рдХрд░рд╛!" тАФ рдкрдг repo 3 рдорд╣рд┐рдиреЗ рдЬреБрдирд╛ рд╣реЛрддрд╛), рдЖрдгрд┐ рдирд╡реНрдпрд╛ рд╕рд╣рдХрд╛рд▒реНрдпрд╛рдВрдирд╛ рд▓рд┐рд╣реВрди рдареЗрд╡рд▓реЗрд▓реНрдпрд╛ рдХрд╢рд╛рд╡рд░рдЪ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡рддрд╛ рдпреЗрдд рдирд╛рд╣реА. рд╣реА рднрд╛рд╡рдирд╛ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛ тАФ рдзрдбрд╛ 09 рдордзреНрдпреЗ, ArgoCD рдиреЗрдордХреА рд╣реАрдЪ рдкрд░рд┐рд╕реНрдерд┐рддреА рдХрд╛рд╣реА рд╕реЗрдХрдВрджрд╛рдВрдд рдУрд│рдЦреЗрд▓ рдЖрдгрд┐ рдЙрд▓рдЯрд╡реЗрд▓.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ рдкрд╛рд╣рд╛)

Demo Deployment k8s/deployment.yaml рдордзреНрдпреЗ replicas: 2 рдЬрд╛рд╣реАрд░ рдХрд░рддреЗ. рдЖрддрд╛ рддреБрдореНрд╣реА live cluster рд▓рд╛ рддреНрдпрд╛ file рд╢реА рдЕрд╕рд╣рдордд рдХрд░рдгрд╛рд░ рдЖрд╣рд╛рдд тАФ рдЕрднрд┐рдирдВрджрди, рддреБрдореНрд╣реА 10 рд╕реЗрдХрдВрджрд╛рдВрдд рдЦрд░рд╛ drift рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓рд╛ рдЕрд╕реЗрд▓.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

# the file says replicas: 2 тАФ now vandalize reality:
kubectl -n gitops-school scale deployment hello-school --replicas=5
kubectl -n gitops-school edit deployment hello-school   # change something small, e.g. add a label

# your repo and your cluster now disagree. Would you have noticed?
kubectl diff -f k8s/ | head -30        # тЖР the honest mirror (run it BEFORE any apply!)

# the horror-movie moment тАФ an innocent teammate "deploys the repo":
kubectl apply -f k8s/
kubectl -n gitops-school get deploy    # replicas back to 2 тАФ your hotfix is GONE, silently

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

Scale + edit рдирдВрддрд░, kubectl diff -f k8s/ рд░рд┐рдХрд╛рдорд╛ рдирд╕рд▓реЗрд▓рд╛ diff рдЫрд╛рдкрддреЗ (replicas 5 рд╡рд┐рд░реБрджреНрдз 2, рдЖрдгрд┐ рддреБрдордЪреЗ label). рдирд┐рд░рд╛рдЧрд╕ re-apply рдирдВрддрд░, kubectl -n gitops-school get deploy hello-school рдкреБрдиреНрд╣рд╛ 2/2 рд╡рд░ рдпреЗрддреЗ рдЖрдгрд┐ label рдЧрд╛рдпрдм рд╣реЛрддреЗ тАФ рдЖрдгрд┐ kubectl diff рдЖрддрд╛ рд░рд┐рдХрд╛рдорд╛ рдЕрд╕рддреЛ, рдЬрдгреВ hotfix рдХрдзреА рдЕрд╕реНрддрд┐рддреНрд╡рд╛рддрдЪ рдирд╡реНрд╣рддрд╛.

ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ

kubectl apply -f k8s/ рдЦреЛрд▓реА рдкреБрдиреНрд╣рд╛ file рдиреБрд╕рд╛рд░ рд▓рд╛рд╡рддреЗ. рдмрд╛рдХреА рдХрд╛рд╣реАрдЪ рдХрд╛рдврд╛рдпрдЪреЗ рдирд╛рд╣реА.

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: incident рджрд░рдореНрдпрд╛рди "рдлрдХреНрдд repo рдордзреВрди рдкреБрдиреНрд╣рд╛ deploy рдХрд░рд╛" рдХрд╛рд╣реАрддрд░реА рдореЛрдбрддреЗ, рдпрд╛рдЪреЗ рдкрд╣рд┐рд▓реНрдпрд╛ рдХреНрд░рдорд╛рдВрдХрд╛рдЪреЗ рдХрд╛рд░рдг drift рдЖрд╣реЗ. Reconcile loop рдирд╕рд▓реЗрд▓реНрдпрд╛ teams рдиреА рдирд┐рджрд╛рди CI рдордзреВрди рдард░рд▓реЗрд▓реНрдпрд╛ рд╡реЗрд│реА kubectl diff рдЪрд╛рд▓рд╡рд╛рд╡реЗ, рдореНрд╣рдгрдЬреЗ drift рджреБрд░реБрд╕реНрдд рдЭрд╛рд▓рд╛ рдирд╛рд╣реА рддрд░реА рджрд┐рд╕рддреЛ рддрд░реА.

тПня╕П рдкреБрдвреЗ

рдкрд╣рд┐рд▓рд╛ рдЙрдкрд╛рдп: рдорд╛рдгрд╕рд╛рдВрдирд╛ deploy рдХрд░реВрдЪ рджреЗрдК рдирдХрд╛. рдЖрддрд╛ рдпреЗрддреЛ courier robot тАФ рдПрдХ CI/CD pipeline.

git checkout lesson-03-cicd-push

ЁЯкС Lesson 02 тАФ Drift: when reality stops matching the files

ЁЯУН You are here: Lesson 02 of 12 ┬╖ Previous: lesson-01-deploy-by-hand ┬╖ Next: lesson-03-cicd-push


ЁЯУж What's in this branch

Lesson 01, plus the villain of this whole course: configuration drift тАФ the growing gap between what your YAML says and what the cluster actually runs. Every fix in Part 2 exists because of this lesson.

ЁЯзТ Explain like I'm 5

The classroom has a seating chart taped in the teacher's drawer ЁЯЧВя╕П тАФ who sits where, 2 plant-waterers, projector on the left.

But day by day, little things happen without updating the chart:

Three months later the chart says one thing, the room is completely different, and here's the scary part: ЁЯШ▒

The next time someone innocently "resets the room to the chart", they destroy every unrecorded fix at once тАФ and nobody remembers why the extra projector mattered.

That gap between chart and room is drift. It's not one big mistake тАФ it's a hundred tiny "just this once" edits that never got written down.

ЁЯЧ║я╕П Diagram

flowchart LR
    git["ЁЯУД YAML in git says<br/>replicas: 2<br/>image: v1<br/>limit: 64Mi"]
    cluster["ЁЯПл cluster actually runs<br/>replicas: 5 - Friday panic<br/>image: v2-hotfix-REAL<br/>limit: 512Mi - kubectl edit"]
    boom["ЁЯТе next 'clean' apply from git<br/>silently UNDOES every hotfix"]
    git <-. "1 hand-edits, 'just this once'<br/>2 never written back to git" .-> cluster
    cluster --> boom

тЭУ What

ЁЯдФ Why it matters

Drift is why "it worked in staging" lies, why disaster recovery fails ("just re-apply the repo!" тАФ the repo was 3 months stale), and why new teammates can't trust anything written down. Remember this feeling тАФ in lesson 09, ArgoCD will detect this exact situation in seconds and revert it.

ЁЯФз How (see it in this repo)

The demo Deployment declares replicas: 2 in k8s/deployment.yaml. You're about to make the live cluster disagree with that file тАФ congratulations, you'll have manufactured genuine drift in 10 seconds.

ЁЯзк Try it

# the file says replicas: 2 тАФ now vandalize reality:
kubectl -n gitops-school scale deployment hello-school --replicas=5
kubectl -n gitops-school edit deployment hello-school   # change something small, e.g. add a label

# your repo and your cluster now disagree. Would you have noticed?
kubectl diff -f k8s/ | head -30        # тЖР the honest mirror (run it BEFORE any apply!)

# the horror-movie moment тАФ an innocent teammate "deploys the repo":
kubectl apply -f k8s/
kubectl -n gitops-school get deploy    # replicas back to 2 тАФ your hotfix is GONE, silently

тЬЕ Verify тАФ what you should see

After the scale + edit, kubectl diff -f k8s/ prints a non-empty diff (replicas 5 vs 2, plus your label). After the innocent re-apply, kubectl -n gitops-school get deploy hello-school is back to 2/2 and the label is gone тАФ and kubectl diff is now empty, as if the hotfix never existed.

ЁЯз╣ Clean up

kubectl apply -f k8s/ puts the room back to the file. Nothing else to remove.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: drift is the number-one reason "just redeploy from the repo" breaks something during an incident. Teams without a reconcile loop should at least run kubectl diff from CI on a schedule, so drift is visible even if not fixed.

тПня╕П Next

First fix: stop humans from deploying at all. Enter the courier robot тАФ a CI/CD pipeline.

git checkout lesson-03-cicd-push
тЖР Previousdeploy by handNext тЖТcicd push

This page is the lesson's README from the lesson-02-drift-problem branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.