IL-0472 Tinder · 2019-01-08kubernetesawsnetworking
노드 605개 클러스터의 모든 노드에서 ARP 캐시가 넘쳐 노드와 파드 사이 통신과 DNS 조회가 끊겼다
2019-01-08 이른 아침 Tinder 플랫폼에 오래 이어지는 장애가 났다. 그날 아침 장애에 앞서 이번 장애와 관계없는 지연이 늘어 클러스터의 파드와 노드 수를 늘렸다. 그 결과 모든 노드에서 ARP 캐시가 바닥났다. ARP 캐시를 다루는 리눅스 커널 값 셋 가운데 gc_thresh3 는 넘을 수 없는 상한이다. 동기 가비지 컬렉션 뒤에도 자리가 없으면 커널은 패킷을 버린다.
Tinder 는 쿠버네티스 네트워크로 Flannel 을 쓰고 패킷을 VXLAN 으로 전달했다. 워커 노드는 저마다 큰 /9 대역에서 /24 가상 주소 대역을 받는다. 노드 하나마다 라우팅 표 항목 하나, flannel.1 인터페이스의 ARP 항목 하나, 포워딩 데이터베이스 항목 하나가 생긴다. 노드에서 파드로, 파드에서 파드로 가는 통신은 결국 eth0 를 거치므로 출발 노드와 도착 노드마다 ARP 항목이 하나씩 더 생긴다. Tinder 환경에서는 이런 통신이 아주 많았다. 쿠버네티스 서비스마다 ELB 가 하나씩 생기고 모든 노드가 ELB 에 등록되는데, ELB 는 파드를 모른다. 그래서 패킷을 받은 노드가 iptables 규칙에 따라 다른 노드의 파드를 무작위로 골라 다시 보냈다.
장애 당시 클러스터에는 노드가 605개 있었고, 이 수는 기본 gc_thresh3 값을 넘기에 충분했다. 그러자 패킷이 버려질 뿐 아니라 Flannel 의 /24 가상 주소 대역 전체가 ARP 표에서 빠져, 노드에서 파드로 가는 통신과 클러스터 안에서 도는 DNS 의 조회가 실패했다. Tinder 는 gc_thresh1, gc_thresh2, gc_thresh3 값을 올리고, Flannel 을 재시작해 빠진 네트워크를 다시 등록해서 장애를 해결했다.
- 심각도
- –
- 영향 범위
- Tinder's platform had a persistent outage: node-to-pod communication and in-cluster DNS lookups failed across the 605-node cluster
- 영향 사용자
- –
- 지역
- –
- 감지까지
- –
- 복구까지
- –
증상
2019-01-08 이른 아침 Tinder 플랫폼에 오래 이어지는 장애가 났다. 노드에서 파드로 가는 통신과 DNS 조회가 실패했다.
ARP 캐시를 다루는 리눅스 커널 값 가운데 gc_thresh3 는 넘을 수 없는 상한이다. 로그에 "neighbor table overflow" 가 찍히면 ARP 캐시를 동기 가비지 컬렉션한 뒤에도 이웃 항목을 넣을 자리가 없다는 뜻이다. 이때 커널은 패킷을 통째로 버린다.
이 상한을 넘으면 패킷이 버려질 뿐 아니라 Flannel 이 노드마다 나눠 준 /24 가상 주소 대역 전체가 ARP 표에서 빠진다. DNS 는 클러스터 안에서 돌았기 때문에 DNS 조회도 함께 실패했다.
장애 직전인 그날 아침, 이번 장애와 관계없는 플랫폼 지연이 늘어서 그 대응으로 클러스터의 파드와 노드 수를 늘렸다. 그 결과 모든 노드에서 ARP 캐시가 바닥났다.
원인
- 촉발
- 그날 아침 장애에 앞서 이번 장애와 관계없는 플랫폼 지연이 늘자 클러스터의 파드와 노드 수를 늘렸다. 장애 당시 노드는 605개였고, 이 수는 기본 gc_thresh3 값을 넘기에 충분했다.
감지
–
조치
- gc_thresh1, gc_thresh2, gc_thresh3 값을 올렸다.
- Flannel 을 재시작해 ARP 표에서 빠진 네트워크를 다시 등록했다.
후속 조치
–
교훈
Tinder 는 이 장애로 네트워크 구성의 한계를 알게 됐다고 정리했다. Flannel 과 VXLAN 을 쓰는 클러스터에서는 노드마다 ARP 항목이 생기고, ELB 를 거쳐 다른 노드의 파드로 가는 통신이 항목을 더 늘린다. 그래서 노드가 605개에 이르자 리눅스의 기본 gc_thresh3 값으로는 모자랐다. 이 한계를 넘으면 패킷만 버려지는 것이 아니라 Flannel 의 /24 대역이 ARP 표에서 통째로 빠져 노드와 파드 사이 통신과 클러스터 안 DNS 가 함께 멈춘다.
출처
관련 사례
IL-0312max_connections 를 올리려고 재시작한 주 PostgreSQL 데이터베이스가 다시 올라오지 않아 Gadget 의 모든 앱 요청이 멈췄다Gadget · 2024같은 원인 · 공통 리눅스 커널
IL-0440파드가 보낸 DNS 쿼리 패킷이 노드에서 버려져 클러스터 내부 서비스의 이름 조회가 no such host 와 i/o timeout 으로 자주 실패했다Cybozu · 2024같은 원인 · 공통 리눅스 커널
IL-0386Google Cloud 로 옮긴 뒤 GKE 노드에서 Postgres 연결 타임아웃과 memcached i/o timeout 이 간헐적으로 튀었다incident.io · 2023같은 원인 · 공통 CNI 플러그인
IL-0176시계열 급증으로 호스트 메모리가 바닥나자 oom_score_adj 999 를 받은 Prometheus 컨테이너가 커널 OOM Killer 에게 먼저 죽어 CrashLoopBackOff 에 빠졌다.LINE · 2020같은 원인 · 공통 리눅스 커널
같은 원인 · 공통 리눅스 커널
IL-0064CPU 를 많이 쓰는 파드가 Google Cloud 노드 하나에 몰려 노드가 커널 패닉으로 죽었고, 다시 배치된 파드가 다음 노드를 또 죽이며 웹사이트와 API 가 멈췄다.Moonlight · 2019같은 원인 · 공통 리눅스 커널
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0472
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0472/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.