IL-0080 Mercari · 2025-06-04 (게시일)kubernetesgcpnetworking
Mercari 는 관리형 GKE 클러스터에 기본으로 설치되는 kube-dns 로 서비스 이름을 IP 로 바꿨다. kube-dns 는 kube-system 네임스페이스의 Deployment 로 돌았고, 클러스터의 모든 서비스가 [service name].[namespace].svc.cluster.local 같은 이름을 풀 때 몇 개 안 되는 kube-dns 파드에 의존했다. 쿠버네티스는 kube-dns 오토스케일링을 기본으로 제공하지만, 피크 시간대에는 질의가 kube-dns 가 감당할 수 없을 만큼 몰렸다. NXDOMAIN, 잘린 응답, "failed to refresh DNS cache" 오류가 반복됐다.
결정타는 Sev1 장애였다. 여러 서비스가 DNS 이름 해석에 실패하면서 요청이 타임아웃으로 끝났고, 마이크로서비스가 연쇄로 묶여 있어서 결국 운영 장애로 이어졌다.
Platform Engineering 팀은 노드마다 DNS 캐시를 두는 NodeLocal DNSCache 를 해법으로 골랐다. 같은 노드의 파드가 kube-dns 로 가기 전에 그 노드의 캐시를 먼저 쓰게 해서, kube-dns 부하와 노드 사이 트래픽을 줄이는 방식이다. 팀은 내부 시험용 클러스터에서 효과를 먼저 재고 Dev 와 Prod 로 차례로 넓혔다. 배포 뒤 kube-dns 로 가는 DNS 호출은 10배 줄었고, 클러스터 서비스의 DNS 질의율은 93% 낮아졌다. DNS 오류는 종류에 따라 10배에서 100배 줄었는데, NXDOMAIN 은 10배, 잘린 응답은 100배였다. "failed to refresh DNS cache" 오류는 완전히 사라졌다.
Mercari 의 GKE 클러스터에서 여러 서비스가 한꺼번에 DNS 이름 해석에 실패하기 시작했다. 요청은 타임아웃으로 끝났고, 마이크로서비스가 서로 엮여 있어서 실패가 연쇄로 번지며 운영 장애가 됐다. 회사는 이 장애를 Sev1 로 분류했다.
이 장애 전부터 피크 시간대마다 kube-dns 가 한계를 드러냈다. DNS 질의가 많아지면 kube-dns 가 이를 감당하지 못했고, NXDOMAIN 과 잘린 응답 같은 DNS 오류가 자주 났다.
"failed to refresh DNS cache" 오류도 반복됐다. 이 오류는 캐시 미스를 일으켰고, 그동안 여러 운영 장애의 원인이 됐다.
피크 시간대에 NXDOMAIN, 잘린 응답, "failed to refresh DNS cache" 오류가 반복되는 것을 보고 kube-dns 가 한계에 이르렀다는 것을 알았다.
–
트래픽이 많은 쿠버네티스 클러스터에서는 DNS 를 최적화하는 일이 중요하다. 모든 파드가 몇 개의 kube-dns 파드에 기대는 구조는 피크 시간대에 장애 지점이 됐고, 노드 단위 캐시를 두자 DNS 트래픽과 오류가 크게 줄었다.
같은 원인 · 공통 kube-dns