ЁЯОТ рдзрдбрд╛ 01 тАФ рд╣рд╛рддрд╛рдиреЗ deploy: рддреБрдореНрд╣реАрдЪ deploy system рдЖрд╣рд╛рдд
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 01 ┬╖ рдкреБрдвреЗ: lesson-02-drift-problem
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕рдЪреА рд╕реБрд░реБрд╡рд╛рдд: demo app рдкреНрд░рддреНрдпреЗрдХрдЬрдг рдЬрд╕рд╛ рд╕реБрд░реБрд╡рд╛рдд рдХрд░рддреЛ рддрд╕рд╛ deploy рдХрд░рдгреЗ тАФ рд╣рд╛рддрд╛рдиреЗ, kubectl рд╡рд╛рдкрд░реВрди, рддреБрдордЪреНрдпрд╛ laptop рд╡рд░реВрди. рддреЗ рдЪрд╛рд▓рддреЗ! рдЖрдгрд┐ рд╣рд╛ рдзрдбрд╛ рд╕рдВрдкреЗрдкрд░реНрдпрдВрдд рддреБрдореНрд╣рд╛рд▓рд╛ рдиреЗрдордХреЗ рджрд┐рд╕реЗрд▓ рдХреА рддреЗ рдЕрд╕реЗрдЪ рдХрд╛ рд░рд╛рд╣реВ рд╢рдХрдд рдирд╛рд╣реА. рдЦрд▒реНрдпрд╛ files:
- k8s/ тАФ demo app: namespace + deployment (2 pods) + service
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рддреБрдореНрд╣рд╛рд▓рд╛ рдЧреГрд╣рдкрд╛рда рдЬрдорд╛ рдХрд░рд╛рдпрдЪрд╛ рдЖрд╣реЗ. рдореНрд╣рдгреВрди рддреБрдореНрд╣реА рддреЛ рд╕реНрд╡рддрдГ рд╢рд╛рд│реЗрдд рдШреЗрдКрди рдЬрд╛рддрд╛ ЁЯОТ тАФ рдЖрдд рдЬрд╛рддрд╛, рд╢рд┐рдХреНрд╖рд┐рдХреЗрдЪреНрдпрд╛ рдЯреЗрдмрд▓рд╛рд╡рд░ рдареЗрд╡рддрд╛, рдЭрд╛рд▓реЗ. рдЕрдЧрджреА рдареАрдХ!
рдЖрддрд╛ рдХрд▓реНрдкрдирд╛ рдХрд░рд╛ рдХреА рд╣реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╖рдпрд╛рд╕рд╛рдареА, рд░реЛрдЬ, рд╕рдВрдкреВрд░реНрдг рд╡рд░реНрдЧрд╛рд╕рд╛рдареА рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ, рдХрд╛рд░рдг рдХрд╕реЗ рдХреЛрдг рдЬрд╛рдгреЗ рддреБрдореНрд╣реАрдЪ рдЧреГрд╣рдкрд╛рда рдкреЛрд╣реЛрдЪрд╡рдгрд╛рд░реЗ рдореВрд▓ рдмрдирд▓рд╛ рдЖрд╣рд╛рдд:
- рддреБрдореНрд╣реА рдЖрдЬрд╛рд░реА рдкрдбрд▓рд╛рдд? ЁЯдТ рдХрд╛рд╣реАрдЪ рдкреЛрд╣реЛрдЪрдд рдирд╛рд╣реА.
- рддреБрдореНрд╣реА рдПрдХ рд╡рд╣реА рд╡рд┐рд╕рд░рд▓рд╛рдд? рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рдУрд░рдбреЗрдкрд░реНрдпрдВрдд рдХреЛрдгрд╛рдЪреНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдпреЗрдд рдирд╛рд╣реА.
- рддреБрдордЪрд╛ рдорд┐рддреНрд░рд╣реА рдХрд╛рд╣реА рдЧреГрд╣рдкрд╛рда, рд╡реЗрдЧрд│реНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ, рдкреЛрд╣реЛрдЪрд╡рддреЛ? рдЖрддрд╛ рдХрд╛рдп рдЬрдорд╛ рдЭрд╛рд▓реЗ рдпрд╛рдмрджреНрджрд▓ рджреЛрди рд▓реЛрдХрд╛рдВрдЪреНрдпрд╛ рдЖрдард╡рдгреА рдЬреБрд│рдд рдирд╛рд╣реАрдд.
- рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рд╡рд┐рдЪрд╛рд░рддреЗ "рд╣реЗ рдХрдзреА рдЬрдорд╛ рдЭрд╛рд▓реЗ, рдЖрдгрд┐ рдХреЛрдгреА рдХреЗрд▓реЗ?" тАФ рддреБрдордЪреЗ рдЙрддреНрддрд░ рдореНрд╣рдгрдЬреЗ рдлрдХреНрдд рдЦрд╛рдВрджреЗ рдЙрдбрд╡рдгреЗ. ЁЯд╖
рд╣рд╛рддрд╛рдиреЗ рдкреЛрд╣реЛрдЪрд╡рдгреЗ рдЪреБрдХреАрдЪреЗ рдирд╛рд╣реА тАФ рддреНрдпрд╛рддреВрдирдЪ рддреБрдореНрд╣реА рд░рд╕реНрддрд╛ рд╢рд┐рдХрддрд╛. рдкрдг рд╢реЗрд╡рдЯреА рд╣рд╛ рд░рд╕реНрддрд╛ рддреБрдордЪреНрдпрд╛рд╢рд┐рд╡рд╛рдп рдЪрд╛рд▓рд╛рдпрд▓рд╛ рд╣рд╡рд╛.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
you["ЁЯзСтАНЁЯТ╗ your laptop<br/>YAML + kubeconfig ЁЯФС"]
cluster["ЁЯПл cluster<br/>ЁЯкСЁЯкС hello-school pods"]
later["ЁЯУЕ one week later<br/>тЭУ which version is live?<br/>тЭУ who changed what?<br/>ЁЯШ▒ only your memory knows"]
you -->|"1 kubectl apply -f k8s/"| cluster
cluster -.->|"2 works today! ЁЯОЙ"| later
тЭУ рдХрд╛рдп
kubectl apply -fрддреБрдордЪреЗ local YAML cluster рдЪреНрдпрд╛ API server рд▓рд╛ рдкрд╛рдард╡рддреЗ тАФ рд╣рд╛ рдПрдХ manual, push-style deploy рдЖрд╣реЗ, рдЬреНрдпрд╛рдд "pipeline" рдореНрд╣рдгрдЬреЗ рддреБрдордЪреА рдмреЛрдЯреЗ.- Deploy рдЪреА "рдиреЛрдВрдж" рдореНрд╣рдгрдЬреЗ рддреБрдордЪреА shell history. Rollback рдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛ рдореНрд╣рдгрдЬреЗ рддреБрдордЪреА рдЖрдард╡рдг.
- рд╢рд┐рдХрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдкреНрд░рдпреЛрдЧрд╛рдВрд╕рд╛рдареА рд╣реЗ 100% рдареАрдХ рдЖрд╣реЗ тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рдиреЗ рдЕрд╢реАрдЪ рд╕реБрд░реБрд╡рд╛рдд рдХрд░рд╛рдпрд▓рд╛ рд╣рд╡реА, рдореНрд╣рдгрдЬреЗ рдкреБрдврдЪреЗ automation рдЬрд╛рджреВ рд╡рд╛рдЯрдгрд╛рд░ рдирд╛рд╣реА.
ЁЯдФ рдХрд╛ (рд╣рд╛ рдзрдбрд╛ рдХрд╛ рдЖрд╣реЗ)
ArgoCD рдкрд╛рд╕реВрдирдЪ рд╕реБрд░реБрд╡рд╛рдд рдХрд░реВрди рддреБрдореНрд╣рд╛рд▓рд╛ ArgoCD рдЪреА рдХрд┐рдВрдордд рдХрд│рдгрд╛рд░ рдирд╛рд╣реА тАФ рддреБрдореНрд╣реА рдлрдХреНрдд рдПрдЦрд╛рджрд╛ рд╡рд┐рдзреА рдкрд╛рд│рдд рд░рд╛рд╣рд╛рд▓. рд╣рд╛ рдХреЛрд░реНрд╕ рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрд╛рдп рднреЗрдЯрдгреНрдпрд╛рдЖрдзреА рддреНрдпрд╛рдЪреА рд╕рдорд╕реНрдпрд╛ рдЕрдиреБрднрд╡рд╛рдпрд▓рд╛ рд▓рд╛рд╡рддреЛ: рдзрдбрд╛ 02 рдореВрдХ рдорд╛рд░реЗрдХрд░реА (drift) рджрд╛рдЦрд╡рддреЛ, рдзрдбрд╛ 03 рдкреЛрд╣реЛрдЪрд╡рдгреЗ automate рдХрд░рддреЛ, рдзрдбрд╛ 04 рджрд╛рдЦрд╡рддреЛ рдХреА рдЕрдЬреВрдирд╣реА рдХрд╛рдп рддреБрдЯрд▓реЗрд▓реЗ рдЖрд╣реЗ, рдЖрдгрд┐ рднрд╛рдЧ 2 рддреЗ рдиреАрдЯ рджреБрд░реБрд╕реНрдд рдХрд░рддреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
Demo app рдореБрджреНрджрд╛рдо рдЕрдЧрджреА рдЫреЛрдЯреЗ рдареЗрд╡рд▓реЗ рдЖрд╣реЗ тАФ nginxdemos/hello:plain-text рдЪрд╛рд▓рд╡рдгрд╛рд░реЗ
рдПрдХ Deployment (рддреЗ рддреНрдпрд╛рдЪреНрдпрд╛ pod рдЪреНрдпрд╛ рдирд╛рд╡рд╛рдиреЗ рдЙрддреНрддрд░ рджреЗрддреЗ, рдореНрд╣рдгрдЬреЗ рдХреЛрдгрддреНрдпрд╛ pod рдиреЗ
рдЙрддреНрддрд░ рджрд┐рд▓реЗ рддреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рджрд┐рд╕рддреЗ), рдПрдХ Service, рдПрдХ namespace. рдХреБрдареЗрд╣реА placeholders рдирд╛рд╣реАрдд тАФ
k8s/ рдордзрд▓реЗ рд╕рдЧрд│реЗ рдХреЛрдгрддреНрдпрд╛рд╣реА local cluster рд╡рд░ рдЬрд╕реЗрдЪреНрдпрд╛ рддрд╕реЗ apply рд╣реЛрддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
# any local cluster: Docker Desktop's Kubernetes, minikube start, or kind
kubectl apply -f k8s/
kubectl -n gitops-school get pods # 2 pods
# see WHICH pod answers (run it a few times тАФ the name changes!):
kubectl -n gitops-school run t --rm -it --image=curlimages/curl --restart=Never \
-- curl -s http://hello-school
# now the uncomfortable questions:
kubectl -n gitops-school get deploy hello-school -o jsonpath='{.spec.template.spec.containers[0].image}'
# ...is that what YOU think is deployed? what would your teammate say?
history | grep "kubectl apply" | tail -3 # тЖР this is your entire audit trail ЁЯШм
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
kubectl -n gitops-school get deploy,svc,pods
тЖТ hello-school 2/2 READY рдЖрд╣реЗ, рдПрдХ ClusterIP Service, рджреЛрди Running pods. рдордЧ kubectl -n gitops-school port-forward deploy/hello-school 8080:80 рдЪрд╛рд▓рд╡рд╛ рдЖрдгрд┐ curl localhost:8080 pod рдЪреНрдпрд╛ рдирд╛рд╡рд╛рд╕рд╣ hello page рдЫрд╛рдкрддреЗ.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ
рдЕрдЬреВрди рдХрд╛рд╣реАрдЪ рдХрд╛рдврд╛рдпрдЪреЗ рдирд╛рд╣реА тАФ рдзрдбреЗ 02тАУ04 рд╣реЗрдЪ deployment рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рддрд╛рдд. рдЗрдереЗрдЪ рдерд╛рдВрдмрддрд╛рдп? kubectl delete namespace gitops-school.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рдЪреБрдХреАрдЪреНрдпрд╛ cluster рд╡рд░ apply рдХрд░рдгреЗ тАФ рдЖрдзреА
kubectl config current-contextрдкрд╛рд╣рд╛; рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕ local cluster рдЧреГрд╣реАрдд рдзрд░рддреЛ -n gitops-schoolрд╡рд┐рд╕рд░рдгреЗ рдЖрдгрд┐ рдХрд╛рд╣реАрдЪ рдЪрд╛рд▓реВ рдирд╛рд╣реА рдЕрд╕рд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдХрд╛рдврдгреЗ- рд╣рд╛ рдзрдбрд╛ "рдЪреБрдХреАрдЪреА рдкрджреНрдзрдд" рдорд╛рдирдгреЗ тАФ рдкреБрдврдЪрд╛ рдкреНрд░рддреНрдпреЗрдХ рдзрдбрд╛ рдЬреНрдпрд╛рдЪреНрдпрд╛рд╢реА рддреБрд▓рдирд╛ рдХрд░реВрди рдореЛрдЬрд▓рд╛ рдЬрд╛рддреЛ рддреЛ рд╣рд╛ рдкрд╛рдпрд╛ рдЖрд╣реЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рд╣рд╛рддрд╛рдиреЗ deploy рдЕрдЬреВрдирд╣реА рд╣реЛрддрд╛рдд тАФ incidents рдЪреНрдпрд╛ рд╡реЗрд│реА, рд░рд╕реНрддрд╛ рдорд╛рд╣реАрдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдПрдХрд╛рдЪ рд╡реНрдпрдХреНрддреАрдХрдбреВрди. рдкреБрдврдЪрд╛ рдкреНрд░рддреНрдпреЗрдХ рдзрдбрд╛ рддреНрдпрд╛ рд╡реНрдпрдХреНрддреАрдЪреА рдЧрд░рдЬ рд╕рдВрдкрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╣реЗ; рддреЛрдкрд░реНрдпрдВрдд рдирд┐рджрд╛рди рддреЛ рд░рд╕реНрддрд╛ runbook рдореНрд╣рдгреВрди рд▓рд┐рд╣реВрди рдареЗрд╡рд╛.
тПня╕П рдкреБрдвреЗ
App рдЪрд╛рд▓реВ рд░рд╛рд╣реВ рджреНрдпрд╛ тАФ рдзрдбрд╛ 02 рддреНрдпрд╛рдЪреА рдереЛрдбреА рдореЛрдбрддреЛрдб рдХрд░рдгрд╛рд░ рдЖрд╣реЗ, рд╣рд╛рддрд╛рдиреЗ рдЪрд╛рд▓рд╡рд▓реЗрд▓реНрдпрд╛ clusters рдЪрд╛ рдореВрдХ рдорд╛рд░реЗрдХрд░реА рджрд╛рдЦрд╡рдгреНрдпрд╛рд╕рд╛рдареА: drift.
git checkout lesson-02-drift-problem