ЁЯЪМ рдзрдбрд╛ 09 тАФ Autoscaling: рдкрд╛рд╡рд╕рд╛рд│реА рджрд┐рд╡рд╢реА рдЬрд╛рджрд╛ рдмрд╕реЗрд╕
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 13 рдкреИрдХреА рдзрдбрд╛ 09 ┬╖ рдорд╛рдЧрдЪрд╛: lesson-08-resources ┬╖ рдкреБрдврдЪрд╛: lesson-10-ingress
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ08, рдЖрдгрд┐: HorizontalPodAutoscaler (HPA) тАФ load рд╡рд╛рдврд▓рд╛ рдХреА рд╡рд╛рдврдгрд╛рд░реЗ рдЖрдгрд┐ рд╢рд╛рдВрдд рдЭрд╛рд▓реЗ рдХреА рдкрд░рдд рдХрдореА рд╣реЛрдгрд╛рд░реЗ pods. рдЦрд░реА file:
- k8s/hpa.yaml тАФ 70% CPU рд╡рд░
school-apiрд▓рд╛ 2 рддреЗ 5 pods рджрд░рдореНрдпрд╛рди scale рдХрд░рддреЗ
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдЙрдиреНрд╣рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╢реА рд╢рд╛рд│реЗрдЪреНрдпрд╛ 2 рдмрд╕реЗрд╕ ЁЯЪМЁЯЪМ рдкреБрд░реЗрд╢рд╛ рдЕрд╕рддрд╛рдд тАФ рдХрд╛рд╣реА рдореБрд▓реЗ рдЪрд╛рд▓рдд рдпреЗрддрд╛рдд, рдХрд╛рд╣реА рд╕рд╛рдпрдХрд▓рдиреЗ. рдкрдг рдкрд╛рд╡рд╕рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╢реА рдкреНрд░рддреНрдпреЗрдХрд╛рд▓рд╛рдЪ рдмрд╕ рд╣рд╡реА рдЕрд╕рддреЗ! рдореБрд▓реЗ рджрд╛рдЯреАрд╡рд╛рдЯреАрдиреЗ рдмрд╕рддрд╛рдд, рджрдкреНрддрд░реЗ рдорд╛рдВрдбреАрд╡рд░, рдХреЛрдгреА рддрд░реА рдкрд╛рдпрд░реАрд╡рд░рдЪ рдмрд╕рд▓реЗрд▓реЗ рдЕрд╕рддреЗтАж ЁЯМзя╕ПЁЯШл
рдПрдХ рд╣реБрд╢рд╛рд░ рд╡рд╛рд╣рддреВрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдмрд╕реЗрд╕ рдХрд┐рддреА рднрд░рд▓реНрдпрд╛ рдЖрд╣реЗрдд рддреЗ рдкрд╛рд╣рдд рдЕрд╕рддреЛ:
- 70% рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рднрд░рд▓реНрдпрд╛? тЖТ рдЖрдгрдЦреА рдПрдХ рдмрд╕ рдХрд╛рдврд╛. рддрд░реА рдЧрд░реНрджреА? рдЖрдгрдЦреА рдПрдХ тАФ рд╢рд╛рд│реЗрдХрдбреЗ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ 5 рдмрд╕реЗрд╕ рдкрд░реНрдпрдВрдд.
- рдКрди рдкрд░рдд рдЖрд▓реЗ, рдмрд╕реЗрд╕ рдЕрд░реНрдзреНрдпрд╛ рд░рд┐рдХрд╛рдореНрдпрд╛? тЖТ рдЬрд╛рджрд╛ рдмрд╕реЗрд╕ рдЙрднреНрдпрд╛ рдХрд░рд╛. рдкрдг рдХрдзреАрдЪ 2 рдкреЗрдХреНрд╖рд╛ рдХрдореА рдирд╛рд╣реА тАФ рд╕рд░реНрд╡рд╛рдд рд░рд┐рдХрд╛рдореНрдпрд╛ рджрд┐рд╡рд╢реАрд╣реА рдореБрд▓рд╛рдВрдирд╛ рдмрд╕рдиреЗ рдЬрд╛рддрд╛ рдЖрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ (рдЖрдгрд┐ рдПрдЦрд╛рджреА рдмрд╕ рдмрдВрдж рдкрдбреВ рд╢рдХрддреЗ тАФ рдзрдбрд╛ 03 рдЖрдард╡рд╛!).
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
тЭУ рдХрд╛рдп
- HPA рдПрдХ metric рдкрд╛рд╣рддреЛ (рдЗрдереЗ: рд╕рд░реНрд╡ pods рдордзрд▓рд╛ рд╕рд░рд╛рд╕рд░реА CPU, рдзрдбрд╛ 08 рдордзрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ pod
рдЪреНрдпрд╛ request рдЪреНрдпрд╛ % рдордзреНрдпреЗ тАФ 100m рдЪреЗ 70% = 70m) рдЖрдгрд┐ Deployment рд╡рд░рдЪреЗ
replicasminReplicas: 2рдЖрдгрд┐maxReplicas: 5рджрд░рдореНрдпрд╛рди рдмрджрд▓рддреЛ. - рддреНрдпрд╛рд╕рд╛рдареА metrics-server add-on install рдХреЗрд▓реЗрд▓реЗ рдЕрд╕рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ тАФ рдореЛрдЬрдорд╛рдк рдирд╛рд╣реА, рддрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдирд╛рд╣реА.
- Scale-up рдЬрд▓рдж рдЕрд╕рддреЛ (рднрд░рд▓реЗрд▓реНрдпрд╛ рдмрд╕реЗрд╕ рддрд╛рддрдбреАрдЪреЗ рдХрд╛рдо); scale-down рдореБрджреНрджрд╛рдо рд╣рд│реВ рдЖрдгрд┐ рд╕реНрдерд┐рд░ рдХреЗрд▓реЗрд▓рд╛ рдЕрд╕рддреЛ (рдкрд╛рдКрд╕ рдерд╛рдВрдмрд▓реНрдпрд╛ рдХреНрд╖рдгреА рдмрд╕ рдЙрднреА рдХрд░реВ рдирдХрд╛).
- Horizontal (рдЬрд╛рд╕реНрдд pods) рд╡рд┐рд░реБрджреНрдз vertical (рдореЛрдареЗ pods) тАФ web apps рдЬрд╡рд│рдЬрд╡рд│ рдиреЗрд╣рдореАрдЪ horizontally scale рд╣реЛрддрд╛рдд: рдПрдХрд╛ рдкреНрд░рдЪрдВрдб рдмрд╕рдкреЗрдХреНрд╖рд╛ рдЕрдиреЗрдХ рд▓рд╣рд╛рди рдПрдХрд╕рд╛рд░рдЦреНрдпрд╛ рдмрд╕реЗрд╕ рдЪрд╛рдВрдЧрд▓реНрдпрд╛.
ЁЯдФ рдХрд╛
рдард░рд▓реЗрд▓реА рдХреНрд╖рдорддрд╛ рдиреЗрд╣рдореАрдЪ рдЪреБрдХреАрдЪреА рдЕрд╕рддреЗ: рд░рд╛рддреНрд░реА 3 рд╡рд╛рдЬрддрд╛ 5 pods рдЪреЗ рдкреИрд╕реЗ рднрд░рд╛ (рд╡рд╛рдпрд╛ ЁЯТ╕) рдХрд┐рдВрд╡рд╛ рдкрд░реАрдХреНрд╖реЗрдЪреНрдпрд╛ рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ рдЧрд░реНрджреАрдд 2 pods рдЪрд╛рд▓рд╡рд╛ (crash ЁЯШ▒). HPA рдкреНрд░рддреНрдпрдХреНрд╖ load рдЪреНрдпрд╛ рд╡рдХреНрд░рд╛рд╡рд░ рд╕реНрд╡рд╛рд░ рд╣реЛрддреЛ. рдЖрдгрд┐ рддреБрдореНрд╣реА рдмрд╛рдВрдзрд▓реЗрд▓реА рд╕реБрдВрджрд░ рд░рдЪрдирд╛ рдкрд╛рд╣рд╛: HPA рдПрдХ рдЖрдХрдбрд╛ рдмрджрд▓рддреЛ тЖТ Deployment (рдзрдбрд╛ 03) рдмрд╛рдХ рдмрдирд╡рддреЛ тЖТ Service (рдзрдбрд╛ 04) рддреНрдпрд╛рдВрдирд╛ рд▓рдЧреЗрдЪ рд╕рд╛рдорд╛рд╡реВрди рдШреЗрддреЗ тЖТ probes (рдзрдбрд╛ 07) рддреНрдпрд╛рдВрдЪреЗ traffic рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛рдд. рдкреНрд░рддреНрдпреЗрдХ рдзрдбрд╛ рдпрд╛ рдпрдВрддреНрд░рд╛рддрд▓реЗ рдПрдХ рдЪрд╛рдХ рдЖрд╣реЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
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 рдХрд╛рдвреВрди рдЯрд╛рдХрд╛
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- resource requests рдирд╕рд▓реЗрд▓рд╛ HPA тАФ 'unknown' utilization, scaling рдирд╛рд╣реА
- Deployment manifest рдордзреНрдпреЗрд╣реА
replicas:set рдХрд░рдгреЗ (GitOps рдЖрдгрд┐ HPA рднрд╛рдВрдбрддрд╛рдд)
тПня╕П рдкреБрдвреЗ
рдЖрддрд╛рдкрд░реНрдпрдВрддрдЪреЗ рд╕рдЧрд│реЗ рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдЖрдд рдЖрд╣реЗ. рдмрд╛рд╣реЗрд░рдЪреЗ рдЬрдЧ тАФ рдкрд╛рд▓рдХ, browsers, internet тАФ рдЖрдд рдХрд╕реЗ рдпреЗрддреЗ? рдореБрдЦреНрдп рдлрд╛рдЯрдХрд╛рддреВрди: Ingress.
git checkout lesson-10-ingress