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

ЁЯУП рдзрдбрд╛ 08 тАФ Sync policies: robot рд╡рд╣реА рдХрд┐рддреА рдХрд╛рдЯреЗрдХреЛрд░рдкрдгреЗ рдкрд╛рд│рддреЛ

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 08 ┬╖ рдорд╛рдЧреАрд▓: lesson-07-first-application ┬╖ рдкреБрдвреАрд▓: lesson-09-self-heal-drift


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

рдзрдбреЗ 01тАУ07, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд robot рдЪреНрдпрд╛ рдЖрдЬреНрдЮрд╛рдкрд╛рд▓рдирд╛рдЪреНрдпрд╛ settings: manual рд╡рд┐рд░реБрджреНрдз automated sync, рдЖрдгрд┐ рдХрд╛рдЯреЗрдХреЛрд░рдкрдгрд╛рдЪреЗ рджреЛрди dials тАФ prune рдЖрдгрд┐ selfHeal.

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

рдкреНрд░рддреНрдпреЗрдХ рдХреЗрдЕрд░рдЯреЗрдХрд░ robot рд▓рд╛ рдШрд░рд╛рдЪреЗ рдирд┐рдпрдо ЁЯУП рд▓рд╛рдЧрддрд╛рдд. рддреБрдордЪреНрдпрд╛ robot рдХрдбреЗ рдПрдХ рдореЛрдареЗ рдмрдЯрдг рдЖрдгрд┐ рджреЛрди dials рдЖрд╣реЗрдд:

рдореЛрдареЗ рдмрдЯрдг тАФ рд╡рд╣реА рдмрджрд▓рд▓реА рдХреА robotтАж

Dial 1 тАФ prune ЁЯЧСя╕П: рд╡рд╣реАрддреВрди рдПрдХ рдкреЛрд╕реНрдЯрд░ рдХрд╛рдвреВрди рдЯрд╛рдХрд▓реЗ. robot рднрд┐рдВрддреАрд╡рд░рдЪреЗ рдЦрд░реЗ рдкреЛрд╕реНрдЯрд░ рдХрд╛рдвреВ рд╢рдХрддреЛ рдХрд╛? рдмрдВрдж = рддреЛ рдлрдХреНрдд рдирд╡реЗ рд▓рд╛рд╡рддреЛ/рдмрджрд▓рддреЛ, рдХрдзреАрдЪ рдХрд╛рдврдд рдирд╛рд╣реА (рд╕реБрд░рдХреНрд╖рд┐рдд, рдкрдг рдЕрдирд╛рде рд╡рд╕реНрддреВ рдорд╛рдЧреЗ рд░рд╛рд╣рддрд╛рдд). рдЪрд╛рд▓реВ = рд╡рд╣реАрдЪреЗрдЪ рдкреВрд░реНрдг рд░рд╛рдЬреНрдп тАФ рд╡рд╣реАрддреВрди рдЧреЗрд▓реЗ, рдЦреЛрд▓реАрддреВрдирд╣реА рдЧреЗрд▓реЗ.

Dial 2 тАФ selfHeal тЖйя╕П: рдПрдХрд╛ рдореБрд▓рд╛рдиреЗ (рд╡рд╣реАрдиреЗ рдирд╡реНрд╣реЗ!) рдЦреБрд░реНрдЪреНрдпрд╛ рд╣рд▓рд╡рд▓реНрдпрд╛. robot рддреНрдпрд╛ рдкрд░рдд рд▓рд╛рд╡реВ рд╢рдХрддреЛ рдХрд╛? рдмрдВрдж = рддреЛ рдлрдХреНрдд рдкрд┐рд╡рд│рд╛ рдлрд▓рдХ рд▓рд╛рд╡рддреЛ. рдЪрд╛рд▓реВ = рдЦреБрд░реНрдЪреНрдпрд╛ рдХрд╛рд╣реА рдорд┐рдирд┐рдЯрд╛рдВрдд рдкрд░рдд рдЬрд╛рдЧреЗрд╡рд░, рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА.

рд╢рд┐рдХрддрд╛рдирд╛ рд╕рдЧрд│реЗ рд╕реМрдореНрдп рдареЗрд╡реВрди рд╕реБрд░реБрд╡рд╛рдд рдХрд░рд╛. Production рдордзреНрдпреЗ рдЖрдзреА automated, рдордЧ selfHeal, рдордЧ prune рдЪрд╛рд▓реВ рдХрд░рд╛ тАФ рдЬрд╛рдгреАрд╡рдкреВрд░реНрд╡рдХ, рдПрдХрд╛ рд╡реЗрд│реА рдПрдХ dial, рд╕реБрд░рдХреНрд╖рд╛-рдЙрдкрд╛рдпрд╛рдВрд╕рд╣ (reviewed PRs, CI validation, рддрдкрд╛рд╕реВрди рдкрд╛рд╣рд┐рд▓реЗрд▓рд╛ backup). рд╡рд┐рд╢реЗрд╖рддрдГ prune рдЦрд░реЗ resources delete рдХрд░реВ рд╢рдХрддреЛ, рдореНрд╣рдгреВрди рддреНрдпрд╛рдЪрд╛ рдХреНрд░рдо рд╕рд░реНрд╡рд╛рдд рд╢реЗрд╡рдЯреА рдпреЗрддреЛ.

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

flowchart LR
    change["ЁЯУЦ change lands in git<br/>app goes OutOfSync ЁЯЯб"]
    manual["тЬЛ manual sync<br/>robot ASKS - you click Sync"]
    auto["тЪб automated sync<br/>robot ACTS on its own"]
    prune["ЁЯЧСя╕П prune: true<br/>deleted in git тЖТ deleted live"]
    heal["тЖйя╕П selfHeal: true<br/>hand-edits get reverted"]
    change -->|"1"| manual
    change -->|"2"| auto
    auto -.->|"3 dial"| prune
    auto -.->|"4 dial"| heal

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

syncPolicy:
  automated:          # omit this whole block = manual sync
    prune: true       # default false: never delete unless told
    selfHeal: true    # default false: report drift, don't revert it

ЁЯдФ рдиреЗрд╣рдореА рд╕рд░реНрд╡рд╛рдд рдХрд╛рдЯреЗрдХреЛрд░ рдХрд╛ рдирд╛рд╣реА?

рдХрд╛рд░рдг рдХрд╛рдЯреЗрдХреЛрд░рдкрдгрд╛ рдорд╛рдгрд╕рд╛рдВрдХрдбрдЪреА рд╕рддреНрддрд╛ рд╡рд╣реАрдХрдбреЗ рд╕реЛрдкрд╡рддреЛ тАФ рдЖрдгрд┐ рддреЗ рддреЗрд╡реНрд╣рд╛рдЪ рдЪрд╛рдВрдЧрд▓реЗ рдЬреЗрд╡реНрд╣рд╛ рд╡рд╣реА рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рдЕрд╕рддреЗ (reviewed PRs, CI validation). Teams рд╕рд╣рд╕рд╛ рд╣реА рд╢рд┐рдбреА рдЪрдврддрд╛рдд: manual тЖТ automated тЖТ +prune тЖТ +selfHeal, рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рдпрд░реАрд╡рд░ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдорд┐рд│рд╡рдд. Demo app рдЪреА application.yaml рдкреВрд░реНрдг рдХрд╛рдЯреЗрдХреЛрд░ рд╕реНрд╡рд░реВрдкрд╛рдд рдпреЗрддреЗ рдХрд╛рд░рдг рддреЗ рдЦреЗрд│рд╛рдЪреЗ рдореИрджрд╛рди рдЖрд╣реЗ тАФ рдЧреЛрд╖реНрдЯреА рдмрдВрдж рдХрд░реВрди рдлрд░рдХ рдЕрдиреБрднрд╡рд╛.

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

# A) feel MANUAL mode тАФ turn automation off:
kubectl -n argocd patch application hello-school --type merge \
  -p '{"spec":{"syncPolicy":null}}'
kubectl -n gitops-school scale deployment hello-school --replicas=3
kubectl -n argocd get application hello-school    # OutOfSync ЁЯЯб тАФ but nothing happens
# in the UI: yellow app, a diff view, and a Sync button waiting for your nod

# B) nod (sync it) via CLI or the UI button:
argocd app sync hello-school 2>/dev/null || echo "or click Sync in the UI"

# C) restore full strictness for the next lessons:
kubectl -n argocd patch application hello-school --type merge \
  -p '{"spec":{"syncPolicy":{"automated":{"prune":true,"selfHeal":true},"syncOptions":["CreateNamespace=true"]}}}'

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

Step A: syncPolicy рдХрд╛рдвреВрди 3 рдкрд░реНрдпрдВрдд scale рдХреЗрд▓реНрдпрд╛рд╡рд░, kubectl -n argocd get application hello-school OutOfSync рджрд╛рдЦрд╡рддреЗ рдЖрдгрд┐ рддрд╕реЗрдЪ рд░рд╛рд╣рддреЗ; UI рдордзреНрдпреЗ рдкрд┐рд╡рд│реА tile, replicas: 2 тЖТ 3 рдЕрд╕рд▓реЗрд▓рд╛ Diff view, рдЖрдгрд┐ рдПрдХ Sync рдмрдЯрдг рджрд┐рд╕рддреЗ. Step B: sync рдХреЗрд▓реНрдпрд╛рд╡рд░, Synced рдЖрдгрд┐ 2 pods. Step C: рдкреБрдиреНрд╣рд╛ рдкреВрд░реНрдг automated тАФ рдЖрдгрдЦреА рдПрдХрджрд╛ scale рдХрд░рд╛ рдЖрдгрд┐ рддреЗ рдкрд░рдд рдЙрд▓рдЯрддрд╛рдирд╛ рдкрд╛рд╣рд╛.

ЁЯз╣ рд╕реНрд╡рдЪреНрдЫрддрд╛

Step C рдЪрд╛рд▓рд▓рд╛ рдЖрд╣реЗ (automated + prune + selfHeal рдкрд░рдд рдЖрд▓реЗ) рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рд╛, рдирд╛рд╣реАрддрд░ рдзрдбреЗ 09тАУ10 рд╡реЗрдЧрд│реЗ рд╡рд╛рдЧрддреАрд▓. рдмрд╛рдХреА рдХрд╛рд╣реАрд╣реА рдХрд╛рдврд╛рдпрдЪреЗ рдирд╛рд╣реА.

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

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдмрд╣реБрддреЗрдХ teams automated + selfHeal рдЪрд╛рд▓рд╡рддрд╛рдд, рдЖрдгрд┐ рдПрдЦрд╛рджреНрдпрд╛ app рдЪреЗ рд╕рдЧрд│реЗ resources git рдордзреНрдпреЗ рдЖрд▓реНрдпрд╛рд╡рд░ рддреНрдпрд╛ app рд╕рд╛рдареА prune рдЬреЛрдбрддрд╛рдд; sync waves рдЖрдгрд┐ hooks sync рдЪрд╛ рдХреНрд░рдо рдард░рд╡рддрд╛рдд (CRDs рдЖрдгрд┐ namespaces рдЖрдзреА, migrations Deployments рдЪреНрдпрд╛ рдЖрдзреА). рд╢рд┐рдХрддрд╛рдирд╛ manual рдиреЗ рд╕реБрд░реБрд╡рд╛рдд рдХрд░рд╛; рдкреНрд░рддреНрдпреЗрдХ dial рдЬрд╛рдгреАрд╡рдкреВрд░реНрд╡рдХ, рд╕реБрд░рдХреНрд╖рд╛-рдЙрдкрд╛рдпрд╛рдВрд╕рд╣ рдЪрд╛рд▓реВ рдХрд░рд╛.

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

selfHeal рдЪрд╛рд▓реВ рдЕрд╕рддрд╛рдирд╛, robot рд╢реА рдЦрд░реАрдЦреБрд░реА рд▓рдврд╛рдИ рдХрд░реВрдпрд╛ тАФ рдЖрдгрд┐ рд╣рд░реВрдпрд╛, рдХрд╛рд╣реА рд╕реЗрдХрдВрджрд╛рдВрдд, live.

git checkout lesson-09-self-heal-drift

ЁЯУП Lesson 08 тАФ Sync policies: how strictly the robot follows the book

ЁЯУН You are here: Lesson 08 of 12 ┬╖ Previous: lesson-07-first-application ┬╖ Next: lesson-09-self-heal-drift


ЁЯУж What's in this branch

Lessons 01тАУ07, plus the robot's obedience settings: manual vs automated sync, and the two strictness dials тАФ prune and selfHeal.

ЁЯзТ Explain like I'm 5

Every caretaker robot needs house rules ЁЯУП. Yours has one big switch and two dials:

The big switch тАФ when the book changes, does the robotтАж

Dial 1 тАФ prune ЁЯЧСя╕П: a poster was removed from the book. May the robot take the real poster off the wall? Off = it only adds/updates, never removes (safe but leaves orphans). On = the book fully rules тАФ gone from the book, gone from the room.

Dial 2 тАФ selfHeal тЖйя╕П: a kid (not the book!) moved the chairs. May the robot move them back? Off = it just hangs the yellow sign. On = chairs go back within minutes, every time.

Start with everything gentle while learning. In production, turn on automated, then selfHeal, then prune тАФ deliberately, one dial at a time, with safeguards (reviewed PRs, CI validation, a backup you have tested). Prune in particular can delete real resources, so it earns its place last.

ЁЯЧ║я╕П Diagram

flowchart LR
    change["ЁЯУЦ change lands in git<br/>app goes OutOfSync ЁЯЯб"]
    manual["тЬЛ manual sync<br/>robot ASKS - you click Sync"]
    auto["тЪб automated sync<br/>robot ACTS on its own"]
    prune["ЁЯЧСя╕П prune: true<br/>deleted in git тЖТ deleted live"]
    heal["тЖйя╕П selfHeal: true<br/>hand-edits get reverted"]
    change -->|"1"| manual
    change -->|"2"| auto
    auto -.->|"3 dial"| prune
    auto -.->|"4 dial"| heal

тЭУ What

syncPolicy:
  automated:          # omit this whole block = manual sync
    prune: true       # default false: never delete unless told
    selfHeal: true    # default false: report drift, don't revert it

ЁЯдФ Why not always strictest?

Because strictness transfers power from humans to the book тАФ which is only good once the book is trustworthy (reviewed PRs, CI validation). Teams usually walk the ladder: manual тЖТ automated тЖТ +prune тЖТ +selfHeal, gaining confidence at each rung. The demo app's application.yaml ships fully strict because it's a playground тАФ flip things off and feel the difference.

ЁЯзк Try it

# A) feel MANUAL mode тАФ turn automation off:
kubectl -n argocd patch application hello-school --type merge \
  -p '{"spec":{"syncPolicy":null}}'
kubectl -n gitops-school scale deployment hello-school --replicas=3
kubectl -n argocd get application hello-school    # OutOfSync ЁЯЯб тАФ but nothing happens
# in the UI: yellow app, a diff view, and a Sync button waiting for your nod

# B) nod (sync it) via CLI or the UI button:
argocd app sync hello-school 2>/dev/null || echo "or click Sync in the UI"

# C) restore full strictness for the next lessons:
kubectl -n argocd patch application hello-school --type merge \
  -p '{"spec":{"syncPolicy":{"automated":{"prune":true,"selfHeal":true},"syncOptions":["CreateNamespace=true"]}}}'

тЬЕ Verify тАФ what you should see

Step A: after removing syncPolicy and scaling to 3, kubectl -n argocd get application hello-school shows OutOfSync and stays that way; the UI shows a yellow tile, a Diff view with replicas: 2 тЖТ 3, and a Sync button. Step B: after syncing, Synced and 2 pods. Step C: fully automated again тАФ scale once more and watch it revert.

ЁЯз╣ Clean up

Make sure step C ran (automated + prune + selfHeal restored) or lessons 09тАУ10 behave differently. Nothing else to remove.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: most teams run automated + selfHeal, and add prune per app once all of its resources are in git; sync waves and hooks order the sync (CRDs and namespaces first, migrations before Deployments). Start manual while learning; turn each dial on deliberately, with safeguards.

тПня╕П Next

With selfHeal on, let's have a proper fight with the robot тАФ and lose, in seconds, live.

git checkout lesson-09-self-heal-drift
тЖР Previousfirst applicationNext тЖТself heal drift

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