Incident Library
  • Root cause
  • Component
  • Symptom
  • Contributing factor
  • Case

Cases2 cases

1 to 2 of 2

  1. Symptoms

    At 10:01 UTC on 2024-03-13 a Kubernetes node entered NotReady state, with CPU requests at 78% and memory requests at 82%. An alert fired in Slack at 10:03 and was picked up at 10:05. An attempt to SSH into the node at 10:13 failed because it was unresponsive; it started responding again at 10:19.

    Trigger

    Pods of a dev container that used Hangfire to trigger jobs failed with OOM and crash-looped on a node where a Grafana Agent pod was already using a lot of memory.

    Root cause
    Component
    Contributing factor
    Detection

    A Slack alert fired two minutes after the node went NotReady and was picked up two minutes later; the second node's NotReady at 15:03 also raised a Slack alert.

    Remediation
    • marked the EC2 instance unhealthy so a new node started
    • cordoned and force-drained the NotReady node and terminated its EC2 instance
    • removed the new LimitRange from the Grafana Agent namespace and restarted the Grafana Agent pod
    • scaled the dev container to 0 replicas, after which EC2 network traffic returned to normal
    • after the second NotReady, scaled the dev container to 0 replicas again and added a new node
    • emailed the team that owns the dev container, which confirmed it was working on a fix
    Action items
    • Move grafana-agent to the monitoring node group
    • Add alerts for when bandwidth across the cluster reaches a certain threshold
    • Investigate whether memory limits can be set on the grafana-agent Helm chart
    • Investigate grafana-agent memory usage
    • Ask Grafana support whether grafana-agent should use a PVC
    • Consider pushing node logs to Loki with limited retention
    • Create a wiki page with common metrics and log queries to check when investigating issues with Kubernetes nodes
    Lessons

    Dev workloads mixed with production let one crash-looping dev container take down nodes that production also used, and a monitoring agent outside its dedicated node group added to the memory pressure. Scaling the suspect container back up before its owners had fixed it brought the failure back on the replacement node. The team also noted that action items from earlier post-mortems need follow-up, and that knowledge of useful CloudWatch metrics had not been shared, which made the diagnosis harder.

  2. Symptoms

    At 08:00 UTC on 2021-09-06 every service in DFDS's Kubernetes cluster answered with 404. Investigation started five minutes later.

    Trigger

    The automated Kubernetes node rollover on 2021-09-06 restarted all the Traefik v2 pods, five days after a malformed IngressRoute manifest had been applied.

    Root cause
    Component
    Contributing factor
    Detection

    All services returned 404 from 08:00 UTC and root cause investigation started at 08:05. Time to detection was 5 minutes.

    Remediation
    • changed the ALB health check path, which made the targets healthy but did not stop the 404s
    • rolled back by hand to Traefik v1 as the main ingress controller
    • deleted the malformed IngressRoute by hand and confirmed the Traefik v2 bug
    • applied the changes upstream
    Action items
    • Upgrade Traefik to v2.5, where the bug is fixed, and verify that it removes the bug
    • Change the Traefik v2 health check path to something more robust
    • Set up an external liveness probe on the ingress controller
    • Consider workload segmentation to limit the blast zone
    • Look into monitoring the Traefik v2 API for rapid changes
    • Look into smoke testing during and after node rollover
    Lessons

    A malformed IngressRoute did nothing visible for five days and then took down all ingress when every Traefik v2 pod had restarted during a node rollover. Because Traefik v2 failed gracefully, the first signals pointed at the ALB health checks instead of at Traefik. On incident handling, the team concluded that appointing an incident manager could have helped, that the war room meeting should be recorded and a log book kept, that people not involved should only make suggestions in writing, and that a short first round of sharing thoughts and gut feelings is useful.

Check your cluster for this

These 2 cases involve Cloud load balancer and Application database. 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