Incident Library
Applied filters ComponentTelemetry agentFactorUnreviewed defaultsClear allEvery case under the filters, with no sentence; newest first.
Suggested filters Search, and the values found in your words appear here.

Graph

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

Cases3 cases

1 to 3 of 3

  1. Symptoms

    On a Friday afternoon a tenant of SCHIP, Adevinta's multi-tenant Kubernetes runtime, reported a spike of HTTP 5xx errors in some of its services. The drops in quality of service came back periodically through the following days, each one short, and were reported mostly around midnight.

    Root cause
    Component
    Contributing factor
    Detection

    A tenant reported a spike of HTTP 5xx errors in some of its services; the DNS Latency SLI had already been degraded for some time without being acted on.

    Remediation
    • raised the dnsmasq concurrent query limit from 150 to 1500
    • added a CoreDNS header block that sets the ra and aa flags and clears rd, so dnsmasq caches cluster.local answers
    • configured dnsmasq on each node to answer NXDOMAIN for unresolvable search-domain names instead of forwarding them to CoreDNS
    • changed the fluent-bit log router hostname to a fully qualified name
    • asked the affected tenants to use fully qualified names for internal calls
    Lessons

    The DNS Latency SLI had shown the problem long before anyone looked at it. An SLO only protects you when its SLIs are trusted and a drop is investigated. The investigation took a month partly because several on-call groups worked on it separately, without one place for observations and hypotheses, and sometimes chased hypotheses already discarded. Disprove one hypothesis before starting the next, and collect data the metrics system lacks: DNStop showed the garbage lookups that no dashboard did. With ndots:5, short service names multiply DNS traffic; a node-local cache only helps if it can cache the cluster DNS answers at all.

  2. Symptoms

    One evening, right after an ordinary restart of kube-apiserver in a customer's production cluster, etcd memory consumption rose almost threefold. The sudden growth led to a cascading restart of all the master nodes.

    Trigger

    An ordinary restart of kube-apiserver, after which every pod of the log collector DaemonSet sent its list requests at the same time.

    Root cause
    Component
    Contributing factor
    Detection

    Memory graphs showed etcd memory on the master nodes almost tripling after a kube-apiserver restart; the audit logs then pointed to one DaemonSet's list requests.

    Remediation
    • created a PriorityLevelConfiguration named limit-list-custom that queues requests (assuredConcurrencyShares 5, 16 queues, handSize 4, queueLengthLimit 50)
    • created a FlowSchema that routes list and get requests on pods from the log collector's service account to that priority level
    Action items
    • Submit a pull request adding resource version support to the Kubernetes Rust library
    • Open a pull request to the Vector log collector to address the startup list requests
    • Apply the same flow-control approach to a similar problem found with the Cilium CNI
    Lessons

    A field selector reduces what kube-apiserver returns, not what it reads from etcd: listing the pods of one node still reads every pod in the cluster. A DaemonSet whose pods all list at startup multiplies that by the node count each time kube-apiserver restarts. Where exact freshness is not needed, resourceVersion=0 lets kube-apiserver answer from its cache; where the client cannot set it, API Priority and Fairness can queue the requests so they reach etcd gradually.

  3. Symptoms

    At 09:33 UTC on 14 February 2023 end users told the platform team that Kubernetes logs were not arriving in CloudWatch as expected. The investigation went through fluentd and found that the nodes were running containerd as their container runtime instead of docker-shim. A scheduled node rollover the day before, at 07:30 UTC on 13 February, had set containerd as the default runtime by accident.

    Trigger

    A scheduled node rollover had accidentally made containerd the default container runtime, which stopped log shipping to CloudWatch; the unscheduled rollover to revert it timed out, and the pipeline run that followed reduced the Auto Scaling group from 30 to 15 instances.

    Root cause
    Component
    Contributing factor
    Detection

    End users reported the missing CloudWatch logs that started the work. The postmortem lists 2 minutes as the time to detection of the node failure.

    Remediation
    • ran the node rollover script to add new nodes, which failed on a timeout from Docker Hub
    • ran the node rollover script a second time, which added new nodes that the load balancer marked healthy at 11:01 UTC
    Action items
    • Document the rollover process, especially what can be done when it goes wrong
    • Investigate options for improving the rollover process
    • Add fluentd log collection to the QA test suite so logs are covered end to end
    • Add alarms for fluentd when too little or no log data is sent
    • Implement a staging environment
    • Implement guards against selecting an invalid container runtime
    Lessons

    When a change goes wrong, rolling back to a known working configuration is safer than rushing a fix, which can make the damage worse. Launching new worker nodes depends on the cloud-init script not failing in any way. The QA configuration differed from production, there was no staging environment, the QA tests did not cover fluentd log collection, and the rollover process had no documentation for when it fails.

Check your cluster for this

These 3 cases involve Telemetry agent and Container runtime. 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 cause3