Lion Cipher Lab

Limit the blast radius of a runaway pod with ResourceQuotas and LimitRanges

Why it matters

One greedy pod can take a whole node down, and Kubernetes lets it by default. When you deploy a container without saying how much CPU or memory it may use, Kubernetes places no ceiling on it — it will happily claim whatever is free, and when memory runs out the kernel's out-of-memory killer starts terminating processes (an OOMKill) while the node's kubelet starts EVICTING pods to save itself. The pod that caused the pressure is not necessarily the one that dies; your other, innocent workloads on that node get starved, throttled, and evicted right alongside it. That is a denial of service, and…

What you'll learn

Steps in this lab

  1. The problem: 'no limits' is the default, and one pod can take the node down
  2. Stand up: your kind cluster, a test namespace, and an unbounded pod
  3. Measure the break: nothing in the namespace caps what it can claim
  4. Apply a LimitRange: watch Kubernetes inject defaults into a pod that set none
  5. Apply a ResourceQuota: watch admission REJECT an over-budget pod
  6. The judgment: when these are the right control, and how a pro combines them
  7. The honest negative: an availability guardrail, NOT a security boundary

Open the full interactive lab →