IL-0472 Tinder · 2019-01-08kubernetesawsnetworking
Node-to-pod traffic and DNS failed on Tinder's 605-node Flannel cluster when every node's ARP cache passed gc_thresh3
Tinder ran its platform on a Kubernetes cluster on Amazon EC2, provisioned with kube-aws, with Flannel as the network fabric forwarding packets over VXLAN. Each worker node takes its own /24 of pod addresses out of a larger /9 block, which adds one route table entry, one ARP entry on the flannel.1 interface and one forwarding database entry per node. Node-to-pod and pod-to-pod traffic also flows over the eth0 interface and adds an ARP entry for each source and destination node. This traffic was common: each Kubernetes Service had an ELB that registered every node, and a node that received a packet from the ELB used its iptables rules for the Service to pick a pod at random, often on another node.
On the morning of 8 January 2019 pod and node counts were scaled up in response to an unrelated latency increase. With 605 nodes in the cluster, the ARP entries exceeded the default gc_thresh3 on all nodes. Packets were dropped and entire Flannel /24 ranges disappeared from the ARP table, so node-to-pod communication and DNS lookups, served inside the cluster, failed. The fix was to raise gc_thresh1, gc_thresh2 and gc_thresh3 and restart Flannel so it registered the missing networks again.
- Severity
- –
- Scope
- Tinder's platform had a persistent outage: node-to-pod communication and in-cluster DNS lookups failed across the 605-node cluster
- Users affected
- –
- Region
- –
- Time to detect
- –
- Time to resolve
- –
Symptoms
In the early morning of 8 January 2019 Tinder's platform had a persistent outage. Communication from nodes to pods failed, and so did DNS lookups, because DNS ran inside the Kubernetes cluster.
The ARP cache on every node of the 605-node cluster was exhausted. gc_thresh3 is the Linux kernel's hard cap on the ARP cache: "neighbor table overflow" log entries mean that even after a synchronous garbage collection there was no room for the neighbor entry, and the kernel then drops the packet. Besides the dropped packets, whole Flannel /24 pod address ranges went missing from the ARP table.
The outage followed a scale-up of pod and node counts on the cluster earlier that morning, made in response to an unrelated rise in platform latency.
Symptom Service outageNetwork unreachableDNS resolution failures
Root cause
Root cause Capacity exhaustion
- Trigger
- Earlier that morning, pod and node counts on the cluster were scaled up in response to an unrelated increase in platform latency.
Detection
–
Remediation
- Raised gc_thresh1, gc_thresh2 and gc_thresh3 on the nodes
- Restarted Flannel so it re-registered the missing networks
Action items
–
Lessons
Tinder lists the outage among its learnings about network fabric limits: with Flannel over VXLAN, every node, and every pair of nodes that exchange pod traffic, adds entries to each node's ARP table, so at 605 nodes the default gc_thresh3 hard cap was exceeded on all nodes.
Sources
Related cases
IL-0312Gadget's main Postgres did not start again after a restart to raise max_connections, and the platform went downGadget · 2024same root cause · shared Linux kernel
IL-0440Pods on Cybozu's Neco Kubernetes platform got frequent no such host and i/o timeout DNS errors from dropped packetsCybozu · 2024same root cause · shared Linux kernel
IL-0386After a move to Google Cloud, Postgres connection timeouts and memcached i/o timeouts spiked on GKE nodesincident.io · 2023same root cause · shared CNI plugin
IL-0176Prometheus in a 235-node Kubernetes cluster crash-looped because over two million series exhausted host memory and the kernel OOM killer chose it first, as Burstable QoS gave it oom_score_adj 999LINE · 2020same root cause · shared Linux kernel
IL-0578Static content behind an HAProxy load balancer in an OpenStack Octavia amphora was delayed by tens of secondsGMO Pepabo · 2020same root cause · shared Linux kernel
IL-0064CPU-heavy pods packed onto one Google Cloud node drove it to kernel panics, and the crash moved from node to node until the site was downMoonlight · 2019same root cause · shared Linux kernel
Check your cluster for this
For AI tools and scripts
- This case as JSON: https://incidentlib-api.benchlet.com/cases/IL-0472
- The cases most like it: https://incidentlib-api.benchlet.com/cases/IL-0472/similar
- MCP server (Streamable HTTP, no key):
https://incidentlib-mcp.benchlet.com/mcp
The API needs no key. The MCP server offers search_incidents, get_incident, list_incidents, get_topic and vocab; both are explained on API and MCP.