Cases5 cases
1 to 5 of 5
IL-0112The daily node rollover put DFDS's EKS nodes on an AMI later recalled for a kernel issue, causing "PLEG is not healthy" NodeNotReady flaps and pod network timeoutsDFDS2022- Symptoms
On 2022-10-31 a planned upgrade of the vpc-cni EKS add-on, started from the deployment pipeline at 13:45 UTC, timed out at 14:10. Only about 10 of the 45 aws-node pods had upgraded, 5 were stuck in Terminating and the other 30 had not been attempted.
- Trigger
At 07:30 UTC on 2022-10-31 the daily node rollover replaced the existing nodes with nodes built from AMI v20221027, the latest AWS EKS node AMI, released on 2022-10-29 and later recalled because of a kernel issue.
- Root cause
- Component
- Contributing factor
- Detection
The team noticed nodes flapping between NodeNotReady and NodeReady ("KubeletNotReady PLEG is not healthy") at 14:30 UTC while watching the stalled vpc-cni upgrade, about seven hours after the rollover. Time to detection was 7 hours. Alerting did not catch the NodeNotReady events or the socket growth.
- Remediation
- cordoned, drained and deleted 15 stuck nodes one at a time to complete the vpc-cni upgrade
- changed the Terraform infrastructure-modules so a specific AMI could be set
- rolled the EC2 Auto Scaling group launch configuration back to the previous known good AMI through the pipeline
- Action items
- Reach out to teams with suggestions about readiness and liveness probes
- Create a dashboard for readiness and liveness probe coverage
- Write a wiki article on readiness and liveness probes and their usefulness
- Modify infrastructure-modules to allow specifying a particular AMI
- Schedule a discussion on whether to take the latest AMI immediately and how to test new AMIs before they are deployed
- Implement alerting on abnormal NodeNotReady events and on increased socket use
- Create a learning path for Kubernetes within the team
- Collect logs from nodes centrally
- Create a Prometheus exporter that retrieves the latest available AMI, with a dashboard and alerts
- Lessons
When a new node AMI has just been rolled out, upgrading other cluster components on the same day makes it hard to tell which change is causing trouble; here the vpc-cni upgrade on the same day confused matters. Taking the latest AMI automatically with no way to pin one meant a rollback first needed a Terraform change. The team also concluded that it needs better communication paths with application teams during incidents.
IL-0029Slow user-facing services from CPU throttling on containers that used far less CPU than their limitBuffer2020- Symptoms
Services on Buffer's kops-managed cluster on AWS (about 60 nodes and 1500 containers) answered more slowly than they should have. The container throttling metric showed that many containers were being throttled whatever their CPU usage was, including containers that never came close to their CPU limit.
- Trigger
CPU limits on user-facing services, enforced through CFS quota by a Linux kernel with a bug that throttled containers even when they were well under their limit.
- Root cause
- Component
- Contributing factor
- Detection
While reviewing the container throttling metric, the team noticed many containers being throttled even though their CPU usage stayed far below their limits.
- Remediation
- removed CPU limits from all services directly or indirectly on the users' critical path
- moved those services to dedicated tainted nodes and gave them matching tolerations
- set each service's CPU request to its peak usage over a few months plus a margin of more than 20%, and set memory requests the same way
- Action items
- Move nodes to a kernel that contains the CFS throttling fix (4.19 or later), which for Buffer means a kops version whose host image is Ubuntu 20.04
- After the kernel upgrade, check whether throttling is fully gone and update the post
- Lessons
A CPU limit can slow a service down even when the service uses a small part of it, because of how the kernel enforces CFS quota on older kernels; the throttling metric shows it, the CPU usage graph does not. Upgrading the kernel is the safer fix. Removing limits works for latency, but only together with honest CPU and memory requests, isolation of the unbounded services, and monitoring of node usage, since unbounded containers can starve the kubelet.
IL-0030Most nodes of a cluster went NotReady together for 15 minutes while the API server sat behind an AWS ELBZalando2019- Symptoms
Fewer than 20% of the nodes in one Zalando cluster were available. Most nodes reported NotReady at the same moment, and only a handful stayed Ready.
- Root cause
- Component
- Contributing factor
- Remediation
- none; the nodes recovered on their own after about 15 minutes
IL-0074All AirMap platform services down as worker nodes went NotReady and pods crash-looped on network and DNS failuresAirMap2018- Symptoms
At about 15:00 UTC on 19 July 2018, monitoring alerted on rising 5xx responses from several APIs, most notably pilot and tiles. Logins failed first, because the pilot service fetches the user's profile, and from there all services became unresponsive. Every affected API ran on the production Kubernetes cluster.
- Root cause
- Component
- Contributing factor
- Detection
Monitoring alerted on an increase in 5xx responses from several APIs, most notably pilot and tiles.
- Remediation
- restarted the kubelets on the stuck worker nodes, which did not last
- restarted all worker nodes in a staggered order starting at about 18:00 UTC, which took about 1.5 hours
- Action items
- Restart nodes on a rolling schedule to keep nodes and kubelets healthy until the fixes land upstream and reach the cloud provider, Microsoft Azure
- Lessons
When nodes keep falling back to NotReady after kubelet restarts and pods fail on network and DNS errors, a known upstream bug may be the cause; matching the symptoms to the upstream issue tracker, with help from the community, found the cause and the fix candidates.
IL-0038kubelet rollout hit a Kubernetes bug and left every node in a cluster NotReady, triggering mass pod evictionOath2018- Symptoms
During a rolling update of a kubelet change in one of Oath's on-premises production clusters, nodes started going NotReady, and soon all nodes in the cluster were NotReady.
- Trigger
A change to kubelet was rolled out across the nodes of one cluster; on restart, kubelet cleans up transient cgroup files, and a Kubernetes bug in that step left kubelet stuck instead of starting.
- Root cause
- Component
- Contributing factor
- Detection
Nodes reported NotReady and the eviction graphs climbed while the kubelet rollout was in progress.
- Remediation
- failed the affected data center over so users were routed to the next available data center
- Action items
- Run a functional test of kubelet after each upgrade batch and certify it before the next 30% of nodes are updated
- Lessons
Check kubelet after upgrading it before moving to the next batch; a simple curl against the kubelet API would have caught this. The node controller's eviction throttling and full disruption mode, which the speakers note is not well documented, kept a cluster-wide kubelet failure from evicting every pod.
These 5 cases involve kubelet and Linux kernel. 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 cause1
Software defect5 cases
- Component
- Contributing factor
IL-0112The daily node rollover put DFDS's EKS nodes on an AMI later recalled for a kernel issue, causing "PLEG is not healthy" NodeNotReady flaps and pod network timeoutsDFDS2022IL-0029Slow user-facing services from CPU throttling on containers that used far less CPU than their limitBuffer2020IL-0030Most nodes of a cluster went NotReady together for 15 minutes while the API server sat behind an AWS ELBZalando2019IL-0074All AirMap platform services down as worker nodes went NotReady and pods crash-looped on network and DNS failuresAirMap2018IL-0038kubelet rollout hit a Kubernetes bug and left every node in a cluster NotReady, triggering mass pod evictionOath2018