ЁЯПлЁЯПл рдзрдбрд╛ 15 тАФ Multi-AZ рдЖрдгрд┐ scaling рдЪреА рд╢рд┐рдбреА
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: рдзрдбрд╛ 15 / 26 тАФ рднрд╛рдЧ 2 рдЗрдереЗ рд╕рдВрдкрддреЛ ┬╖ рдорд╛рдЧреАрд▓: lesson-14-deploy-gitops ┬╖ рдкреБрдвреАрд▓: lesson-16-debugging тАФ рднрд╛рдЧ 3 рд╕реБрд░реВ!
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдЖрдзреАрдЪреЗ рд╕рд░реНрд╡ рдзрдбреЗ, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЦрд▒реНрдпрд╛ cluster рд▓рд╛ рдЙрддреНрддрд░ рджреНрдпрд╛рд╡реЗ рд▓рд╛рдЧрдгрд╛рд░реЗ рджреЛрди рдкреНрд░рд╢реНрди: рд╕рдВрдкреВрд░реНрдг рдЗрдорд╛рд░рддрдЪ рдЬрд│реВрди рдЧреЗрд▓реА рддрд░? (multi-AZ) рдЖрдгрд┐ рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╢реА рдХрд╛рдп рд╣реЛрддреЗ? (scaling рдЪреА рд╢рд┐рдбреА). рдЦрд▒реНрдпрд╛ files:
- terraform/vpc.tf тАФ рдЕрдиреЗрдХ AZs рдордзреНрдпреЗ рдмрдирд╡рд▓реЗрд▓реЗ subnets (рд╣рд╛рдЪ рдЖрд░рд╛рдЦрдбрд╛ рд╕реБрд░реБрд╡рд╛рддреАрдкрд╛рд╕реВрди рд╣реЛрддрд╛!)
- terraform/eks.tf тАФ node group рддреНрдпрд╛ subnets рдордзреНрдпреЗ рдкрд╕рд░рд▓реЗрд▓рд╛ рдЖрд╣реЗ
- k8s/hpa.yaml тАФ рд╢рд┐рдбреАрдЪреА рдкрд╛рдпрд░реА 1 (рдзрдбрд╛ 09)
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдЖрдЧреАрдЪрд╛ рдкреНрд░рд╢реНрди. ЁЯПлЁЯФе рдкреНрд░рддреНрдпреЗрдХ рдореБрд▓рд╛рд▓рд╛ рдПрдХрд╛рдЪ рдЗрдорд╛рд░рддреАрдд рдмрд╕рд╡рдгрд╛рд░реА рд╢рд╛рд│рд╛, рдПрдХрд╛ рдЖрдЧреАрдирдВрддрд░ рд╢рд╛рд│рд╛рдЪ рдЙрд░рдгрд╛рд░ рдирд╛рд╣реА рдЕрд╢рд╛ рд╕реНрдерд┐рддреАрдд рдЕрд╕рддреЗ. рдЦрд▒реНрдпрд╛ рд╢рд╛рд│рд╛ campus рд╡рд╛рдкрд░рддрд╛рдд: рдЗрдорд╛рд░рддреА A рдЖрдгрд┐ B (availability zones тАФ рд╡реЗрдЧрд│реА рд╡реАрдЬ, рд╕рдЧрд│реЗрдЪ рд╡реЗрдЧрд│реЗ), рдЖрдгрд┐ рдПрдХ рдирд┐рдпрдо: "рд╕рдВрдкреВрд░реНрдг рд╡рд░реНрдЧ рдХрдзреАрдЪ рдПрдХрд╛ рдЗрдорд╛рд░рддреАрдд рдмрд╕рд╡реВ рдирдХрд╛." рдЗрдорд╛рд░рдд A рдЬрд│рд▓реА? рджреБрдГрдЦрд╛рдЪрд╛ рджрд┐рд╡рд╕, рдкрдг рд╡рд░реНрдЧ B рдордзреНрдпреЗ рд╕реБрд░реВ рд░рд╛рд╣рддрд╛рдд. рд╣реЗрдЪ multi-AZ.
рдкрд░реАрдХреНрд╖реЗрдЪреНрдпрд╛ рджрд┐рд╡рд╕рд╛рдЪрд╛ рдкреНрд░рд╢реНрди. ЁЯУЭ рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╢реА рд╣рдЬрд╛рд░ рдкрд╛рд▓рдХ рдПрдХрджрдо рдпреЗрддрд╛рдд. рд╢рд╛рд│рд╛ рдПрдХ рд╢рд┐рдбреА рдЪрдврддреЗ, рдЖрдзреА рд╕рд░реНрд╡рд╛рдд рд╕реНрд╡рд╕реНрдд рдкрд╛рдпрд░реА:
- рдкреНрд░рддреНрдпреЗрдХ рдЦреЛрд▓реАрдд рдЬрд╛рд╕реНрдд рдорджрддрдиреАрд╕ ЁЯЩЛ (HPA, рдзрдбрд╛ 09): transport manager pods рд╡рд╛рдврд╡рддреЛ тАФ рдХрд╛рд╣реА рд╕реЗрдХрдВрдж, рдореЛрдлрдд, рдкрдг рдмрд╛рдХрд╛рдВрд╡рд░ рдЬрд╛рдЧрд╛ рдЕрд╕реЗрдкрд░реНрдпрдВрддрдЪ рдЪрд╛рд▓рддреЗ.
- рдЬрд╛рд╕реНрдд рдмрд╛рдХ ЁЯЦея╕П (cluster autoscaler): pods рдирд╛ рдмрд╕рд╛рдпрд▓рд╛ рдЬрд╛рдЧрд╛ рдирд╛рд╣реА, рддреЗ
рдЙрднреЗ рдЖрд╣реЗрдд (
Pending!) тЖТ рддреЛ ASG рдХрдбреЗ рдЖрдгрдЦреА EC2 рдмрд╛рдХ рдорд╛рдЧрддреЛ тАФ рдПрдХ-рджреЛрди рдорд┐рдирд┐рдЯреЗ рд▓рд╛рдЧрддрд╛рдд, рдкреИрд╕реЗ рд▓рд╛рдЧрддрд╛рдд, рдкрдг рдЦрд░реА рдорд░реНрдпрд╛рджрд╛ рд╕реЛрдбрд╡рддреЛ. - рдЬреБрд│реНрдпрд╛рдВрдирд╛ рд╡реЗрдЧрд│реЗ рдмрд╕рд╡рд╛ ЁЯСп (topology spread):
school-apiрдЪреНрдпрд╛ рд╕рдЧрд│реНрдпрд╛ copies рдПрдХрд╛рдЪ рдЗрдорд╛рд░рддреАрдд рдареЗрд╡реВ рдирдХрд╛ тАФ 2 replicas = 2 рдЗрдорд╛рд░рддреА. рдЖрдЧреАрдЪрд╛ рдирд┐рдпрдо рдЖрдгрд┐ scaling рдЪреА рдЧреЛрд╖реНрдЯ рдЗрдереЗ рднреЗрдЯрддрд╛рдд. - рд╕рдЧрд│реЗ рдПрдХрджрдо рдЬреЗрд╡рд╛рдпрд▓рд╛ рдирд╛рд╣реА ЁЯН╜я╕П (PodDisruptionBudget): рдмрд╛рдХрд╛рдВрдЪреА рд╣рд▓рд╡рд╛рд╣рд▓рд╡ (upgrades, scale-down) рдЪрд╛рд▓реВ рдЕрд╕рддрд╛рдирд╛ рдХрд┐рдорд╛рди N рдорджрддрдиреАрд╕ рдХрд╛рдорд╛рд╡рд░ рд░рд╛рд╣рд┐рд▓реЗрдЪ рдкрд╛рд╣рд┐рдЬреЗрдд. рд╕реНрд╡реЗрдЪреНрдЫреЗрдиреЗ рдХреЗрд▓реЗрд▓реА рд╣рд▓рд╡рд╛рд╣рд▓рд╡ рдерд╛рдВрдмрддреЗ; рд╡рд░реНрдЧ рдХрдзреАрдЪ рдПрдХрдЯрд╛ рдкрдбрдд рдирд╛рд╣реА.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
subgraph campus["ЁЯПЮя╕П the campus - one region, one VPC"]
subgraph aza["ЁЯПл building A - AZ a"]
n1["ЁЯЦея╕П desk<br/>ЁЯкС api-1 ┬╖ ЁЯкС analytics-1"]
n3["ЁЯЦея╕П new desk<br/>added by autoscaler"]
end
subgraph azb["ЁЯПл building B - AZ b"]
n2["ЁЯЦея╕П desk<br/>ЁЯкС api-2 ┬╖ ЁЯкС analytics-2"]
end
end
alb["ЁЯМН ALB - stands OUTSIDE both buildings,<br/>sends visitors to whichever is healthy"]
ladder["ЁЯкЬ the ladder:<br/>1 HPA: more pods - seconds<br/>2 autoscaler: more desks - minutes<br/>3 spread: copies across buildings<br/>4 PDB: never all away at once"]
alb --> aza
alb --> azb
ladder -.-> campus
тЭУ рдХрд╛рдп
- AZ = region рдордзрд▓реЗ рдкреНрд░рддреНрдпрдХреНрд╖ рд╡реЗрдЧрд│реЗ data center (AWS рдХреЛрд░реНрд╕, рдзрдбрд╛ 07). EKS control plane рдЖрдкреЛрдЖрдк multi-AZ рдЕрд╕рддреЛ тАФ AWS office рдЗрдорд╛рд░рддреАрдВрдордзреНрдпреЗ рдкрд╕рд░рд╡реВрди рдЪрд╛рд▓рд╡рддреЗ; рддреБрдореНрд╣реА рдлрдХреНрдд рдмрд╛рдХрд╛рдВрдЪреА рдмрд╛рдЬреВ design рдХрд░рддрд╛.
- Multi-AZ nodes: node group рд▓рд╛ тЙе2 AZs рдордзрд▓реЗ subnets рджреНрдпрд╛ (vpc.tf + eks.tf рд╣реЗрдЪ рдХрд░рддрд╛рдд) тАФ рдордЧ ASG рдмрд╛рдХ рдЗрдорд╛рд░рддреАрдВрдордзреНрдпреЗ рдкрд╕рд░рд╡рддреЛ рдЖрдгрд┐ рдмрджрд▓рддреЛ.
- Cluster autoscaler (рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рдЪрд╛ рдирд╡рд╛ рдЪреБрд▓рдд рднрд╛рдК Karpenter):
Pendingpods рд╡рд░ рд▓рдХреНрд╖ рдареЗрд╡рддреЛ тЖТ ASG рд╡рд╛рдврд╡рддреЛ; рдмрд╛рдХ рд░рд┐рдХрд╛рдореЗ рдмрд╕рд▓реЗ рдХреА рдХрдореА рдХрд░рддреЛ. HPA pods рд╣рд▓рд╡рддреЛ, autoscaler рдмрд╛рдХ рд╣рд▓рд╡рддреЛ тАФ рдЬреЛрдбреАрдиреЗ рдЧрд╛рдгреЗ, рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдирд╛рд╣реАрдд. - topologySpreadConstraints тАФ Deployment рдЪреНрдпрд╛ pod spec рдордзреНрдпреЗ рдЬреЛрдбрд╛:
topologySpreadConstraints:
- maxSkew: 1 # buildings may differ by тЙд1 copy
topologyKey: topology.kubernetes.io/zone # spread BY BUILDING
whenUnsatisfiable: ScheduleAnyway # prefer, don't deadlock
labelSelector: { matchLabels: { app: school-api } }
- PodDisruptionBudget тАФ 2-replica app рд╕рд╛рдареА
minAvailable: 1: node drains рдЖрдгрд┐ upgrades рдПрдХрд╛ рд╡реЗрд│реА рдПрдХрдЪ рдмрд╛рдХ рдХрд░рдд рдкреБрдвреЗ рдЬрд╛рддрд╛рдд, рд╡рд░реНрдЧ рдХрдзреАрдЪ рд░рд┐рдХрд╛рдорд╛ рд╣реЛрдд рдирд╛рд╣реА. - data рд╡рд┐рд╕рд░реВ рдирдХрд╛: pods рд╕рд╣рдЬ рдкрд╕рд░рддрд╛рдд; EBS drawers рдкреНрд░рддреНрдпреЗрдХ рдЗрдорд╛рд░рддреАрдЪреЗ рд╡реЗрдЧрд│реЗ рдЕрд╕рддрд╛рдд
(рдПрдХ volume рдПрдХрд╛рдЪ AZ рдордзреНрдпреЗ рд░рд╛рд╣рддреЛ!) тАФ рд╣рд╛ repo state RDS рдордзреНрдпреЗ рдареЗрд╡рддреЛ рдпрд╛рдЪреЗ рдЖрдгрдЦреА
рдПрдХ рдХрд╛рд░рдг, рдЬреНрдпрд╛рдЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛
multi_azswitch рдЖрд╣реЗ.
ЁЯдФ рдХрд╛
AZ outage рдХрдзреА рд╣реЛрдгрд╛рд░ рд╣рд╛ рдкреНрд░рд╢реНрди рдЖрд╣реЗ, рд╣реЛрдИрд▓ рдХрд╛ рд╣рд╛ рдирд╛рд╣реА тАФ рдЖрдгрд┐ рддреЗ рдЯрд┐рдХрдгреЗ рдлрдХреНрдд рддреЗрд╡реНрд╣рд╛рдЪ рд╢рдХреНрдп рдЖрд╣реЗ рдЬреЗрд╡реНрд╣рд╛ replicas, nodes рдЖрдгрд┐ traffic рдЖрдЧреАрдЪреНрдпрд╛ рдЖрдзреАрдЪ рдЗрдорд╛рд░рддреАрдВрдордзреНрдпреЗ рдкрд╕рд░рд▓реЗрд▓реЗ рдЕрд╕рддрд╛рдд. Multi-AZ рд╢рд┐рд╡рд╛рдпрдЪреЗ scaling рдореНрд╣рдгрдЬреЗ рд╡реЗрдЧрд╡рд╛рди single point of failure; autoscaling рд╢рд┐рд╡рд╛рдпрдЪреЗ multi-AZ рдореНрд╣рдгрдЬреЗ рдкрд╣рд┐рд▓реНрдпрд╛рдЪ рдкрд░реАрдХреНрд╖реЗрдЪреНрдпрд╛ рджрд┐рд╡рд╢реА рдХреЛрд╕рд│рдгрд╛рд░реА рдордЬрдмреБрддреА. рд╢рд┐рдбреА рд╣реЗрдЪ рддреБрдореНрд╣реА рд╢рд┐рдХрд▓реЗрд▓реНрдпрд╛ рд╕рдЧрд│реНрдпрд╛рдЪреЗ рд╕рд╛рд░ рдЖрд╣реЗ: рдзрдбрд╛ 03 рдЪрд╛ monitor, рдзрдбрд╛ 09 рдЪреНрдпрд╛ рдмрд╕реЗрд╕, AWS рдХреЛрд░реНрд╕рдЪреЗ ASG рдмрд╛рдХ тАФ рд╕рдЧрд│реЗ рдПрдХрддреНрд░ рдЪрдврддрд╛рдирд╛.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
# which building is each desk in? (works on EKS; minikube has 1 "building")
kubectl get nodes -L topology.kubernetes.io/zone
# where do the copies sit right now?
kubectl -n school get pods -o wide
# rung 2, felt: ask for more pods than the desks can seat тЖТ
kubectl -n school scale deployment school-api --replicas=20
kubectl -n school get pods | grep Pending | head -5
# Pending = kids standing without desks тАФ EXACTLY what the cluster
# autoscaler watches for. (On EKS with it installed: new nodes in ~2 min.)
kubectl -n school scale deployment school-api --replicas=2 # calm down
# rung 4: protect the class during desk-shuffles:
kubectl -n school create pdb school-api --selector=app=school-api --min-available=1
kubectl -n school get pdb # ALLOWED DISRUPTIONS: 1 тАФ never both at once ЁЯОЙ
ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl
kubectl get nodes -L topology.kubernetes.io/zone ┬╖ kubectl get pdb
ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L07 (AZs рдореНрд╣рдгрдЬреЗ рдЗрдорд╛рд░рддреА) ┬╖ L12 (ASG)
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ
kubectl get pods -o wide рдордзреНрдпреЗ copies рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ nodes/zones рд╡рд░ рджрд┐рд╕рддрд╛рдд; рдмрд╕реВ рд╢рдХрддреАрд▓ рддреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд pods рдорд╛рдЧрд╛ тЖТ autoscaler рдмрд╛рдХ рдЬреЛрдбреЗрдкрд░реНрдпрдВрдд Pending (EKS) тАФ minikube рд╡рд░ рддреЗ Pending рдЪ рд░рд╛рд╣рддрд╛рдд.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ
scale рдкрд░рдд рдХрдореА рдХрд░рд╛; EKS рд╡рд░ рдЬрд╛рд╕реНрддреАрдЪреЗ nodes/cluster рддреНрдпрд╛рдЪ рджрд┐рд╡рд╢реА destroy рдХрд░рд╛
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- 'рд╕рдзреНрдпрд╛рдкреБрд░рддрд╛' рдПрдХрдЪ AZ
minAvailable= replicas рдЕрд╕рд▓реЗрд▓рд╛ PDB тАФ drain рдХрдзреАрдЪ рдкреВрд░реНрдг рд╣реЛрдК рд╢рдХрдд рдирд╛рд╣реА
ЁЯОУ campus рдкреВрд░реНрдг рдЭрд╛рд▓рд╛
рд╕реНрд╡рддрдГ рдмрд░реЗ рд╣реЛрдгрд╛рд░реЗ pods (03), рдкрд╛рд╡рд╕рд╛рд│реА рджрд┐рд╡рд╕рд╛рдЪреНрдпрд╛ рдмрд╕реЗрд╕ (09), downtime рд╢рд┐рд╡рд╛рдп рдмрджрд▓реА (11), deploy рдХрд░рдгрд╛рд░реЗ robots (14) тАФ рдЖрдгрд┐ рдЖрддрд╛ рдЖрдЧ рдЖрдгрд┐ рдирд┐рдХрд╛рд▓рд╛рдЪрд╛ рджрд┐рд╡рд╕ рджреЛрдиреНрд╣реА рдЯрд┐рдХрдгрд╛рд░реА рд╢рд╛рд│рд╛. рд╣рд╛ рдЖрддрд╛ demo cluster рд░рд╛рд╣рд┐рд▓рд╛ рдирд╛рд╣реА; рд╣реЗ architecture рдЖрд╣реЗ. ЁЯПлЁЯПл
рдЖрдгрд┐ рдЖрддрд╛ рддреЗ рдЙрднреЗ рдЖрд╣реЗ рдореНрд╣рдгреВрди: рднрд╛рдЧ 3 тАФ рддреЗ рдЦрд░реЛрдЦрд░ рдЪрд╛рд▓рд╡рдгреЗ (рдзрдбреЗ 16тАУ26): debugging, hall passes, рдЧреГрд╣рдкрд╛рдард╛рдЪреНрдпрд╛ рдШрдВрдЯрд╛, рдмрд╕рдгреНрдпрд╛рдЪреЗ рдирд┐рдпрдо, рдЖрдгрд┐ рд╕рдЧрд│реНрдпрд╛рд╡рд░ рдирдЬрд░.
git checkout lesson-16-debugging # ЁЯй║ the nurse's triage chart