ЁЯУЪ рдзрдбрд╛ 11 тАФ Helm, Kustomize рдЖрдгрд┐ environments: рдПрдХ recipe, рдЕрдиреЗрдХ рд╡рд░реНрдЧрдЦреЛрд▓реНрдпрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 11 ┬╖ рдорд╛рдЧреАрд▓: lesson-10-rollback-history ┬╖ рдкреБрдвреАрд▓: lesson-12-secrets-and-compare
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ10, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд GitOps рдПрдХрд╛ namespace рдордзрд▓реНрдпрд╛ рдПрдХрд╛ app рдЪреНрдпрд╛ рдкрд▓реАрдХрдбреЗ рдХрд╕реЗ рд╡рд╛рдврддреЗ: templates (Helm / Kustomize), рдкреНрд░рддреНрдпреЗрдХ environment рдЪреНрдпрд╛ values, рдЖрдгрд┐ app-of-apps pattern.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│реЗрдд рдЖрддрд╛ рддреАрди рд╡рд░реНрдЧрдЦреЛрд▓реНрдпрд╛ рдЖрд╣реЗрдд рдЬреНрдпрд╛ рдЬрд╡рд│рдЬрд╡рд│ рд╕рд╛рд░рдЦреНрдпрд╛ рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реНрдпрд╛рдд: рд╕рд░рд╛рд╡рд╛рдЪреА рдЦреЛрд▓реА (dev), рд░рдВрдЧреАрдд рддрд╛рд▓рдореАрдЪреА рдЦреЛрд▓реА (staging), рдЖрдгрд┐ рдореЛрдард╛ рд░рдВрдЧрдордВрдЪ (prod). ЁЯЪкЁЯЪкЁЯЪк
рдЖрд░рд╛рдЦрдбреНрдпрд╛рдЪрд╛ рдЕрдзреНрдпрд╛рдп рддреАрдирджрд╛ copy рдХрд░рдгреЗ рд╣рд╛ рд╕рд╛рдкрд│рд╛ рдЖрд╣реЗ тАФ рдПрдХрд╛ copy рдордзрд▓реА рдЯрд╛рдпрдкрд┐рдВрдЧрдЪреА рдЪреВрдХ рджреБрд░реБрд╕реНрдд рдХрд░рд╛, рдмрд╛рдХреА рджреЛрди рд╡рд┐рд╕рд░рд╛, рдЖрдгрд┐ рдЦреЛрд▓реНрдпрд╛ рд╣рд│реВрд╣рд│реВ рдПрдХрдореЗрдХрд╛рдВрд╢реА рдЕрд╕рд╣рдордд рд╣реЛрддрд╛рдд (copy-paste drift!).
рддреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЪрд╛рдВрдЧрд▓реЗ: рд░рд┐рдХрд╛рдореНрдпрд╛ рдЬрд╛рдЧрд╛ рдЕрд╕рд▓реЗрд▓реА рдПрдХ recipe рд▓рд┐рд╣рд╛ ЁЯУЪ:
"___ рдЦреБрд░реНрдЪреНрдпрд╛, projector: ___, posters: ___"
тАжрдЖрдгрд┐ рддреАрди рдЫреЛрдЯреА рднрд░рд╛рдпрдЪреА рдкрд╛рдиреЗ: рд╕рд░рд╛рд╡рд╛рдЪреА рдЦреЛрд▓реА = 1 рдЦреБрд░реНрдЪреА; рддрд╛рд▓реАрдо = 2; рдореЛрдард╛ рд░рдВрдЧрдордВрдЪ = 5 рдЦреБрд░реНрдЪреНрдпрд╛ + рдЭрдЧрдордЧреАрдд рджрд┐рд╡реЗ. рдПрдХ recipe, рддреАрди рднрд░рд▓реЗрд▓реА рдкрд╛рдиреЗ, рддреАрди рдЦреЛрд▓реНрдпрд╛. Recipe рдПрдХрджрд╛ рджреБрд░реБрд╕реНрдд рдХрд░рд╛ тЖТ рддрд┐рдиреНрд╣реА рдЦреЛрд▓реНрдпрд╛ рд╕реБрдзрд╛рд░рддрд╛рдд.
- Helm = рд░рд┐рдХрд╛рдореНрдпрд╛ рдЬрд╛рдЧрд╛ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ recipes (
{{ .Values.replicas }}) + values files. - Kustomize = рдПрдХ рдкреВрд░реНрдг рдирдореБрдирд╛ рдЦреЛрд▓реА (base) + рдЫреЛрдЯреА "рдлрд░рдХрд╛рдВрдЪреА" рдкрд╛рдиреЗ (overlays: "base рд╕рд╛рд░рдЦреАрдЪ, рдкрдг 5 рдЦреБрд░реНрдЪреНрдпрд╛").
рдЖрдгрд┐ рдЬреЗрд╡реНрд╣рд╛ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рджрд╣рд╛ apps ├Ч рддреАрди рдЦреЛрд▓реНрдпрд╛ рдЕрд╕рддрд╛рдд? рдЗрддрд░ рдкрд╛рдирд╛рдВрдЪреА рдпрд╛рджреА рдХрд░рдгрд╛рд░реЗ рдПрдХ рдореБрдЦреНрдп
рдкрд╛рди рд▓рд┐рд╣рд╛ ЁЯУЦ тАФ рдЕрд╕реЗ Application рдЬреНрдпрд╛рдЪреНрдпрд╛ рдЕрдзреНрдпрд╛рдпрд╛рдд рдЖрдгрдЦреА
Application files рдЖрд╣реЗрдд. Robot рдЪреНрдпрд╛ рд╣рд╛рддрд╛рдд рдПрдХрдЪ рдкрд╛рди рджреНрдпрд╛; рдмрд╛рдХреАрдЪреА рддреЛ рд╕реНрд╡рддрдГ рд╢реЛрдзрддреЛ.
рд╣реЗрдЪ app-of-apps тАФ рд╕рдВрдкреВрд░реНрдг platforms рдПрдХрд╛рдЪ
kubectl apply рдордзреВрди рдХрд╕реЗ рдЙрднреЗ рд░рд╛рд╣рддрд╛рдд.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
recipe["ЁЯУЪ one recipe<br/>Helm chart / Kustomize base<br/>replicas: ___ image: ___"]
dev["ЁЯУЭ values-dev<br/>replicas: 1"]
stg["ЁЯУЭ values-staging<br/>replicas: 2"]
prod["ЁЯУЭ values-prod<br/>replicas: 5 + HPA"]
rdev["ЁЯЪк dev room"]
rstg["ЁЯЪк staging room"]
rprod["ЁЯЪк prod room"]
master["ЁЯУЦ app-of-apps<br/>one page lists all pages"]
recipe -->|"1"| dev --> rdev
recipe --> stg --> rstg
recipe --> prod --> rprod
master -.->|"2 one Application each"| rdev
master -.-> rstg
master -.-> rprod
тЭУ рдХрд╛рдп
- ArgoCD sources рд╕реНрд╡рддрдГрдЪ render рдХрд░рддреЛ: рд╕рд╛рдзреЗ YAML (рдЖрдкрдг рд╡рд╛рдкрд░рд▓реЗ рддреЗ), Helm
(
source.helm.valueFiles), Kustomize (path:рдПрдЦрд╛рджреНрдпрд╛ overlay рдХрдбреЗ рд╡рд│рд╡рд╛). Application рдЪрд╛ рдЖрдХрд╛рд░ рддреЛрдЪ, рдЕрдзреНрдпрд╛рдпрд╛рдЪрд╛ format рд╡реЗрдЧрд│рд╛. - рдкреНрд░рддреНрдпреЗрдХ env рдордзрд▓реЗ promotion рд╣реА git рдЪреА рдХреНрд░рд┐рдпрд╛ рдмрдирддреЗ:
values-staging.yamlрдордзреНрдпреЗ image tag рд╡рд╛рдврд╡рд╛, test рдХрд░рд╛, рдордЧ рддреЛрдЪ рдмрджрд▓values-prod.yamlрдордзреНрдпреЗ PR рдиреЗ рдЖрдгрд╛. Environments рдордзрд▓рд╛ рдлрд░рдХ git рдордзреНрдпреЗ рд╡рд╛рдЪрддрд╛ рдпреЗрддреЛ. - App-of-apps: Application manifests рдЪреНрдпрд╛ folder рдХрдбреЗ рдирд┐рд░реНрджреЗрд╢ рдХрд░рдгрд╛рд░реЗ рдПрдХ Application. Folder рдордзреВрди рдПрдЦрд╛рджреЗ leaf app delete рдХрд░рд╛ тЖТ (prune рд╕рд╣) рддреЗ cluster рдордзреВрди рдирд╛рд╣реАрд╕реЗ рд╣реЛрддреЗ. рдПрдХ рдкрд╛рди рд╕рдЧрд│реНрдпрд╛рдВрд╡рд░ рд░рд╛рдЬреНрдп рдХрд░рддреЗ.
- (рдЖрдзреБрдирд┐рдХ рднрд╛рд╡рдВрдб: ApplicationSets lists/clusters/PRs рд╡рд░реВрди Applications рддрдпрд╛рд░ рдХрд░рддрд╛рдд тАФ app-of-apps рд╕рдордЬрд▓реНрдпрд╛рд╡рд░ рддреНрдпрд╛рдЪреА рдУрд│рдЦ рдХрд░реВрди рдШреНрдпрд╛.)
ЁЯдФ рдХрд╛
Copy-paste рдореБрд│реЗрдЪ config рд╕рдбрддреЗ. Templates + рдкреНрд░рддреНрдпреЗрдХ env рдЪреЗ рдЫреЛрдЯреЗ diffs рд╣реЗрддреВ ("prod рдореНрд╣рдгрдЬреЗ base + 5 replicas + HPA") рд╡рд╛рдЪрддрд╛ рдпреЗрдИрд▓ рдЖрдгрд┐ review рдХрд░рддрд╛ рдпреЗрдИрд▓ рдЕрд╕рд╛ рдареЗрд╡рддрд╛рдд. рдЖрдгрд┐ app-of-apps рдореНрд╣рдгрдЬреЗ рд╕рдВрдкреВрд░реНрдг platform рдЪреЗ disaster recovery рдЗрддрдХреЗрдЪ: ArgoCD install рдХрд░рд╛, рдПрдХ file apply рдХрд░рд╛, рдерд╛рдВрдмрд╛. тШХ
тЬЕ рдЦрдбреНрдбрд╛ 3 рдмреБрдЬрд▓рд╛. рджрд╣рд╛ clusters рдореНрд╣рдгрдЬреЗ рдЖрддрд╛ CI рдордзреНрдпреЗ рджрд╣рд╛ keys рдирд╛рд╣реАрдд: рдкреНрд░рддреНрдпреЗрдХ cluster рддреНрдпрд╛рдЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ robot рдЪрд╛рд▓рд╡рддреЛ рдЬреЛ рддреАрдЪ рд╡рд╣реА pull рдХрд░рддреЛ (рдХрд┐рдВрд╡рд╛ рдПрдХрдЪ robot рдЕрдиреЗрдХ рд╕рд╛рдВрднрд╛рд│рддреЛ тАФ рдзрдбрд╛ 06 рдордзрд▓реА рддрдбрдЬреЛрдб), рдЖрдгрд┐ app-of-apps рдореБрд│реЗ рдирд╡рд╛ cluster рдЖрдгрдЦреА рдПрдХрд╛ pipeline рдиреЗ рдирд╡реНрд╣реЗ, рддрд░ рдПрдХрд╛ file рдордзреВрди рдЙрднрд╛ рд░рд╛рд╣рддреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдЪрд╛ рдПрдХ Kustomize рдЖрд░рд╛рдЦрдбрд╛)
k8s/
тФЬтФАтФА base/ # the recipe: deployment + service + ns
тФВ тФФтФАтФА kustomization.yaml
тФФтФАтФА overlays/
тФЬтФАтФА dev/kustomization.yaml # replicas: 1
тФФтФАтФА prod/kustomization.yaml # replicas: 5
рджреЛрди Applications, path: k8s/overlays/dev рд╡рд┐рд░реБрджреНрдз
.../prod рдЖрдгрд┐ destination namespace рд╕реЛрдбреВрди рдЕрдЧрджреА рд╕рд╛рд░рдЦреА. (рд╣реЗ course рдЪрд╛ рдШрд░реА рдХрд░рд╛рдпрдЪрд╛
рд╕рд░рд╛рд╡ рдореНрд╣рдгреВрди рдареЗрд╡рд▓реЗ рдЖрд╣реЗ тАФ рд▓рд╛рдЧрдгрд╛рд░реЗ рдкреНрд░рддреНрдпреЗрдХ tool рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЖрд╣реЗ.)
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (2 рдорд┐рдирд┐рдЯрд╛рдВрдд Kustomize рдЕрдиреБрднрд╡рд╛, ArgoCD рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА)
mkdir -p /tmp/kdemo/base /tmp/kdemo/prod
cp k8s/deployment.yaml k8s/service.yaml /tmp/kdemo/base/
printf 'resources: [deployment.yaml, service.yaml]\n' > /tmp/kdemo/base/kustomization.yaml
printf 'resources: ["../base"]\nreplicas: [{name: hello-school, count: 5}]\n' > /tmp/kdemo/prod/kustomization.yaml
kubectl kustomize /tmp/kdemo/base | grep replicas # тЖТ 2 (the recipe)
kubectl kustomize /tmp/kdemo/prod | grep replicas # тЖТ 5 (base + one fill-in line!)
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
kubectl kustomize /tmp/kdemo/base | grep replicas тЖТ replicas: 2; /prod рд╕рд╛рдареА рддрд╕реЗрдЪ тЖТ replicas: 5. Prod overlay рдлрдХреНрдд рджреЛрди рдУрд│реАрдВрдЪрд╛ рдЖрд╣реЗ; рдмрд╛рдХреА рд╕рдЧрд│реЗ recipe рдордзреВрди рд╡рд╛рд░рд╕рд╛ рдореНрд╣рдгреВрди рдпреЗрддреЗ.
ЁЯз╣ рд╕реНрд╡рдЪреНрдЫрддрд╛
rm -rf /tmp/kdemo. Cluster рд╡рд░ рдХрд╛рд╣реАрд╣реА apply рдХреЗрд▓реЗ рдирд╡реНрд╣рддреЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- "рд╕рдзреНрдпрд╛рдкреБрд░рддреЗ" рдореНрд╣рдгреВрди рдкреНрд░рддреНрдпреЗрдХ environment рд╕рд╛рдареА manifest folder copy-paste рдХрд░рдгреЗ тАФ рдорд╣рд┐рдиреНрдпрд╛рднрд░рд╛рдд copies рдПрдХрдореЗрдХрд╛рдВрдкрд╛рд╕реВрди drift рд╣реЛрддрд╛рдд
- рдкреНрд░рддреНрдпреЗрдХ environment рд╕рд╛рдареА рдПрдХ git branch тАФ promotion рдореНрд╣рдгрдЬреЗ merge-conflicts рдЪреЗ рдпрдВрддреНрд░ рдмрдирддреЗ; рдПрдХрд╛рдЪ branch рд╡рд░ folders/overlays рд╡рд╛рдкрд░рд╛
- рдкреНрд░рддреНрдпреЗрдХ child commit рд╣реЛрдгреНрдпрд╛рдЖрдзреАрдЪ parent рд╡рд░
prune: trueрдЕрд╕рд▓реЗрд▓реЗ app-of-apps тАФ commit рди рдЭрд╛рд▓реЗрд▓реЗ child delete рд╣реЛрддреЗ - secrets рдЕрд╕рд▓реЗрд▓реНрдпрд╛ Helm values files (рдзрдбрд╛ 12)
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдЦрд░реЗ platforms рдореНрд╣рдгрдЬреЗ Kustomize overlays рд╡рд░ (рдХрд┐рдВрд╡рд╛ рдкреНрд░рддреНрдпреЗрдХ environment рдЪреНрдпрд╛ values рдЕрд╕рд▓реЗрд▓реНрдпрд╛ Helm charts рд╡рд░) app-of-apps рдХрд┐рдВрд╡рд╛ ApplicationSets, рдЖрдгрд┐ рдПрдХ tag рдмрджрд▓рдгрд╛рд▒реНрдпрд╛ PRs рдиреЗ promotion. рдордЧ рд╕рдВрдкреВрд░реНрдг cluster рдЪреА desired state рдлрдХреНрдд рдПрдХрд╛
git cloneрдЪреНрдпрд╛ рдЕрдВрддрд░рд╛рд╡рд░ рдЕрд╕рддреЗ тАФ disaster-recovery plan рдореНрд╣рдгрдЬреЗkubectl apply -f root-app.yaml.
тПня╕П рдкреБрдвреЗ
рд╢реЗрд╡рдЯрдЪрд╛ рдПрдХ рдбреНрд░реЕрдЧрди: secrets тАФ рдПрдХрдореЗрд╡ рдЧреЛрд╖реНрдЯ рдЬреА рд╡рд╣реАрдд рдЙрдШрдбрдкрдгреЗ рд░рд╛рд╣рддрд╛ рдХрд╛рдорд╛ рдирдпреЗ тАФ рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд рд╢реЗрд╡рдЯрдЪреЗ push-рд╡рд┐рд░реБрджреНрдз-pull рдЧреБрдгрдкрддреНрд░рдХ.
git checkout lesson-12-secrets-and-compare