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 10:15 on 1 November 2023 a Pingdom check raised a PagerDuty high-priority alert that the "Prometheus - live healthcheck is DOWN". The same alert fired for the third time within a few minutes, and the incident was declared at 10:41.
- Root cause
- Component
- Contributing factor
- –
- Detection
A Pingdom health check on the live Prometheus failed and raised a PagerDuty high-priority alert.
- Remediation
- increased the Prometheus readiness probe timeout from 3 to 6 seconds
- Action items
- Inspect more closely to identify this kind of failure earlier
- Investigate whether the ingestion of data into the database is too big or too long
- Check whether executing some queries makes Prometheus work harder and stop responding to the readiness probe
- Check whether any other service probing Prometheus triggers the restart
- Check whether regular Velero backups disturb EBS reads and writes and cause the restart
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 kubelet. 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 cause2
Capacity exhaustion3 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-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
unknown1 case
- Component
- Contributing factor
- –
- Organisation