Skip to main content
All of the catalog
Injectable fault

Noisy neighbor: CPU-hungry tenant

You have been paged: the node go-api runs on is out of CPU. Nothing you deployed changed (same image, same replicas, same config) and the other two nodes are idle. Something else moved in, and it is taking the machine.

ResourcesLow severitylabfault-batch/report-batch
Definition on GitHub

Which app it breaks

go-api by default. Pass --app to break another app in your lab instead.

The hint ladder

Each hint narrows the search a little further. They are collapsed on purpose: open one only when you are properly stuck, because working out the next command yourself is the whole exercise.

Hint 1

The page named a node, not a workload, so stop looking inside go-api. Start by confirming what the page said, and notice that the other nodes are idle - whatever this is, it is in one place.

kubectl -n go-api get pods -o wide
kubectl top nodes
Hint 2

The node is full, and go-api is only a small part of it. Something else scheduled there is taking the rest. Rank every pod on the cluster by CPU and look at what is on top, then at what its Deployment asks for.

kubectl top pods -A --sort-by=cpu
Hint 3

labfault-batch/report-batch requests 500m per replica and sets no CPU limit. The request bought it a large share of the node's cycles; the missing limit means nothing stops it taking the rest, so each replica draws about double what it reserved. go-api keeps serving, its own request guarantees it a share, but it has lost the headroom to burst to the limit it was given.

Bound it, scale it away, or evict it. Then ask the question that matters: what would have stopped this being possible in the first place?

Get updates

New scenarios and faults, release notes, and news about hosted labs if and when there is some. A few emails a month at most.

We'll email you about new releases, new lab content and paid offerings such as hosted labs, courses and workshops. Unsubscribe any time.