ЁЯдЦ рдзрдбрд╛ 14 тАФ Deploy: CI/CD рдЖрдгрд┐ ArgoCD рд╕рд╣ GitOps (рдПрдХ рдУрд│рдЦ)
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 26 рдкреИрдХреА рдзрдбрд╛ 14 тАФ рднрд╛рдЧ 2 (рдкрд╛рдард╡рдгреЗ рдЖрдгрд┐ рд╡рд╛рдврд╡рдгреЗ) рд╕реБрд░реВ ┬╖ рдорд╛рдЧрдЪрд╛: lesson-13-under-the-hood ┬╖ рдкреБрдврдЪрд╛: lesson-15-multi-az-scaling
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдЧрд╛рднреНрдпрд╛рдЪреЗ рд╕рд░реНрд╡ 13 рдзрдбреЗ, рдЖрдгрд┐ рд╢реЗрд╡рдЯрдЪрд╛ рднрд╛рдЧ: рдХреЛрдгрддреНрдпрд╛рд╣реА рдорд╛рдгрд╕рд╛рдиреЗ kubectl рди рдЯрд╛рдЗрдк рдХрд░рддрд╛ code рдкреНрд░рддреНрдпрдХреНрд╖ cluster рдкрд░реНрдпрдВрдд рдХрд╕рд╛ рдкреЛрд╣реЛрдЪрддреЛ тАФ robots рдЪреНрдпрд╛ рджреЛрди рдкрджреНрдзрддреА: CI/CD (push) рдЖрдгрд┐ ArgoCD рд╕рд╣ GitOps (pull). рдЦрд▒реНрдпрд╛ files:
- .circleci/config.yml тАФ рд╣рд╛ repo рдЬреНрдпрд╛рд╕реЛрдмрдд рдпреЗрддреЛ рддреА рдкреВрд░реНрдг push-рдкрджреНрдзрддреАрдЪреА pipeline
- argocd-app.yaml тАФ pull рдкрджреНрдзрддреАрд╕рд╛рдареА рд▓рдЧреЗрдЪ apply рдХрд░рддрд╛ рдпреЗрдгрд╛рд░реА ArgoCD Application
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
Robot #1 тАФ рдЧреГрд╣рдкрд╛рдард╛рдЪрд╛ robot (CI/CD, push рдкрджреНрдзрдд). ЁЯУо
рддреБрдореНрд╣реА рддреБрдордЪрд╛ рдЧреГрд╣рдкрд╛рда рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдкрддреНрд░рдкреЗрдЯреАрдд рдЯрд╛рдХрддрд╛ (git push). рдПрдХ robot рддреЛ рдЙрдЪрд▓рддреЛ:
- рддреЛ рддрдкрд╛рд╕рддреЛ тАФ рд╢реБрджреНрдзрд▓реЗрдЦрди, рдЧрдгрд┐рдд, рд╕рдЧрд│реЗ (tests рдЪрд╛рд▓рд╡рддреЛ). рд╡рд╛рдИрдЯ рдЧреГрд╣рдкрд╛рда рдХрдзреАрдЪ рдкреБрдвреЗ рдЬрд╛рдд рдирд╛рд╣реА.
- рддреНрдпрд╛рдЪреА рдЭреЗрд░реЙрдХреНрд╕ рдХрд╛рдврддреЛ тАФ рдЕрдзрд┐рдХреГрдд рдкреНрд░рдд рдмрдирд╡рддреЛ (Docker image рдмрдирд╡рддреЛ ЁЯН▒).
- рддреА рдкреНрд░рдд рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдХрдкрд╛рдЯрд╛рдд рдареЗрд╡рддреЛ (ECR registry рд╡рд░ push рдХрд░рддреЛ).
- рдореБрдЦреНрдпрд╛рдзреНрдпрд╛рдкрд┐рдХрд╛рдВрдЪреНрдпрд╛ рд╕рд╣реАрдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рддреЛ тЬНя╕П (manual approval рдЪреЗ рдлрд╛рдЯрдХ).
- рд╕реНрд╡рддрдГ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧрд╛рдд рдкреЛрд╣реЛрдЪрд╡рддреЛ (cluster рдордзреНрдпреЗ
kubectl apply).
рд╣рд╛ robot рдПрдХрд╛ рдореБрдЦреНрдп рдЪрд╛рд╡реАрдиреЗ (CI рдордзреНрдпреЗ рдареЗрд╡рд▓реЗрд▓реА AWS credentials) рд╢рд╛рд│реЗрдд рдШреБрд╕рддреЛ (push). рдЬрд▓рдж рдЖрдгрд┐ рд╕реЛрдкреЗ тАФ рдкрдг рдЪрд╛рд╡реА рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рд░рд╛рд╣рддреЗ. ЁЯФСЁЯШм
Robot #2 тАФ рдХрд╛рд│рдЬреАрд╡рд╛рд╣реВ robot (GitOps, pull рдкрджреНрдзрдд). ЁЯдЦ рд╣рд╛ robot рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдЖрддрдЪ рд░рд╛рд╣рддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛рдХрдбреЗ рдмрд╛рд╣реЗрд░рдЪреА рдХреЛрдгрддреАрд╣реА рдЪрд╛рд╡реА рдирд╕рддреЗ. рднрд┐рдВрддреАрд╡рд░ рдореБрдЦреНрдп рдкреНрд▓реЕрди-рд╡рд╣реА рдЯрд╛рдВрдЧрд▓реЗрд▓реА рдЕрд╕рддреЗ (рддреБрдордЪрд╛ git repo тАФ k8s/ folder). рджрд░ рдХрд╛рд╣реА рдорд┐рдирд┐рдЯрд╛рдВрдиреА рдХрд╛рд│рдЬреАрд╡рд╛рд╣реВ:
- рд╡рд╣реА рд╡рд╛рдЪрддреЛ ЁЯУЦ,
- рд╡реНрд╣рд░рд╛рдВрдбреНрдпрд╛рдВрддреВрди рдлрд┐рд░реВрди рдЖрд░рд╛рдЦрдбрд╛ рдЖрдгрд┐ рд╡рд╛рд╕реНрддрд╡ рдпрд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░рддреЛ,
- рдХреЛрдгрддрд╛рд╣реА рдлрд░рдХ рджреБрд░реБрд╕реНрдд рдХрд░рддреЛ тАФ рд╡рд╣реАрдд рдирд╡реЗ рдкрд╛рди? рдЦреЛрд▓реА рдкреБрдиреНрд╣рд╛ рдмрд╛рдВрдзрд╛. рдПрдЦрд╛рджреНрдпрд╛ рдореБрд▓рд╛рдиреЗ рд╣рд╛рддрд╛рдиреЗ рдЦреБрд░реНрдЪреНрдпрд╛ рдЗрдХрдбреЗ-рддрд┐рдХрдбреЗ рдХреЗрд▓реНрдпрд╛? рддреНрдпрд╛ рд╡рд╣реАрдд рд▓рд┐рд╣рд┐рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗрдЪ рдкрд░рдд рдареЗрд╡рд╛.
Deploy рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗ? рддреБрдореНрд╣реА рд╢рд╛рд│реЗрд▓рд╛ рдЕрдЬрд┐рдмрд╛рдд рд╣рд╛рдд рд▓рд╛рд╡рдд рдирд╛рд╣реА тАФ рддреБрдореНрд╣реА рд╡рд╣реА edit рдХрд░рддрд╛.
Roll back рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗ? рдХрд╛рд▓рдЪреЗ рдкрд╛рди рдЙрд▓рдЯрд╛ (git revert). рдХрд╛рдп рдЪрд╛рд▓реВ рдЖрд╣реЗ рддреЗ рдЬрд╛рдгреВрди рдШреНрдпрд╛рдпрдЪреЗ рдЖрд╣реЗ?
рд╡рд╣реА рд╡рд╛рдЪрд╛ тАФ рддреА рдиреЗрд╣рдореАрдЪ рд╕рддреНрдп рдЕрд╕рддреЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
dev["ЁЯзСтАНЁЯТ╗ git push"]
subgraph ci["ЁЯУо Robot 1 - CI/CD pipeline"]
t["тЬЕ test"]
b["ЁЯН▒ build image"]
reg["ЁЯЧДя╕П push to registry ECR"]
hold["тЬНя╕П manual approval"]
t --> b --> reg --> hold
end
subgraph cluster["ЁЯПл Kubernetes cluster"]
argo["ЁЯдЦ Robot 2 - ArgoCD<br/>lives INSIDE"]
app["ЁЯкС school-api pods"]
argo -->|"sync + self-heal"| app
end
book["ЁЯУЦ git repo = master plan<br/>k8s/ manifests"]
dev --> ci
hold -->|"PUSH style:<br/>kubectl apply from outside"| app
ci -.->|"GitOps style: CI only<br/>updates the image tag in git"| book
argo -->|"pulls & compares<br/>every 3 min"| book
тЭУ рдХрд╛рдп
- CI (Continuous Integration) тАФ рдкреНрд░рддреНрдпреЗрдХ push рдЖрдкреЛрдЖрдк test рдЖрдгрд┐ build рд╣реЛрддреЛ. CD (Continuous Delivery/Deployment) тАФ build рдЭрд╛рд▓реЗрд▓реА рдЧреЛрд╖реНрдЯ рдЖрдкреЛрдЖрдк release рд╣реЛрддреЗ. рдЖрдкрд▓реА CircleCI pipeline рджреЛрдиреНрд╣реА рдЖрд╣реЗ.
- GitOps тАФ deployment рдЪреЗ рддрддреНрддреНрд╡рдЬреНрдЮрд╛рди рдЬрд┐рдереЗ git рд╣рд╛рдЪ рд╕рддреНрдпрд╛рдЪрд╛ рдПрдХрдореЗрд╡ рд╕реНрд░реЛрдд рдЖрд╣реЗ: cluster рд╕рддрдд commit рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕реНрдерд┐рддреАрдХрдбреЗ рд╕рд░рдХрдд рд░рд╛рд╣рддреЛ. рдХреЛрдгреАрд╣реА рд╣рд╛рддрд╛рдиреЗ kubectl рдЪрд╛рд▓рд╡рдд рдирд╛рд╣реА; рдмрджрд▓ = pull requests. ArgoCD рдЖрдгрд┐ Flux рд╣реА рджреЛрди рдореЛрдареА tools рдЖрд╣реЗрдд; ArgoCD рдордзреНрдпреЗ рдЙрддреНрддрдо UI рдЖрд╣реЗ.
- рдореБрдЦреНрдп рдлрд░рдХ: push = CI рдХрдбреЗ cluster credentials рдЕрд╕рддрд╛рдд рдЖрдгрд┐ рддреЛ рдмрджрд▓ рдЖрдд рдврдХрд▓рддреЛ. Pull = cluster рдЖрддрд▓рд╛ agent git рдордзреВрди рдЖрдгрддреЛ; cluster credentials рдХрдзреАрдЪ cluster рдмрд╛рд╣реЗрд░ рдЬрд╛рдд рдирд╛рд╣реАрдд.
- рд╣реА рдкрджреНрдзрдд рдУрд│рдЦрд▓реА? ArgoCD рдореНрд╣рдгрдЬреЗ рдзрдбрд╛ 03 рдордзрд▓рд╛ рд╡рд░реНрдЧ-рдкреНрд░рдореБрдЦ, рдкрдг рд╕рдВрдкреВрд░реНрдг cluster рд╕рд╛рдареА, git рд╣реАрдЪ desired state. рддреЛрдЪ reconcile loop, рдПрдХ рдкрд╛рддрд│реА рд╡рд░. drift рджреБрд░реБрд╕реНрдд рдХрд░рдгреЗ (self-heal) рд╕реБрджреНрдзрд╛ рдЕрдЧрджреА рд╡рд░реНрдЧ-рдкреНрд░рдореБрдЦрд╛рдиреЗ рдЬрд╛рджрд╛ рдореВрд▓ рдкрд░рдд рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗрдЪ.
ЁЯдФ рдХрд╛
рд╣рд╛рддрд╛рдиреЗ рдЪрд╛рд▓рд╡рд▓реЗрд▓реЗ kubectl apply рдЪрд╛рд▓рддреЗ... рд╢реБрдХреНрд░рд╡рд╛рд░реА рд╕рдВрдзреНрдпрд╛рдХрд╛рд│реА 6 рд╡рд╛рдЬреЗрдкрд░реНрдпрдВрдд: рдХрд╛рдп deploy
рдЭрд╛рд▓реЗ рдЖрд╣реЗ? рддреЗ рдХреЛрдгреА рдмрджрд▓рд▓реЗ? prod YAML рдкреЗрдХреНрд╖рд╛ рд╡реЗрдЧрд│рд╛ рдХрд╛ рдЖрд╣реЗ? рдХреЛрдгрд╛рд▓рд╛рдЪ рдорд╛рд╣реАрдд рдирд╕рддреЗ. ЁЯФе
- CI/CD "рдорд╛рдЭреНрдпрд╛ machine рд╡рд░ рдЪрд╛рд▓рддреЗ" рдЖрдгрд┐ "tests рдЪрд╛рд▓рд╡рд╛рдпрд▓рд╛ рд╡рд┐рд╕рд░рд▓реЛ" рд╕рдВрдкрд╡рддреЗ тАФ рдкреНрд░рддреНрдпреЗрдХ deploy tested рдЕрд╕рддреЛ, commit SHA рдиреЗ tag рдХреЗрд▓реЗрд▓рд╛ рдЕрд╕рддреЛ, рдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ рдорд╛рдЧ рдХрд╛рдврддрд╛ рдпреЗрддреЛ.
- GitOps configuration drift рд╕рдВрдкрд╡рддреЗ тАФ рддреБрдордЪреНрдпрд╛ YAML files рдЖрдгрд┐ рд╡рд╛рд╕реНрддрд╡ рдпрд╛рдВрдЪреНрдпрд╛рддрд▓реА рд╢рд╛рдВрдд рджрд░реА. Self-heal рдЪрд╛рд▓реВ рдЕрд╕рддрд╛рдирд╛ drift ~3 рдорд┐рдирд┐рдЯреЗ рдЯрд┐рдХрддреЛ, рдордЧ рдХрд╛рд│рдЬреАрд╡рд╛рд╣реВ рддреЛ рджреБрд░реБрд╕реНрдд рдХрд░рддреЛ. рддреБрдордЪрд╛ git log рд╣рд╛рдЪ рддреБрдордЪрд╛ deploy log рдмрдирддреЛ тАФ audit рдореЛрдлрдд.
- рдЦрд▒реНрдпрд╛ teams рд╕рд╣рд╕рд╛ рджреЛрдиреНрд╣реА рд╡рд╛рдкрд░рддрд╛рдд: CI image test рдЖрдгрд┐ build рдХрд░рддреЛ, рдордЧ рдирд╡рд╛ image tag manifest repo рдордзреНрдпреЗ commit рдХрд░рддреЛ тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпрдХреНрд╖ deploy рдЪреЗ рд╕рдЧрд│реЗ рдХрд╛рдо ArgoCD рдХрд░рддреЛ. Pipeline рдХрдзреАрдЪ cluster рд▓рд╛ рд╣рд╛рдд рд▓рд╛рд╡рдд рдирд╛рд╣реА.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
Push рдкрджреНрдзрдд тАФ рдЖрдзреАрдЪ рдЬреЛрдбрд▓реЗрд▓реА: .circleci/config.yml
test-node + test-python рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЪрд╛рд▓рд╡рддреЗ тЖТ build-and-push (рджреЛрдиреНрд╣реА images тЖТ
ECR, git SHA рдиреЗ tag рдХреЗрд▓реЗрд▓реНрдпрд╛) тЖТ hold-for-approval тЖТ deploy-to-eks
(kubectl apply + rollout status, рдзрдбрд╛ 11 рдЪреЗ рдлрд╛рдЯрдХ). least-privilege рдЪрд╛ рддрдкрд╢реАрд▓ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛:
test jobs рдирд╛ AWS credentials рдЕрдЬрд┐рдмрд╛рдд рдорд┐рд│рдд рдирд╛рд╣реАрдд; рдлрдХреНрдд AWS рд▓рд╛ рд╕реНрдкрд░реНрд╢ рдХрд░рдгрд╛рд▒реНрдпрд╛ jobs рдирд╛рдЪ
рд╕рд╛рдорд╛рдпрд┐рдХ credentials context рдорд┐рд│рддреЛ.
Pull рдкрджреНрдзрдд тАФ рд╣рд╛ рдзрдбрд╛ рддреА рдЬреЛрдбрддреЛ: argocd-app.yaml ArgoCD рд▓рд╛
рд╕рд╛рдВрдЧрддреЗ: "рдпрд╛ repo рдЪреНрдпрд╛ main branch рдордзрд▓рд╛ k8s/ folder рдкрд╛рд╣рдд рд░рд╛рд╣рд╛, namespace school рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА
рдЬреБрд│рддрд╛ рдареЗрд╡, delete рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЧреЛрд╖реНрдЯреА рдХрд╛рдвреВрди рдЯрд╛рдХ (prune), рдЖрдгрд┐ drift self-heal рдХрд░."
spec:
source:
repoURL: https://github.com/BaluRaut/learn-kubernetes-school.git
targetRevision: main
path: k8s # ЁЯУЦ the master plan pages
syncPolicy:
automated:
prune: true # deleted from git тЖТ deleted from cluster
selfHeal: true # hand-edits get reverted. The book wins.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (рд╕рдЧрд│реЗ local, ~15 min)
# 1) Install the caretaker robot into your local cluster:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 2) Open its UI:
kubectl -n argocd port-forward svc/argocd-server 8080:443 &
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath='{.data.password}' | base64 -d; echo # login: admin + this password
# browse https://localhost:8080
# 3) Fork this repo on GitHub, then edit argocd-app.yaml's repoURL to YOUR fork,
# and in k8s/deployment.yaml replace IMAGE_PLACEHOLDER with a real image
# (e.g. nginxdemos/hello:plain-text) тАФ commit & push to your fork.
# 4) Hand ArgoCD the plan book:
kubectl apply -f lessons/14-deploy-gitops/argocd-app.yaml
# watch the UI: it clones your repo, shows a diff, and syncs the school into being ЁЯОЙ
# 5) Feel GitOps тАФ deploy WITHOUT kubectl:
# edit k8s/deployment.yaml in your fork: replicas: 2 тЖТ 3, push...
# ...and watch a third pod appear on its own within ~3 minutes.
# 6) Feel self-heal тАФ try to cause drift by hand:
kubectl -n school scale deployment school-api --replicas=5
kubectl -n school get pods -w # the caretaker puts it back to 3. The book wins. ЁЯдЦ
ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl
kubectl get applications -n argocd ┬╖ argocd app sync
ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯН▒ Docker L12 (CI build рдЖрдгрд┐ push рдХрд░рддреЛ) ┬╖ ЁЯдЦ ArgoCD рд╢рд╛рд│рд╛ (рд╕рд░реНрд╡ 12 рдзрдбреЗ)
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
manifest рдордзрд▓рд╛ рдмрджрд▓ push рдХрд░рд╛ тЖТ ArgoCD рдЖрдзреА OutOfSync рдЖрдгрд┐ рдордЧ Synced рджрд╛рдЦрд╡рддреЛ; рд╣рд╛рддрд╛рдиреЗ kubectl scale рдХрд░рд╛ тЖТ рддреЗ рд▓рдЧреЗрдЪ рдкреВрд░реНрд╡реАрд╕рд╛рд░рдЦреЗ рд╣реЛрддреЗ.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ
local рдХрд╛рдо рдЭрд╛рд▓реНрдпрд╛рд╡рд░ kubectl delete namespace argocd
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рд╣рд╛ рдзрдбрд╛ рд╕рдВрдкреВрд░реНрдг ArgoCD рд╢рд┐рдХрд╡реЗрд▓ рдЕрд╢реА рдЕрдкреЗрдХреНрд╖рд╛ тАФ рддреЛ рдореБрджреНрджрд╛рдо рдлрдХреНрдд рдУрд│рдЦ рдХрд░реВрди рджреЗрдгрд╛рд░рд╛ рдЖрд╣реЗ; ArgoCD рд╢рд╛рд│рд╛ рд╕рдЦреЛрд▓ рдЬрд╛рддреЗ
- CI рдиреЗ manifests apply рдХрд░рдгреЗ рдЖрдгрд┐ рддреНрдпрд╛рдЪ рд╡реЗрд│реА ArgoCD рдиреЗ рддреЗ sync рдХрд░рдгреЗ тАФ рджреЛрди robots рднрд╛рдВрдбрддрд╛рдд
ЁЯОУ рд╢реЗрд╡рдЯ тАФ рдпрд╛ рд╡реЗрд│реА рдЦрд░реЛрдЦрд░рдЪрд╛
Push pipelines, pull reconcilers, рдЖрдгрд┐ рдЬреЗрд╡рдгрд╛рдЪреНрдпрд╛ рдбрдмреНрдпрд╛рдВрдкрд╛рд╕реВрди control plane рдкрд░реНрдпрдВрдд рдордзрд▓реЗ рд╕рдЧрд│реЗ. рдЖрддрд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рддреБрдордЪреЗ app рдХрд╛рдп рдЪрд╛рд▓рд╡рддреЗ рд╣реЗрдЪ рдирд╛рд╣реА, рддрд░ рддреЗ рдХреЛрдг deploy рдХрд░рддреЗ рдЖрдгрд┐ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдареЗрд╡рддреЗ рд╣реЗрд╣реА рд╕рдордЬрддреЗ. рдПрдХ рд╢реЗрд╡рдЯрдЪрд╛ рдмреЛрдирд╕: рдЗрдорд╛рд░рддреАрддрд▓реА рдЖрдЧ рдЖрдгрд┐ рдкрд░реАрдХреНрд╖реЗрдЪреНрдпрд╛ рдирд┐рдХрд╛рд▓рд╛рдЪрд╛ рджрд┐рд╡рд╕ рдпрд╛рддреВрди рддреЗ рдЯрд┐рдХрд╡рдгреЗ.
git checkout lesson-15-multi-az-scaling # multi-AZ + the scaling ladder ЁЯПлЁЯПл