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

ЁЯНЫ рдзрдбрд╛ 08 тАФ Requests рдЖрдгрд┐ limits: рдЬреЗрд╡рдгрд╛рдЪреЗ рд╡рд╛рдЯреЗ

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


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

рдзрдбреЗ 01тАУ07, рдЖрдгрд┐: resource requests рдЖрдгрд┐ limits тАФ CPU рдЖрдгрд┐ memory рдиреНрдпрд╛рдпреНрдп рдкрджреНрдзрддреАрдиреЗ рдХрд╕реЗ рд╡рд╛рдЯрд▓реЗ рдЬрд╛рддрд╛рдд, рдЖрдгрд┐ pod рдХреЛрдгрддреНрдпрд╛ machine рд╡рд░ рдЬрд╛рдИрд▓ рд╣реЗ Kubernetes рдХрд╕реЗ рдард░рд╡рддреЛ. рдЦрд░реА file:

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

рд╢рд╛рд│реЗрдЪреЗ рдЙрдкрд╛рд╣рд╛рд░рдЧреГрд╣ ЁЯНЫ. рдЬреЗрд╡рдгрд╛рдЪреА рд╡реЗрд│ рдиреНрдпрд╛рдпреНрдп рдареЗрд╡рдгрд╛рд░реЗ рджреЛрди рдирд┐рдпрдо:

  1. рд╡рдЪрди рджрд┐рд▓реЗрд▓реЗ рддрд╛рдЯ тАФ рдкреНрд░рддреНрдпреЗрдХ рдореБрд▓рд╛рд▓рд╛ рдПрдХрд╛ рддрд╛рдЯрднрд░ рдЬреЗрд╡рдгрд╛рдЪреА рд╣рдореА рдЕрд╕рддреЗ. рдореБрд▓рд╛рдВрдирд╛ рдЖрдд рдШреЗрдгреНрдпрд╛рдЖрдзреА рд╕реНрд╡рдпрдВрдкрд╛рдХреА рддрд╛рдЯреЗ рдореЛрдЬрддрд╛рдд: 30 рддрд╛рдЯреЗ, 30 рдореБрд▓реЗ, рджрд╛рд░ рдмрдВрдж. рдЬреНрдпрд╛ рдЙрдкрд╛рд╣рд╛рд░рдЧреГрд╣рд╛рдд рдЬреЗрд╡рд╛рдпрд▓рд╛ рдорд┐рд│рдгрд╛рд░ рдирд╛рд╣реА рддрд┐рдереЗ рдХреЛрдгреАрдЪ рдЬрд╛рдд рдирд╛рд╣реА. тЖТ рд╣рд╛ request: рдПрдХ рдЖрд░рдХреНрд╖рдг. Kubernetes pod рдлрдХреНрдд рдЕрд╢рд╛рдЪ machine рд╡рд░ рдареЗрд╡рддреЛ рдЬрд┐рдереЗ рдЕрдЬреВрди рддрд┐рддрдХрд╛ CPU/RAM рд╢рд┐рд▓реНрд▓рдХ рдЖрд╣реЗ.

  2. рдкреБрдиреНрд╣рд╛ рд╡рд╛рдврдгреНрдпрд╛рдЪреА рдорд░реНрдпрд╛рджрд╛ тАФ рднреБрдХреЗрд▓реЗ рдореВрд▓ рдкреБрдиреНрд╣рд╛ рд╡рд╛рдвреВрди рдШреЗрдК рд╢рдХрддреЗ, рдкрдг рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд 2 рдЬрд╛рджрд╛ рдкрд│реНрдпрд╛. рдЗрддрд░рд╛рдВрдирд╛ рдЙрдкрд╛рд╢реА рдареЗрд╡реВрди рдХреЛрдгреАрд╣реА рд╕рдВрдкреВрд░реНрдг рдкрд╛рддреЗрд▓реЗ рд░рд┐рдХрд╛рдореЗ рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА. тЖТ рд╣рд╛ limit: pod рдЦрд░реЛрдЦрд░ рдХрд┐рддреА рд╡рд╛рдкрд░реВ рд╢рдХрддреЛ рддреНрдпрд╛рд╡рд░рдЪреА рдкрдХреНрдХреА рдорд░реНрдпрд╛рджрд╛.

рдорд╛рддреНрд░ рдорд░реНрдпрд╛рджрд╛ рдЧрд╛рдард▓реНрдпрд╛рд╡рд░ рд╡реЗрдЧрд╡реЗрдЧрд│реЗ рдкрджрд╛рд░реНрде рд╡реЗрдЧрд╡реЗрдЧрд│реЗ рд╡рд╛рдЧрддрд╛рдд:

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

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 рдирд╕рддреАрд▓ рддрд░ 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 рд╣реАрдЪ рдЖрддреНрддрд╛рдкрд░реНрдпрдВрддрдЪреНрдпрд╛ рд╕рд░реНрд╡рд╛рдд рднрд╛рд░реА рдпреБрдХреНрддреАрдЪреА рдореЛрдЬрдкрдЯреНрдЯреА рдЖрд╣реЗ: рдЧрд░реНрджреАрдЪреНрдпрд╛ рджрд┐рд╡рд╢реА рдЖрдкреЛрдЖрдк рд╡рд╛рдврдгрд╛рд░реЗ pods тАФ HorizontalPodAutoscaler.

git checkout lesson-09-autoscaling

ЁЯНЫ Lesson 08 тАФ Requests & limits: lunch portions

ЁЯУН You are here: Lesson 08 of 13 ┬╖ Previous: lesson-07-health-probes ┬╖ Next: lesson-09-autoscaling


ЁЯУж What's in this branch

Lessons 01тАУ07, plus: resource requests and limits тАФ how CPU and memory are shared fairly, and how Kubernetes decides which machine a pod lands on. Real file:

ЁЯзТ Explain like I'm 5

School canteen ЁЯНЫ. Two rules keep lunchtime fair:

  1. The promised plate тАФ every kid is guaranteed one plate of food. The cook counts plates before letting kids in: 30 plates, 30 kids, door closed. Nobody enters a canteen that can't feed them. тЖТ That's the request: a reservation. Kubernetes only places a pod on a machine that still has that much CPU/RAM spare.

  2. The seconds cap тАФ a hungry kid may take seconds, but at most 2 extra scoops. No kid may empty the whole pot while others starve. тЖТ That's the limit: a hard cap on what the pod may actually use.

Different foods behave differently when you hit the cap, though:

ЁЯЧ║я╕П Diagram

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

тЭУ What

ЁЯдФ Why

Without requests, the scheduler is packing a canteen blindfolded тАФ 50 kids in a 30-plate room, and everyone's lunch is ruined (nodes overload, random pods die). Without limits, one leaky app eats a whole machine and takes its innocent neighbors down with it. Requests + limits = fair sharing + predictable placement + a blast radius of exactly one pod. Every production cluster review starts with "do your pods have resources set?".

ЁЯФз How (in this repo)

In k8s/deployment.yaml (same in the analytics one):

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 ЁЯТА

With replicas: 2, this app reserves 200m CPU + 256Mi total тАФ the scheduler does this arithmetic for every pod on every node, all day long.

ЁЯзк Try it

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

kubectl top pods ┬╖ kubectl describe node (Allocated resources)

ЁЯФЧ Builds on: ЁЯкк AWS L08 (types & sizes тАФ the plate you reserve)

тЬЕ Verify тАФ what you should see

kubectl top pods shows usage; push memory past the limit тЖТ the pod is OOMKilled and restarted; push CPU тЖТ it slows, never dies.

ЁЯз╣ Clean up

local cluster: kubectl delete -f k8s/ (or the file you applied) тАФ on EKS, anything left running bills by the hour

тЪая╕П Common mistakes

тПня╕П Next

Requests are the yardstick for the coolest trick yet: pods that multiply on busy days all by themselves тАФ the HorizontalPodAutoscaler.

git checkout lesson-09-autoscaling
тЖР Previoushealth probesNext тЖТautoscaling

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