Kubernetes Evicting Pods: Node Under Memory/Disk Pressure

The kubelet evicts pods when a node runs low on memory or disk. The kubectl describe output names the condition — and the fix targets whichever resource is actually exhausted, before pods come back.

What you'll see

Root causes

Real node overcommitment

More requests landed than the node can serve, or unmanaged DaemonSets/leaked emptyDir fill the disk. kubectl describe node's Allocated resources vs Capacity shows the math.

Garbage accumulation (images, logs, emptyDir)

Disk pressure often isn't workloads: old container images, huge logs, or emptyDir volumes accumulate until the kubelet's eviction threshold fires. df -h on the node plus crictl image list tell you which.

Fix it

  1. Confirm which pressure and by how much
    kubectl describe node <node> | grep -A 12 'Conditions:'
  2. Identify the top consumers
    kubectl describe node <node> | sed -n '/Allocated resources/,/Events/p'   # per-pod requests table
  3. Disk: reclaim before it evicts again
    # on the node: crictl image prune -a (careful: cache cost) ; journalctl --vacuum-size=500M ; check emptyDir users
  4. Memory: set requests/limits so the scheduler can protect the node
    kubectl set resources deploy <d> --limits=memory=2Gi --requests=memory=1Gi

Field note

Evicted pods are a symptom of node self-protection, not a pod bug — deleting and recreating them changes nothing until the node's pressure clears. system-reserved and kube-reserved should carve headroom so workloads can't push the kubelet into eviction territory in the first place.

Common questions

Why was MY pod evicted and not a noisier neighbor?

The kubelet ranks by usage exceeding requests (for memory) and by priority class. Pods without requests look infinitely overcommitted — a strong reason to always set them.

How is eviction different from an OOMKill?

Eviction is the kubelet acting preemptively on NODE pressure; OOMKill is the kernel enforcing a POD limit. The fix differs: eviction means node-level headroom, OOMKill means the limit or the workload's appetite.

Ship it right the first time

Kustomize base with probes, PDBs, and zero-downtime rollouts already wired.

Kubernetes Production Blueprints — $27 →

One-time. Yours to modify. Instant download from the NinjaOps template store.

Get new fixes by email

One short email when new fixes and production templates drop. No spam, unsubscribe anytime.

Partner pick — sponsored

Vultr — our lab-environment pick for this stack

Spin up a cloud server in 60 seconds and reproduce this fix yourself — pay by the hour.

Get Vultr →
Also vetted

Sentry — Free tier: see the exact line of code that broke, before users report it.

Get Sentry →

We earn a commission if you buy through our links — it never costs you extra. More vetted tools on our picks hub · comparing clouds? DigitalOcean vs Vultr and vs AWS · full deals: DigitalOcean · Vultr · NordLayer · Semrush