Cases2 cases
1 to 2 of 2
IL-0028Temporal History service latency rose because its pods were CPU-throttled while CPU usage read below 60 percentTemporal2023- Symptoms
Request latency from the Temporal Server History service, the service that starts workflow executions and records their progress, was higher and less steady than it should be on a self-hosted Kubernetes deployment. The CPU dashboard showed the history pods using less than 60 percent of their CPU, yet the same pods were being throttled.
- Trigger
Normal load on History pods that had a CPU limit of 2 cores on 8-core nodes, with the Go runtime's GOMAXPROCS left at its default of one per node core.
- Root cause
- Component
- Contributing factor
- Detection
A Prometheus query for CPU throttling showed the history pods throttled although their CPU usage read under 60 percent.
- Remediation
- set the GOMAXPROCS environment variable to 2 to match the 2-core CPU limit
- Action items
- Set GOMAXPROCS automatically from the Kubernetes CPU limit, from Temporal release 1.21.0
- Lessons
A CPU usage graph averaged over 15 seconds or more can sit far below 100 percent while a container is being throttled, so throttling needs its own metric. A Go program in a container should have GOMAXPROCS matched to its CPU limit, or to its CPU request when it has no limit. The author recommends not using CPU limits at all.
IL-0070Critical pods on core nodes evicted when Prometheus began scraping about 200 nodes after a dask-gateway scale-up2i2c2023- Symptoms
The hub pod of the prod JupyterHub on the leap cluster (leap.2i2c.org) restarted unexpectedly during a large node scale-up, and a user opened a support ticket. The ingress-nginx and proxy pods kept running.
- Trigger
A user's dask-gateway workload added about 100 dask-worker nodes within a minute, and Prometheus started scraping the metrics exporters on about 200 nodes.
- Root cause
- Component
- Contributing factor
- Detection
A user support ticket (2i2c Freshdesk ticket 414) about the leap hub; the engineer then looked at Grafana and the cluster's nodes and events.
- Action items
- Configure CPU and memory requests for the hub and proxy pods (#2127; at least 100m CPU was proposed)
- Make the Grafana OOMKiller dashboard work (#2213)
- Move LEAP cloud infrastructure to shared nodes (#2209)
- Update resource requests and limits, mainly for ingress-nginx and Prometheus (#2324)
- Decide whether Prometheus should scrape dask worker pods (#2366)
- Lessons
Prometheus load grows with the number of nodes, so a burst of autoscaled nodes can push a nearly full core node over the edge and evict the pods that matter most. Core pods that request 10m of CPU get a tenth of the CPU share of busy neighbours that request 100m. Kubernetes events expire after an hour, so evidence of OOM kills needs a dashboard that keeps it.
These 2 cases involve Prometheus and Container CPU 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.