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

ЁЯЪМ рдзрдбрд╛ 09 тАФ Autoscaling: рдкрд╛рд╡рд╕рд╛рд│реА рджрд┐рд╡рд╢реА рдЬрд╛рджрд╛ рдмрд╕реЗрд╕

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 13 рдкреИрдХреА рдзрдбрд╛ 09 ┬╖ рдорд╛рдЧрдЪрд╛: lesson-08-resources ┬╖ рдкреБрдврдЪрд╛: lesson-10-ingress


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

рдзрдбреЗ 01тАУ08, рдЖрдгрд┐: HorizontalPodAutoscaler (HPA) тАФ load рд╡рд╛рдврд▓рд╛ рдХреА рд╡рд╛рдврдгрд╛рд░реЗ рдЖрдгрд┐ рд╢рд╛рдВрдд рдЭрд╛рд▓реЗ рдХреА рдкрд░рдд рдХрдореА рд╣реЛрдгрд╛рд░реЗ pods. рдЦрд░реА file:

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

рдЙрдиреНрд╣рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╢реА рд╢рд╛рд│реЗрдЪреНрдпрд╛ 2 рдмрд╕реЗрд╕ ЁЯЪМЁЯЪМ рдкреБрд░реЗрд╢рд╛ рдЕрд╕рддрд╛рдд тАФ рдХрд╛рд╣реА рдореБрд▓реЗ рдЪрд╛рд▓рдд рдпреЗрддрд╛рдд, рдХрд╛рд╣реА рд╕рд╛рдпрдХрд▓рдиреЗ. рдкрдг рдкрд╛рд╡рд╕рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╢реА рдкреНрд░рддреНрдпреЗрдХрд╛рд▓рд╛рдЪ рдмрд╕ рд╣рд╡реА рдЕрд╕рддреЗ! рдореБрд▓реЗ рджрд╛рдЯреАрд╡рд╛рдЯреАрдиреЗ рдмрд╕рддрд╛рдд, рджрдкреНрддрд░реЗ рдорд╛рдВрдбреАрд╡рд░, рдХреЛрдгреА рддрд░реА рдкрд╛рдпрд░реАрд╡рд░рдЪ рдмрд╕рд▓реЗрд▓реЗ рдЕрд╕рддреЗтАж ЁЯМзя╕ПЁЯШл

рдПрдХ рд╣реБрд╢рд╛рд░ рд╡рд╛рд╣рддреВрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдмрд╕реЗрд╕ рдХрд┐рддреА рднрд░рд▓реНрдпрд╛ рдЖрд╣реЗрдд рддреЗ рдкрд╛рд╣рдд рдЕрд╕рддреЛ:

HPA рдореНрд╣рдгрдЬреЗ рд╣рд╛рдЪ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ: рддреЛ рджрд░ 15 рд╕реЗрдХрдВрджрд╛рдВрдиреА рддреБрдордЪреНрдпрд╛ pods рдЪрд╛ CPU рдкрд╛рд╣рддреЛ рдЖрдгрд┐ pods рд╡рд╛рдврд╡рддреЛ рдХрд┐рдВрд╡рд╛ рдХрдореА рдХрд░рддреЛ (рдореЛрдареЗ pods рдирд╛рд╣реА тАФ рдЬрд╛рд╕реНрдд pods; рд╣реЗрдЪ "horizontal").

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart TB
    M["ЁЯУК metrics-server<br/>collects CPU usage"]
    H["ЁЯзСтАНЁЯТ╝ HPA - transport manager<br/>target: 70% of requested CPU<br/>min 2, max 5"]
    D["Deployment school-api<br/>replicas: тЖР HPA edits this"]
    P1["ЁЯЪМ pod 1"]
    P2["ЁЯЪМ pod 2"]
    P3["ЁЯЪМ pod 3 - rainy day"]
    P4["ЁЯЪМ pod 4 - storm!"]
    M --> H -->|"avg CPU 85% тЖТ scale up!<br/>avg CPU 20% тЖТ scale down"| D
    D --> P1 & P2
    D -.-> P3 & P4

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

ЁЯдФ рдХрд╛

рдард░рд▓реЗрд▓реА рдХреНрд╖рдорддрд╛ рдиреЗрд╣рдореАрдЪ рдЪреБрдХреАрдЪреА рдЕрд╕рддреЗ: рд░рд╛рддреНрд░реА 3 рд╡рд╛рдЬрддрд╛ 5 pods рдЪреЗ рдкреИрд╕реЗ рднрд░рд╛ (рд╡рд╛рдпрд╛ ЁЯТ╕) рдХрд┐рдВрд╡рд╛ рдкрд░реАрдХреНрд╖реЗрдЪреНрдпрд╛ рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ рдЧрд░реНрджреАрдд 2 pods рдЪрд╛рд▓рд╡рд╛ (crash ЁЯШ▒). HPA рдкреНрд░рддреНрдпрдХреНрд╖ load рдЪреНрдпрд╛ рд╡рдХреНрд░рд╛рд╡рд░ рд╕реНрд╡рд╛рд░ рд╣реЛрддреЛ. рдЖрдгрд┐ рддреБрдореНрд╣реА рдмрд╛рдВрдзрд▓реЗрд▓реА рд╕реБрдВрджрд░ рд░рдЪрдирд╛ рдкрд╛рд╣рд╛: HPA рдПрдХ рдЖрдХрдбрд╛ рдмрджрд▓рддреЛ тЖТ Deployment (рдзрдбрд╛ 03) рдмрд╛рдХ рдмрдирд╡рддреЛ тЖТ Service (рдзрдбрд╛ 04) рддреНрдпрд╛рдВрдирд╛ рд▓рдЧреЗрдЪ рд╕рд╛рдорд╛рд╡реВрди рдШреЗрддреЗ тЖТ probes (рдзрдбрд╛ 07) рддреНрдпрд╛рдВрдЪреЗ traffic рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛рдд. рдкреНрд░рддреНрдпреЗрдХ рдзрдбрд╛ рдпрд╛ рдпрдВрддреНрд░рд╛рддрд▓реЗ рдПрдХ рдЪрд╛рдХ рдЖрд╣реЗ.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

k8s/hpa.yaml:

scaleTargetRef:
  kind: Deployment
  name: school-api        # whose bus fleet to manage
minReplicas: 2            # never fewer (availability floor)
maxReplicas: 5            # never more (budget ceiling)
metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70    # % of each pod's REQUESTED cpu

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

# minikube: enable metrics first:  minikube addons enable metrics-server
kubectl apply -f k8s/hpa.yaml
kubectl -n school get hpa -w          # TARGETS shows live %, e.g. 12%/70%

# Rainy day generator ЁЯМзя╕П тАФ hammer the API from a loop pod:
kubectl -n school run rain --rm -it --image=busybox --restart=Never \
  -- /bin/sh -c 'while true; do wget -qO- http://school-api >/dev/null; done'

# In another terminal, watch buses roll out (takes ~1тАУ2 min):
kubectl -n school get hpa,pods -w

# Ctrl+C the rain pod, then watch it calmly scale back to 2 (~5 min).

ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl

kubectl get hpa -w ┬╖ kubectl top pods

ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L12 (ASG) ┬╖ L18 (alarm тЖТ action)

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

load рдЦрд╛рд▓реА kubectl get hpa -w 2 рдкрд╛рд╕реВрди 5 рдХрдбреЗ рдЪрдврддреЛ; рд╢рд╛рдВрдд рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рд╣рд│реВрд╣рд│реВ рдкрд░рдд рдЦрд╛рд▓реА рдпреЗрддреЛ.

ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ

kubectl delete hpa тАФ рдЖрдгрд┐ load generator pod рдХрд╛рдвреВрди рдЯрд╛рдХрд╛

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

тПня╕П рдкреБрдвреЗ

рдЖрддрд╛рдкрд░реНрдпрдВрддрдЪреЗ рд╕рдЧрд│реЗ рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдЖрдд рдЖрд╣реЗ. рдмрд╛рд╣реЗрд░рдЪреЗ рдЬрдЧ тАФ рдкрд╛рд▓рдХ, browsers, internet тАФ рдЖрдд рдХрд╕реЗ рдпреЗрддреЗ? рдореБрдЦреНрдп рдлрд╛рдЯрдХрд╛рддреВрди: Ingress.

git checkout lesson-10-ingress

ЁЯЪМ Lesson 09 тАФ Autoscaling: extra buses on rainy days

ЁЯУН You are here: Lesson 09 of 13 ┬╖ Previous: lesson-08-resources ┬╖ Next: lesson-10-ingress


ЁЯУж What's in this branch

Lessons 01тАУ08, plus: the HorizontalPodAutoscaler (HPA) тАФ pods that multiply under load and shrink back when it's quiet. Real file:

ЁЯзТ Explain like I'm 5

On sunny days, 2 school buses ЁЯЪМЁЯЪМ are plenty тАФ some kids walk, some cycle. But on a rainy day, EVERYONE wants the bus! Kids squeeze in, bags on laps, someone's sitting on the stepsтАж ЁЯМзя╕ПЁЯШл

A smart transport manager watches how full the buses are:

The HPA is that manager: it watches your pods' CPU every 15 seconds and adds or removes pods (not bigger pods тАФ MORE pods; that's the "horizontal").

ЁЯЧ║я╕П Diagram

flowchart TB
    M["ЁЯУК metrics-server<br/>collects CPU usage"]
    H["ЁЯзСтАНЁЯТ╝ HPA - transport manager<br/>target: 70% of requested CPU<br/>min 2, max 5"]
    D["Deployment school-api<br/>replicas: тЖР HPA edits this"]
    P1["ЁЯЪМ pod 1"]
    P2["ЁЯЪМ pod 2"]
    P3["ЁЯЪМ pod 3 - rainy day"]
    P4["ЁЯЪМ pod 4 - storm!"]
    M --> H -->|"avg CPU 85% тЖТ scale up!<br/>avg CPU 20% тЖТ scale down"| D
    D --> P1 & P2
    D -.-> P3 & P4

тЭУ What

ЁЯдФ Why

Fixed capacity is always wrong: pay for 5 pods at 3 AM (waste ЁЯТ╕) or run 2 pods during the exam-results rush (crash ЁЯШ▒). The HPA rides the actual load curve. And notice the beautiful stack you've built: HPA changes a number тЖТ the Deployment (lesson 03) makes desks тЖТ the Service (lesson 04) instantly includes them тЖТ probes (lesson 07) gate their traffic. Every lesson is a gear in this machine.

ЁЯФз How (in this repo)

k8s/hpa.yaml:

scaleTargetRef:
  kind: Deployment
  name: school-api        # whose bus fleet to manage
minReplicas: 2            # never fewer (availability floor)
maxReplicas: 5            # never more (budget ceiling)
metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70    # % of each pod's REQUESTED cpu

ЁЯзк Try it

# minikube: enable metrics first:  minikube addons enable metrics-server
kubectl apply -f k8s/hpa.yaml
kubectl -n school get hpa -w          # TARGETS shows live %, e.g. 12%/70%

# Rainy day generator ЁЯМзя╕П тАФ hammer the API from a loop pod:
kubectl -n school run rain --rm -it --image=busybox --restart=Never \
  -- /bin/sh -c 'while true; do wget -qO- http://school-api >/dev/null; done'

# In another terminal, watch buses roll out (takes ~1тАУ2 min):
kubectl -n school get hpa,pods -w

# Ctrl+C the rain pod, then watch it calmly scale back to 2 (~5 min).

ЁЯФз kubectl for this lesson

kubectl get hpa -w ┬╖ kubectl top pods

ЁЯФЧ Builds on: ЁЯкк AWS L12 (ASG) ┬╖ L18 (alarm тЖТ action)

тЬЕ Verify тАФ what you should see

under load kubectl get hpa -w climbs from 2 toward 5; when quiet it walks back down slowly.

ЁЯз╣ Clean up

kubectl delete hpa тАФ and remove the load generator pod

тЪая╕П Common mistakes

тПня╕П Next

Everything so far is inside the school. How does the outside world тАФ parents, browsers, the internet тАФ get in? Through the main gate: Ingress.

git checkout lesson-10-ingress
тЖР PreviousresourcesNext тЖТingress

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