Cases2 cases
1 to 2 of 2
IL-0195The kube-apiservers of a cluster with more than 200 nodes ran out of memory and crashed one after another under mass LIST requests from Cilium agentsPalark2023- Symptoms
A tech support engineer called Palark to say that a customer's cluster, production environment included, had practically stopped working. On the control plane nodes the kube-apiserver processes had used up all the memory and were crashing and restarting over and over, so the Kubernetes API was unreachable and completely non-functional.
- Trigger
Cilium agent pods on more than 200 nodes sent LIST requests to the Kubernetes API en masse at the same time.
- Root cause
- Component
- Contributing factor
- Detection
A tech support engineer phoned the team to report that the customer's cluster was practically non-operational.
- Remediation
- added CPU and memory to the control plane nodes in two steps, from 8 CPUs and 16 GB of RAM to 16 CPUs and 64 GB, until the API stabilised
- restarted the Cilium agents in a test window agreed with the customer to reproduce the memory growth
- deployed a FlowSchema and a PriorityLevelConfiguration named cilium-pods that limit and queue LIST requests from the Cilium service accounts to cilium.io resources
- reduced the control plane nodes back to their original resources
- Action items
- Make an API Priority and Fairness configuration a standard part of Palark's Kubernetes platform
- Lessons
In a large cluster, many agents sending LIST requests at once can exhaust kube-apiserver memory, and with several API servers the crash moves from one to the next. APF can hold back such a client: a FlowSchema matches its requests and a PriorityLevelConfiguration gives them a small concurrency share and a queue, so the requests run more slowly instead of all at once. With APF enabled, the total concurrency it divides is the sum of --max-requests-inflight (default 400) and --max-mutating-requests-inflight (default 200), shared among priority levels in proportion to their assured concurrency shares, so raising one level's share lowers every other level's limit. Long-running requests such as logs and exec, and WATCH requests, are not subject to APF. The response headers X-Kubernetes-PF-FlowSchema-UID and X-Kubernetes-PF-PriorityLevel-UID show where a request landed, and the metrics Apiserver_flowcontrol_rejected_requests_total, Apiserver_current_inqueue_requests and Apiserver_flowcontrol_request_execution_seconds, with the debug endpoints /debug/api_priority_and_fairness/dump_priority_levels and /debug/api_priority_and_fairness/dump_queues, show how the queues behave.
IL-0461Every rollout of Datadog's metrics query service on Kubernetes raised errors that the logs blamed on DNSDatadog2022- Symptoms
From September 2021, each rollout of an update to Datadog's metrics query service, which serves real-time and historical metric data to the web frontend and to monitor evaluation, came with a rise in errors. Clients retried failed queries, so few errors reached users, but the retries slowed dashboards and monitors. The service's logs showed DNS errors stopping it from connecting to the data stores it depends on.
- Trigger
Rollouts of the metrics query service, which delete the old pods. The client behaviour behind the failures came from an August 2021 rollout of the metrics query clients that applied round_robin as the new default gRPC load balancing policy.
- Root cause
- Component
- Contributing factor
- Detection
Errors rose during rollouts of the metrics query service, and the service's logs showed DNS errors when connecting to its data stores.
- Remediation
- Raised the memory of the node-local-dns pods from 64 MB to 256 MB, which stopped the OOM kills but not the DNS errors
- Tested larger instance types and confirmed that scaling up the service's infrastructure resolved the errors
- Removed the custom gRPC reconnect parameters from the clients to restore the defaults
- Action items
- Contribute a change to Cilium that adds an unreachable route for a deleted pod's IP so clients get an ICMP error
- Lessons
The errors looked like DNS but were not. ENA metrics and VPC Flow Logs gave the visibility into VPC connection tracking that host metrics did not, and Cilium, Kubernetes and AWS networking interact in ways that can make reverse path filtering drop packets it should allow. DNS propagation time depends on many settings. The causes were changes Datadog had made itself, to work around a dependency bug, to resolve earlier incidents and to override default reconnect parameters, which looked safe at the time and showed their effects much later, when the link was hard to see.
These 2 cases involve Cilium and conntrack table. 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
Configuration change1 case
- Component
- Contributing factor
- Organisation