ЁЯНЫ рдзрдбрд╛ 08 тАФ Requests рдЖрдгрд┐ limits: рдЬреЗрд╡рдгрд╛рдЪреЗ рд╡рд╛рдЯреЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 13 рдкреИрдХреА рдзрдбрд╛ 08 ┬╖ рдорд╛рдЧрдЪрд╛: lesson-07-health-probes ┬╖ рдкреБрдврдЪрд╛: lesson-09-autoscaling
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ07, рдЖрдгрд┐: resource requests рдЖрдгрд┐ limits тАФ CPU рдЖрдгрд┐ memory рдиреНрдпрд╛рдпреНрдп рдкрджреНрдзрддреАрдиреЗ рдХрд╕реЗ рд╡рд╛рдЯрд▓реЗ рдЬрд╛рддрд╛рдд, рдЖрдгрд┐ pod рдХреЛрдгрддреНрдпрд╛ machine рд╡рд░ рдЬрд╛рдИрд▓ рд╣реЗ Kubernetes рдХрд╕реЗ рдард░рд╡рддреЛ. рдЦрд░реА file:
- k8s/deployment.yaml тАФ
resources:block
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│реЗрдЪреЗ рдЙрдкрд╛рд╣рд╛рд░рдЧреГрд╣ ЁЯНЫ. рдЬреЗрд╡рдгрд╛рдЪреА рд╡реЗрд│ рдиреНрдпрд╛рдпреНрдп рдареЗрд╡рдгрд╛рд░реЗ рджреЛрди рдирд┐рдпрдо:
рд╡рдЪрди рджрд┐рд▓реЗрд▓реЗ рддрд╛рдЯ тАФ рдкреНрд░рддреНрдпреЗрдХ рдореБрд▓рд╛рд▓рд╛ рдПрдХрд╛ рддрд╛рдЯрднрд░ рдЬреЗрд╡рдгрд╛рдЪреА рд╣рдореА рдЕрд╕рддреЗ. рдореБрд▓рд╛рдВрдирд╛ рдЖрдд рдШреЗрдгреНрдпрд╛рдЖрдзреА рд╕реНрд╡рдпрдВрдкрд╛рдХреА рддрд╛рдЯреЗ рдореЛрдЬрддрд╛рдд: 30 рддрд╛рдЯреЗ, 30 рдореБрд▓реЗ, рджрд╛рд░ рдмрдВрдж. рдЬреНрдпрд╛ рдЙрдкрд╛рд╣рд╛рд░рдЧреГрд╣рд╛рдд рдЬреЗрд╡рд╛рдпрд▓рд╛ рдорд┐рд│рдгрд╛рд░ рдирд╛рд╣реА рддрд┐рдереЗ рдХреЛрдгреАрдЪ рдЬрд╛рдд рдирд╛рд╣реА. тЖТ рд╣рд╛ request: рдПрдХ рдЖрд░рдХреНрд╖рдг. Kubernetes pod рдлрдХреНрдд рдЕрд╢рд╛рдЪ machine рд╡рд░ рдареЗрд╡рддреЛ рдЬрд┐рдереЗ рдЕрдЬреВрди рддрд┐рддрдХрд╛ CPU/RAM рд╢рд┐рд▓реНрд▓рдХ рдЖрд╣реЗ.
рдкреБрдиреНрд╣рд╛ рд╡рд╛рдврдгреНрдпрд╛рдЪреА рдорд░реНрдпрд╛рджрд╛ тАФ рднреБрдХреЗрд▓реЗ рдореВрд▓ рдкреБрдиреНрд╣рд╛ рд╡рд╛рдвреВрди рдШреЗрдК рд╢рдХрддреЗ, рдкрдг рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд 2 рдЬрд╛рджрд╛ рдкрд│реНрдпрд╛. рдЗрддрд░рд╛рдВрдирд╛ рдЙрдкрд╛рд╢реА рдареЗрд╡реВрди рдХреЛрдгреАрд╣реА рд╕рдВрдкреВрд░реНрдг рдкрд╛рддреЗрд▓реЗ рд░рд┐рдХрд╛рдореЗ рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА. тЖТ рд╣рд╛ limit: pod рдЦрд░реЛрдЦрд░ рдХрд┐рддреА рд╡рд╛рдкрд░реВ рд╢рдХрддреЛ рддреНрдпрд╛рд╡рд░рдЪреА рдкрдХреНрдХреА рдорд░реНрдпрд╛рджрд╛.
рдорд╛рддреНрд░ рдорд░реНрдпрд╛рджрд╛ рдЧрд╛рдард▓реНрдпрд╛рд╡рд░ рд╡реЗрдЧрд╡реЗрдЧрд│реЗ рдкрджрд╛рд░реНрде рд╡реЗрдЧрд╡реЗрдЧрд│реЗ рд╡рд╛рдЧрддрд╛рдд:
- CPU рдореНрд╣рдгрдЬреЗ рд╕реВрдк ЁЯН▓ тАФ рдорд░реНрдпрд╛рджрд╛ рдЧрд╛рдард▓реА рддрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рд╣рд│реВ рд╡рд╛рдврд▓реЗ рдЬрд╛рддреЗ (throttled). рддреНрд░рд╛рд╕рджрд╛рдпрдХ, рдкрдг рдЬреАрд╡рдШреЗрдгреЗ рдирд╛рд╣реА.
- Memory рдореНрд╣рдгрдЬреЗ рддреБрдордЪреЗ рдкреЛрдЯ ЁЯлГ тАФ рдЗрдереЗ "рд╣рд│реВ рдЦрд╛рдгреЗ" рдЕрд╕реЗ рдХрд╛рд╣реА рдирд╛рд╣реА. Pod рдиреЗ limit рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд memory рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛ рддрд░ рддреЛ рдЬрд╛рдЧреАрдЪ рдорд╛рд░рд▓рд╛ рдЬрд╛рддреЛ (рдкреНрд░рд╕рд┐рджреНрдз OOMKilled).
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
subgraph node["ЁЯЦея╕П Node - machine with 2 CPU, 4Gi RAM"]
subgraph p1["ЁЯкС school-api pod"]
r1["request: 100m CPU, 128Mi<br/>= reserved seat"]
l1["limit: 500m CPU, 256Mi<br/>= max scoops"]
end
subgraph p2["ЁЯкС school-analytics pod"]
r2["request: 100m, 128Mi"]
l2["limit: 500m, 256Mi"]
end
free["ЁЯЯй unreserved space<br/>scheduler can place more pods here"]
end
sched["ЁЯУЛ Scheduler - the cook counting plates"] -->|"places pods only where<br/>requests still fit"| node
тЭУ рдХрд╛рдп
requestsтАФ pod рд▓рд╛ рдЬреНрдпрд╛рдЪреА рд╣рдореА рдЖрд╣реЗ рддреЗ. Scheduler node рдирд┐рд╡рдбрддрд╛рдирд╛ рд╣реЗ рд╡рд╛рдкрд░рддреЛ ("рдпрд╛ machine рд╡рд░ рдЕрдЬреВрди 100m CPU + 128Mi рдЖрд░рдХреНрд╖рд┐рдд рди рдХреЗрд▓реЗрд▓реЗ рдЖрд╣реЗ рдХрд╛?").limitsтАФ pod рдиреЗ рдХрдзреАрдЪ рдУрд▓рд╛рдВрдбреВ рдирдпреЗ рддреЗ. CPU limit рд╡рд░ рдЧреЗрд▓рд╛ тЖТ throttled; memory limit рд╡рд░ рдЧреЗрд▓реА тЖТ container OOMKilled рдЖрдгрд┐ restart.- рдПрдХрдХреЗ:
100m= 100 millicores = 0.1 CPU core.128Mi= 128 mebibytes. - рд╣реЗрдЪ рдЖрдХрдбреЗ HPA рдЪреА рдореЛрдЬрдкрдЯреНрдЯреА (рдзрдбрд╛ 09) рдкрдг рдЖрд╣реЗрдд: "70% CPU" рдореНрд╣рдгрдЬреЗ request рдЪреНрдпрд╛ 70%, рдореНрд╣рдгрдЬреЗ рдЖрдкрд▓реНрдпрд╛ 100m рдкреИрдХреА 70m.
ЁЯдФ рдХрд╛
Requests рдирд╕рддреАрд▓ рддрд░ scheduler рдбреЛрд│реНрдпрд╛рд╡рд░ рдкрдЯреНрдЯреА рдмрд╛рдВрдзреВрди рдЙрдкрд╛рд╣рд╛рд░рдЧреГрд╣ рднрд░рддреЛ тАФ 30 рддрд╛рдЯрд╛рдВрдЪреНрдпрд╛ рдЦреЛрд▓реАрдд 50 рдореБрд▓реЗ, рдЖрдгрд┐ рд╕рдЧрд│реНрдпрд╛рдВрдЪреЗ рдЬреЗрд╡рдг рдмрд┐рдШрдбрддреЗ (nodes рд╡рд░ рдУрдЭреЗ рд╡рд╛рдврддреЗ, рдХреЛрдгрддреЗрд╣реА pods рдорд░рддрд╛рдд). Limits рдирд╕рддреАрд▓ рддрд░ рдПрдХрдЪ рдЧрд│рдХреЗ app рд╕рдВрдкреВрд░реНрдг machine рдЦрд╛рдКрди рдЯрд╛рдХрддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рдирд┐рд░реНрджреЛрд╖ рд╢реЗрдЬрд╛рд▒реНрдпрд╛рдВрдирд╛рд╣реА рд╕реЛрдмрдд рдкрд╛рдбрддреЗ. Requests + limits = рдиреНрдпрд╛рдпреНрдп рд╡рд╛рдЯрдгреА + рдЕрдВрджрд╛рдЬ рдХрд░рддрд╛ рдпреЗрдгрд╛рд░реА рдЬрд╛рдЧрд╛ + рдлрдХреНрдд рдПрдХрд╛ pod рдЗрддрдХреА рдиреБрдХрд╕рд╛рдирд╛рдЪреА рд╕реАрдорд╛. рдкреНрд░рддреНрдпреЗрдХ production cluster review рдЪреА рд╕реБрд░реБрд╡рд╛рдд "рддреБрдордЪреНрдпрд╛ pods рд╡рд░ resources set рдЖрд╣реЗрдд рдХрд╛?" рдпрд╛рдиреЗ рд╣реЛрддреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
k8s/deployment.yaml рдордзреНрдпреЗ (analytics рдЪреНрдпрд╛ file рдордзреНрдпреЗрд╣реА рддрд╕реЗрдЪ):
resources:
requests:
cpu: 100m # reserve 0.1 core тЖТ scheduler's math
memory: 128Mi # reserve 128Mi
limits:
cpu: 500m # may burst to half a core, then throttled
memory: 256Mi # touch 257Mi тЖТ OOMKilled ЁЯТА
replicas: 2 рд╕рд╣, рд╣реЗ app рдПрдХреВрдг 200m CPU + 256Mi рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ тАФ scheduler рджрд┐рд╡рд╕рднрд░ рдкреНрд░рддреНрдпреЗрдХ
node рд╡рд░рдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ pod рд╕рд╛рдареА рд╣реЗ рдЧрдгрд┐рдд рдХрд░рддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
# What did the scheduler reserve on your node?
kubectl describe node | grep -A8 "Allocated resources"
# Live usage vs those numbers (needs metrics-server):
kubectl -n school top pods
# See an OOMKill with your own eyes (safe тАФ it's just one test pod):
kubectl -n school run greedy --restart=Never --image=polinux/stress \
--overrides='{"spec":{"containers":[{"name":"greedy","image":"polinux/stress",
"resources":{"limits":{"memory":"50Mi"}},
"args":["--vm","1","--vm-bytes","200M","--vm-hang","0"],"command":["stress"]}]}}'
kubectl -n school get pod greedy -w # тЖТ OOMKilled ЁЯТА (Ctrl+C, then clean up:)
kubectl -n school delete pod greedy
ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl
kubectl top pods ┬╖ kubectl describe node (Allocated resources)
ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L08 (types рдЖрдгрд┐ sizes тАФ рддреБрдореНрд╣реА рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рддреЗ рддрд╛рдЯ)
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
kubectl top pods рд╡рд╛рдкрд░ рджрд╛рдЦрд╡рддреЗ; memory limit рдЪреНрдпрд╛ рдкрд▓реАрдХрдбреЗ рдврдХрд▓рд╛ тЖТ pod OOMKilled рд╣реЛрдКрди restart рд╣реЛрддреЛ; CPU рдврдХрд▓рд╛ тЖТ рддреЛ рд╣рд│реВ рд╣реЛрддреЛ, рдХрдзреАрдЪ рдорд░рдд рдирд╛рд╣реА.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ
local cluster: kubectl delete -f k8s/ (рдХрд┐рдВрд╡рд╛ рддреБрдореНрд╣реА apply рдХреЗрд▓реЗрд▓реА file) тАФ EKS рд╡рд░ рдЪрд╛рд▓реВ рд░рд╛рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯреАрдЪреЗ рддрд╛рд╕рд╛рдкреНрд░рдорд╛рдгреЗ рдмрд┐рд▓ рд▓рд╛рдЧрддреЗ
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- requests рдЕрдЬрд┐рдмрд╛рдд рдирд╕рдгреЗ тАФ BestEffort, рд╕рд░реНрд╡рд╛рдд рдЖрдзреА evict рд╣реЛрддреЛ (L23)
- limits requests рдкреЗрдХреНрд╖рд╛ рдЦреВрдк рдЬрд╛рд╕реНрдд тАФ over-commit, рдЬреНрдпрд╛рдореБрд│реЗ рд╢реЗрдЬрд╛рд░реА OOMKilled рд╣реЛрддреЛ
тПня╕П рдкреБрдвреЗ
Requests рд╣реАрдЪ рдЖрддреНрддрд╛рдкрд░реНрдпрдВрддрдЪреНрдпрд╛ рд╕рд░реНрд╡рд╛рдд рднрд╛рд░реА рдпреБрдХреНрддреАрдЪреА рдореЛрдЬрдкрдЯреНрдЯреА рдЖрд╣реЗ: рдЧрд░реНрджреАрдЪреНрдпрд╛ рджрд┐рд╡рд╢реА рдЖрдкреЛрдЖрдк рд╡рд╛рдврдгрд╛рд░реЗ pods тАФ HorizontalPodAutoscaler.
git checkout lesson-09-autoscaling