Cases2 cases
1 to 2 of 2
IL-0386After a move to Google Cloud, Postgres connection timeouts and memcached i/o timeouts spiked on GKE nodesincident.io2023- Symptoms
Shortly after incident.io moved its infrastructure fully into Google Cloud, the application saw a larger-than-normal number of Postgres connection timeouts, and new database connections per second were in the hundreds, spiking up and down. At the same time, the memcached instance used for transient data and faster API responses had sporadic connection timeouts.
- Trigger
After the move to Google Cloud, the application opened hundreds of new Postgres connections per second, and an accidental database join made it send thousands of duplicate calls to an external third party in parallel.
- Root cause
- Component
- Contributing factor
- Detection
An incident was declared when the number of Postgres connection timeouts rose above normal. The remaining cache timeouts were traced through the logs of the Kubernetes node that served an affected request, the request's trace and the node's metrics.
- Remediation
- Doubled the maximum Postgres connection lifespan from 15m to 30m
- Made the Postgres connection pools static so they always keep N connections open
- Raised the memcache client's MaxIdleConns from 2 to 20
- Moved temporarily from Google's hosted memcached to a memcached inside the Kubernetes cluster
- Shipped the fix for the accidental database join that made thousands of duplicate external calls
- Action items
- Set more sensible concurrency limits for outbound network calls
- Lessons
Network timeouts are not always local to one request or pod: when they appear, the whole activity of the node, including other pods on it, needs to be checked. Staying within a provider's rate limits does not keep outbound calls from affecting a node, so outbound network calls need more sensible concurrency limits.
IL-0193A GCP persistent disk degradation took down a Cassandra StatefulSet whose OrderedReady policy blocked recovery, and Metrictank could not reconnect to the recreated pods, causing a 23-hour Graphite query outageGrafana Labs2019- Symptoms
An alert fired because some Metrictank instances could not drain their write queue, which meant they could not write to Cassandra. Google had not yet published an incident, but a team member's Discord server, also hosted on GCP, was down, which pointed at GCP; Google confirmed an SSD persistent disk incident about 90 minutes after it began.
- Trigger
A Google Cloud incident in which SSD persistent disks performed so poorly that many I/O operations failed for an extended period.
- Root cause
- Component
- Contributing factor
- Detection
An alert that Metrictank write instances could not flush their write queue to Cassandra. Error rates alone rose too slowly to notice quickly, because most queries were served from memory.
- Remediation
- Added compute nodes hoping new nodes could attach the disks, which did not work
- Deleted and recreated the Cassandra StatefulSet with an updated pod management policy, so all pods but one started
- Raised Kafka topic retention to avoid data loss during the long downtime
- Temporarily added nodes so Metrictank restarts were not slowed by CPU starvation
- Restarted all Metrictank instances, which took more than 20 hours, so they connected to the new Cassandra IPs
- Action items
- Re-instantiate the gocql connection in Metrictank when it is detected dead, so it reconnects even when all Cassandra IPs change
- Fix the Metrictank write-queue deadlock by updating an internal data structure with atomics instead of a lock
- Lessons
An OrderedReady StatefulSet cannot recover past a single pod whose volume will not attach; when every pod is down, the ordering that protects normal start-up blocks the whole cluster. A client that learns peer addresses only from live peers needs a way to go back to the service name when all peers are replaced at once. A long-tolerated bug with a config workaround can surface at the worst time; this one turned out to have a simple fix. Writing incoming data to a Kafka write-ahead log first meant all data could still be ingested after recovery, and Kafka on non-SSD disks escaped the disk incident. With both Metrictank bugs fixed, the team expects a similar event to take less than 3 hours to recover from instead of 23.
These 2 cases involve Database and In-memory cache. 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 exhaustion1 case
- Component
- Contributing factor
- Organisation
Cloud provider outage1 case
- Contributing factor
- Organisation