Cases4 cases
1 to 4 of 4
IL-0044Prometheus OOMKilled in a loop while replaying its write-ahead log after a kube-prometheus-stack upgradeSaifeddine Rajhi2024- Symptoms
After an upgrade of the kube-prometheus-stack Helm chart, several pods stayed not ready. Among them was prometheus-prometheus-operator-prometheus-0, showing 3/4 Running and a recent termination.
- Trigger
During the kube-prometheus-stack Helm chart upgrade, Prometheus had to replay its write-ahead log on startup, and the replay needed more memory than its limit allowed.
- Root cause
- Component
- Contributing factor
- Detection
The team noticed pods not ready after the Helm chart upgrade and found the OOMKilled termination with kubectl describe pod.
- Remediation
- ran promtool tsdb analyze inside the Prometheus pod to find high-cardinality metrics such as haproxy_server_http_responses_total
- Action items
- Verify that the memory overhead during WAL replay stays within acceptable limits, for example 10 to 15%, and do not run Prometheus close to its memory limit
- Optimise storage, scraping and remote write configuration and upgrade to newer Prometheus releases
- Recover automatically from OOM crash loops, for example by deleting the WAL on OOM events
- Enforce scrape limits so Prometheus stops scraping targets when memory use passes a threshold
- Lessons
Size Prometheus for its restart, not only for steady state: WAL replay can need far more memory than normal running, and a Prometheus that already runs near its limit can be OOM-killed during the replay. Much of Prometheus memory use comes from cardinality, which promtool tsdb analyze can measure even when Prometheus itself is down.
- Symptoms
At 12:32 Prometheus on the Cloud Platform was not available after a planned change, and the Prometheus pod had restarted several times. The platform lost its monitoring and had missing metrics for the period.
- Trigger
A planned change restarted Prometheus at a time when the WAL count was high.
- Root cause
- Component
- Contributing factor
- Detection
The team saw that the Prometheus pod had restarted several times after the planned change.
- Remediation
- raised the Prometheus startupProbe threshold to 30 minutes
- Action items
- Perform planned Prometheus restarts when the WAL count is lower
- Set the default CPU and memory requests to meet maximum usage
- Create a test setup that recreates the live WAL count
- Explore the memory-snapshot-on-shutdown and auto-gomaxprocs feature flags
- Explore storing WAL files remotely in a different location
- Look into a blue-green Prometheus to test changes on a live-like setup before applying them to live
- Spike into Amazon Managed Prometheus
- Symptoms
At 14:05 on 25 July 2023, a high-priority PagerDuty alert from Pingdom reported that the "Prometheus - live healthcheck" was DOWN. Prometheus on the live cluster was unavailable, and the Cloud Platform lost its monitoring for a while.
- Trigger
The growing number of namespaces and Prometheus rules raised Prometheus' memory needs beyond what its node instance size could hold.
- Root cause
- Component
- Contributing factor
- Detection
A Pingdom health check on Prometheus failed and raised a high-priority PagerDuty alert.
- Remediation
- drained the monitoring node, moving Prometheus to another monitoring node
- changed the node instance size to r6i.4xlarge
- raised the Prometheus memory limit to 100Gi
- set the Prometheus container limits to 12 CPU cores and 110Gi of memory
- Action items
- Add an alert on node memory usage and on a pod using up most of a node's memory (issue #4538)
IL-0176Prometheus in a 235-node Kubernetes cluster crash-looped because over two million series exhausted host memory and the kernel OOM killer chose it first, as Burstable QoS gave it oom_score_adj 999LINE2020- Symptoms
One Monday morning the author opened the Prometheus dashboard to check a Kubernetes cluster for alerts and could not reach it. The Prometheus pod was in CrashLoopBackOff: kubectl get pods showed it 1/2 ready with 950 restarts over 3d20h on worker3.
- Trigger
After start, the Prometheus time series count rose to 2,162,256 within five minutes and its memory use filled the 8GB host.
- Root cause
- Component
- Contributing factor
- Detection
The author found it on a Monday morning when the Prometheus dashboard, opened to check the cluster for alerts, could not be reached.
- Remediation
- removed most of the unnecessary settings from the Prometheus ConfigMap, after which the container stopped crashing
- Action items
- Set appropriate resource requests and limits on the Prometheus pod
- Reduce unneeded metrics by adjusting scrape targets or scrape interval
- Estimate Prometheus memory needs, provide dedicated hosts with a node label such as deploy-topology: Prometheus, and pin the Prometheus pod to them with a nodeSelector
- Lessons
Exit code 137 together with an OOM event in the kubelet log means the kernel killed the container, not kubelet. Under node memory pressure the kernel kills the process with the highest score, and kubelet derives each container's oom_score_adj from the pod's QoS class: a container without a memory request in a pod where another container has one ends up Burstable with a score near 1000, so it is killed first. In a large cluster, Prometheus memory needs to be estimated from the expected series count and requested explicitly.
These 4 cases involve Prometheus and Container memory limit. kubegap audits a Kubernetes cluster for gaps like these, read-only, from Claude Code or Codex; its checks cite public reports like the ones in this library.
By root cause1
Capacity exhaustion4 cases
- Contributing factor
- Organisation
IL-0044Prometheus OOMKilled in a loop while replaying its write-ahead log after a kube-prometheus-stack upgradeSaifeddine Rajhi2024IL-0046Prometheus restarted again and again because its WAL replay took longer than the startup probe allowedIL-0016Prometheus on the live cluster ran out of memory and was OOMKilled, and the monitoring node it ran on went NotReadyIL-0176Prometheus in a 235-node Kubernetes cluster crash-looped because over two million series exhausted host memory and the kernel OOM killer chose it first, as Burstable QoS gave it oom_score_adj 999LINE2020