ЁЯУП рдзрдбрд╛ 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тАж
- тАжрдЖрдзреА рд╡рд┐рдЪрд╛рд░рддреЛ? тЬЛ ("manual sync") тАФ рдЦреЛрд▓реА рдЖрддрд╛ рдирд╡реНрдпрд╛ рдкрд╛рдирд╛рд╢реА рдЬреБрд│рдд рдирд╛рд╣реА рд╣реЗ рддреНрдпрд╛рдЪреНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдпреЗрддреЗ, рддреЛ рдкрд┐рд╡рд│рд╛ "OutOfSync" рдлрд▓рдХ рд▓рд╛рд╡рддреЛ, рдЖрдгрд┐ рддреБрдореНрд╣реА рд╣реЛрдХрд╛рд░ рджреЗрдИрдкрд░реНрдпрдВрдд рдерд╛рдВрдмрддреЛ (Sync click рдХрд░рд╛). рддреБрдордЪреНрдпрд╛ click рд╢рд┐рд╡рд╛рдп рдХрд╛рд╣реАрдЪ рдмрджрд▓рдд рдирд╛рд╣реА.
- тАжрд╕рд░рд│ рдХрд░реВрди рдЯрд╛рдХрддреЛ? тЪб ("automated sync") тАФ рд╡рд╣реА рдмрджрд▓рддрд╛рдХреНрд╖рдгреА рддреЛ рдЦреЛрд▓реА рджреБрд░реБрд╕реНрдд рдХрд░рддреЛ. рд╣реЛрдХрд╛рд░рд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА.
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
OutOfSync рд╣рд╛ рддреБрд▓рдиреЗрдЪрд╛ рдирд┐рдХрд╛рд▓ рдЖрд╣реЗ, error рдирд╛рд╣реА тАФ "рд╡рд╣реА тЙа рдЦреЛрд▓реА".
pruneрд╢рд┐рд╡рд╛рдп, git рдордзреВрди рдХрд╛рдврд▓реЗрд▓реЗ resources рдХрд╛рдпрдордЪреЗ рддрд╕реЗрдЪ рдкрдбреВрди рд░рд╛рд╣рддрд╛рдд (рдЖрдгрд┐ рдирдВрддрд░ рд╕рдЧрд│реНрдпрд╛рдВрдирд╛ рдЧреЛрдВрдзрд│рд╛рдд рдЯрд╛рдХрддрд╛рдд).selfHealрд╢рд┐рд╡рд╛рдп, drift рджрд┐рд╕рддреЛ рдкрдг рджреБрд░реБрд╕реНрдд рд╣реЛрдд рдирд╛рд╣реА тАФ рддрд░реАрд╣реА рднрд╛рдЧ 1 рдкреЗрдХреНрд╖рд╛ рд╣реЗ рдЪрд╛рдВрдЧрд▓реЗрдЪ, рдЬрд┐рдереЗ рддреЛ рдЕрджреГрд╢реНрдп рд╣реЛрддрд╛!рдЦрд╛рд╕ рдкреНрд░рд╕рдВрдЧрд╛рдВрд╕рд╛рдареА рд╕реБрдЯрдХреЗрдЪреЗ рдорд╛рд░реНрдЧ рдЖрд╣реЗрдд: sync рдХреНрд░рдорд╛рд╕рд╛рдареА annotations (waves/hooks) рдЖрдгрд┐ рдард░рд╛рд╡рд┐рдХ diffs рджреБрд░реНрд▓рдХреНрд╖рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА (рдЙрджрд╛. HPA рдЪреНрдпрд╛ рддрд╛рдмреНрдпрд╛рддреАрд▓ replica count тАФ рддреЗ field рддреБрдореНрд╣реА ignore рдХрд░рд╛рд▓). рддреЗ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗрдд рд╣реЗ рдорд╛рд╣реАрдд рдареЗрд╡рд╛; рд╕реБрд░реБрд╡рд╛рдд рддрд┐рдереВрди рдХрд░реВ рдирдХрд╛.
рдЕрдЬреВрди automate рдХрдзреА рдХрд░реВ рдирдпреЗ: repo рдордзреНрдпреЗ review рдХрд┐рдВрд╡рд╛ CI validation рдирд╛рд╣реА; app рдХрдбреЗ рдЕрд╕реЗ state рдЖрд╣реЗ рдЬреЗ рддреБрдореНрд╣реА рдкреБрдиреНрд╣рд╛ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА (prune рдЪреЗ рдХреНрд╖реЗрддреНрд░ тАФ git рдордзреВрди рдХрд╛рдврд▓реЗрд▓рд╛ PVC рдореНрд╣рдгрдЬреЗ data рдЧреЗрд▓рд╛); рдПрдЦрд╛рджрд╛ HPA рдХрд┐рдВрд╡рд╛ operator рдЕрд╕реЗ fields рд▓рд┐рд╣рд┐рддреЛ рдЬреЗ ArgoCD рд▓рд╛ ignore рдХрд░рд╛рдпрд▓рд╛ рддреБрдореНрд╣реА рд╕рд╛рдВрдЧрд┐рддрд▓реЗрд▓реЗ рдирд╛рд╣реА (selfHeal рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рднрд╛рдВрдбреЗрд▓); рдХрд┐рдВрд╡рд╛ OutOfSync рдХрд╕рд╛ рджрд┐рд╕рддреЛ рд╣реЗ рддреБрдореНрд╣реА рдЕрдЬреВрди рд╢рд┐рдХрдд рдЖрд╣рд╛рдд. Manual sync рд╣реЗ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЖрд╣реЗ, рдЕрдкрдпрд╢ рдирд╛рд╣реА.
ЁЯдФ рдиреЗрд╣рдореА рд╕рд░реНрд╡рд╛рдд рдХрд╛рдЯреЗрдХреЛрд░ рдХрд╛ рдирд╛рд╣реА?
рдХрд╛рд░рдг рдХрд╛рдЯреЗрдХреЛрд░рдкрдгрд╛ рдорд╛рдгрд╕рд╛рдВрдХрдбрдЪреА рд╕рддреНрддрд╛ рд╡рд╣реАрдХрдбреЗ рд╕реЛрдкрд╡рддреЛ тАФ рдЖрдгрд┐ рддреЗ рддреЗрд╡реНрд╣рд╛рдЪ рдЪрд╛рдВрдЧрд▓реЗ рдЬреЗрд╡реНрд╣рд╛ рд╡рд╣реА рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рдЕрд╕рддреЗ (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 рд╡реЗрдЧрд│реЗ рд╡рд╛рдЧрддреАрд▓. рдмрд╛рдХреА рдХрд╛рд╣реАрд╣реА рдХрд╛рдврд╛рдпрдЪреЗ рдирд╛рд╣реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рдЖрдзреА
pruneрдЪрд╛рд▓реВ рдХрд░рдгреЗ тАФ рдЬреЛ resource рддреБрдореНрд╣реА рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдореБрджреНрджрд╛рдо git рдордзреВрди рдХрд╛рдврд▓рд╛ рд╣реЛрддрд╛ рддреЛ рдЧрд╛рдпрдм рд╣реЛрддреЛ selfHealрдПрдЦрд╛рджреНрдпрд╛ HPA рд╢реА рдХрд┐рдВрд╡рд╛replicasрдХрд┐рдВрд╡рд╛ status fields рд▓рд┐рд╣рд┐рдгрд╛рд▒реНрдпрд╛ operator рд╢реА рднрд╛рдВрдбрддреЛ тАФignoreDifferencesрдЬреЛрдбрд╛ (рдзрдбрд╛ 09)OutOfSyncрд▓рд╛ error рд╕рдордЬреВрди kubectl рдиреЗ "рджреБрд░реБрд╕реНрдд" рдХрд░рдгреЗ тАФ рдЦрд░рд╛ рдЙрдкрд╛рдп рдореНрд╣рдгрдЬреЗ sync рдХрд┐рдВрд╡рд╛ commit- рд╡рд╣реАрд╡рд░ рдХреЛрдгрд╛рдЪрд╛рдЪ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╛рд╣реА рдореНрд╣рдгреВрди production app рдХрд╛рдпрдо manual sync рд╡рд░ рдареЗрд╡рдгреЗ тАФ review process рд╕реБрдзрд╛рд░рд╛, рдордЧ рдмрдЯрдг рдлрд┐рд░рд╡рд╛
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдмрд╣реБрддреЗрдХ 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