ЁЯПл The SchoolтА║тШ╕я╕П KubernetesтА║ЁЯПлЁЯПл рдзрдбрд╛ 15 тАФ Multi-AZ рдЖрдгрд┐ scaling рдЪреА рд╢рд┐рдбреА
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯПлЁЯПл рдзрдбрд╛ 15 тАФ Multi-AZ рдЖрдгрд┐ scaling рдЪреА рд╢рд┐рдбреА

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: рдзрдбрд╛ 15 / 26 тАФ рднрд╛рдЧ 2 рдЗрдереЗ рд╕рдВрдкрддреЛ ┬╖ рдорд╛рдЧреАрд▓: lesson-14-deploy-gitops ┬╖ рдкреБрдвреАрд▓: lesson-16-debugging тАФ рднрд╛рдЧ 3 рд╕реБрд░реВ!


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдЖрдзреАрдЪреЗ рд╕рд░реНрд╡ рдзрдбреЗ, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЦрд▒реНрдпрд╛ cluster рд▓рд╛ рдЙрддреНрддрд░ рджреНрдпрд╛рд╡реЗ рд▓рд╛рдЧрдгрд╛рд░реЗ рджреЛрди рдкреНрд░рд╢реНрди: рд╕рдВрдкреВрд░реНрдг рдЗрдорд╛рд░рддрдЪ рдЬрд│реВрди рдЧреЗрд▓реА рддрд░? (multi-AZ) рдЖрдгрд┐ рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╢реА рдХрд╛рдп рд╣реЛрддреЗ? (scaling рдЪреА рд╢рд┐рдбреА). рдЦрд▒реНрдпрд╛ files:

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рдЖрдЧреАрдЪрд╛ рдкреНрд░рд╢реНрди. ЁЯПлЁЯФе рдкреНрд░рддреНрдпреЗрдХ рдореБрд▓рд╛рд▓рд╛ рдПрдХрд╛рдЪ рдЗрдорд╛рд░рддреАрдд рдмрд╕рд╡рдгрд╛рд░реА рд╢рд╛рд│рд╛, рдПрдХрд╛ рдЖрдЧреАрдирдВрддрд░ рд╢рд╛рд│рд╛рдЪ рдЙрд░рдгрд╛рд░ рдирд╛рд╣реА рдЕрд╢рд╛ рд╕реНрдерд┐рддреАрдд рдЕрд╕рддреЗ. рдЦрд▒реНрдпрд╛ рд╢рд╛рд│рд╛ campus рд╡рд╛рдкрд░рддрд╛рдд: рдЗрдорд╛рд░рддреА A рдЖрдгрд┐ B (availability zones тАФ рд╡реЗрдЧрд│реА рд╡реАрдЬ, рд╕рдЧрд│реЗрдЪ рд╡реЗрдЧрд│реЗ), рдЖрдгрд┐ рдПрдХ рдирд┐рдпрдо: "рд╕рдВрдкреВрд░реНрдг рд╡рд░реНрдЧ рдХрдзреАрдЪ рдПрдХрд╛ рдЗрдорд╛рд░рддреАрдд рдмрд╕рд╡реВ рдирдХрд╛." рдЗрдорд╛рд░рдд A рдЬрд│рд▓реА? рджреБрдГрдЦрд╛рдЪрд╛ рджрд┐рд╡рд╕, рдкрдг рд╡рд░реНрдЧ B рдордзреНрдпреЗ рд╕реБрд░реВ рд░рд╛рд╣рддрд╛рдд. рд╣реЗрдЪ multi-AZ.

рдкрд░реАрдХреНрд╖реЗрдЪреНрдпрд╛ рджрд┐рд╡рд╕рд╛рдЪрд╛ рдкреНрд░рд╢реНрди. ЁЯУЭ рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╢реА рд╣рдЬрд╛рд░ рдкрд╛рд▓рдХ рдПрдХрджрдо рдпреЗрддрд╛рдд. рд╢рд╛рд│рд╛ рдПрдХ рд╢рд┐рдбреА рдЪрдврддреЗ, рдЖрдзреА рд╕рд░реНрд╡рд╛рдд рд╕реНрд╡рд╕реНрдд рдкрд╛рдпрд░реА:

  1. рдкреНрд░рддреНрдпреЗрдХ рдЦреЛрд▓реАрдд рдЬрд╛рд╕реНрдд рдорджрддрдиреАрд╕ ЁЯЩЛ (HPA, рдзрдбрд╛ 09): transport manager pods рд╡рд╛рдврд╡рддреЛ тАФ рдХрд╛рд╣реА рд╕реЗрдХрдВрдж, рдореЛрдлрдд, рдкрдг рдмрд╛рдХрд╛рдВрд╡рд░ рдЬрд╛рдЧрд╛ рдЕрд╕реЗрдкрд░реНрдпрдВрддрдЪ рдЪрд╛рд▓рддреЗ.
  2. рдЬрд╛рд╕реНрдд рдмрд╛рдХ ЁЯЦея╕П (cluster autoscaler): pods рдирд╛ рдмрд╕рд╛рдпрд▓рд╛ рдЬрд╛рдЧрд╛ рдирд╛рд╣реА, рддреЗ рдЙрднреЗ рдЖрд╣реЗрдд (Pending!) тЖТ рддреЛ ASG рдХрдбреЗ рдЖрдгрдЦреА EC2 рдмрд╛рдХ рдорд╛рдЧрддреЛ тАФ рдПрдХ-рджреЛрди рдорд┐рдирд┐рдЯреЗ рд▓рд╛рдЧрддрд╛рдд, рдкреИрд╕реЗ рд▓рд╛рдЧрддрд╛рдд, рдкрдг рдЦрд░реА рдорд░реНрдпрд╛рджрд╛ рд╕реЛрдбрд╡рддреЛ.
  3. рдЬреБрд│реНрдпрд╛рдВрдирд╛ рд╡реЗрдЧрд│реЗ рдмрд╕рд╡рд╛ ЁЯСп (topology spread): school-api рдЪреНрдпрд╛ рд╕рдЧрд│реНрдпрд╛ copies рдПрдХрд╛рдЪ рдЗрдорд╛рд░рддреАрдд рдареЗрд╡реВ рдирдХрд╛ тАФ 2 replicas = 2 рдЗрдорд╛рд░рддреА. рдЖрдЧреАрдЪрд╛ рдирд┐рдпрдо рдЖрдгрд┐ scaling рдЪреА рдЧреЛрд╖реНрдЯ рдЗрдереЗ рднреЗрдЯрддрд╛рдд.
  4. рд╕рдЧрд│реЗ рдПрдХрджрдо рдЬреЗрд╡рд╛рдпрд▓рд╛ рдирд╛рд╣реА ЁЯН╜я╕П (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

тЭУ рдХрд╛рдп

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 } }

ЁЯдФ рдХрд╛

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 рдХрд░рд╛

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯОУ 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

ЁЯПлЁЯПл Lesson 15 тАФ Multi-AZ & the scaling ladder

ЁЯУН You are here: Lesson 15 of 26 тАФ Part 2 ends here ┬╖ Previous: lesson-14-deploy-gitops ┬╖ Next: lesson-16-debugging тАФ Part 3 begins!


ЁЯУж What's in this branch

All previous lessons, plus the two questions every real cluster must answer: what if a whole building burns down? (multi-AZ) and what happens on exam-results day? (the scaling ladder). Real files:

ЁЯзТ Explain like I'm 5

The fire problem. ЁЯПлЁЯФе A school that puts every kid in ONE building has one fire away from no school at all. Real schools use a campus: buildings A and B (availability zones тАФ separate power, separate everything), and one rule: "never seat the whole class in one building." Building A burns? Sad day, but classes continue in B. That's multi-AZ.

The exam-day problem. ЁЯУЭ On results day, a thousand parents arrive at once. The school climbs a ladder, cheapest rung first:

  1. More helpers per room ЁЯЩЛ (HPA, lesson 09): the transport manager adds pods тАФ seconds, free, but only works while desks have space.
  2. More desks ЁЯЦея╕П (the cluster autoscaler): pods are standing with nowhere to sit (Pending!) тЖТ it asks the ASG for more EC2 desks тАФ takes a minute or two, costs money, solves the real limit.
  3. Spread the twins ЁЯСп (topology spread): don't put all school-api copies in one building тАФ 2 replicas = 2 buildings. The fire rule and the scaling story meet here.
  4. Never everyone at lunch at once ЁЯН╜я╕П (PodDisruptionBudget): during desk-shuffling (upgrades, scale-down), at least N helpers must stay on duty. Voluntary moves wait; the class is never unattended.

ЁЯЧ║я╕П Diagram

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

тЭУ What

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 } }

ЁЯдФ Why

An AZ outage is a when, not an if тАФ and it's survivable only if replicas, nodes AND traffic already span buildings before the fire. Scaling without multi-AZ is a fast single point of failure; multi-AZ without autoscaling is resilience that falls over at the first exam day. The ladder is the whole point of everything you've learned: lesson 03's monitor, lesson 09's buses, the AWS course's ASG desks тАФ climbing together.

ЁЯзк Try it

# 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 for this lesson

kubectl get nodes -L topology.kubernetes.io/zone ┬╖ kubectl get pdb

ЁЯФЧ Builds on: ЁЯкк AWS L07 (AZs are buildings) ┬╖ L12 (ASG)

тЬЕ Verify тАФ what you should see

kubectl get pods -o wide shows copies on different nodes/zones; ask for more pods than fit тЖТ Pending until the autoscaler adds a desk (EKS) тАФ on minikube they stay Pending.

ЁЯз╣ Clean up

scale back down; on EKS destroy the extra nodes/cluster same day

тЪая╕П Common mistakes

ЁЯОУ The campus is complete

Self-healing pods (03), rainy-day buses (09), zero-downtime substitutions (11), robots that deploy (14) тАФ and now a school that survives fires and results day. That's not a demo cluster anymore; that's an architecture. ЁЯПлЁЯПл

And now that it stands: Part 3 тАФ running it for real (lessons 16тАУ26): debugging, hall passes, homework bells, seating rules, and eyes on everything.

git checkout lesson-16-debugging   # ЁЯй║ the nurse's triage chart
тЖР Previousdeploy gitopsNext тЖТdebugging

This page is the lesson's README from the lesson-15-multi-az-scaling branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.