EKS에서 DNS 실패? 실제 병목 현상은 AWS 네트워크 제한이었습니다
Source: Dev.to
DNS 조사 개요
DNS 조사를 진행하면서 처음에는 CoreDNS와 NodeLocal DNS 메트릭에 집중했습니다.
실제 돌파구는 DNS 실패를 AWS 인스턴스 수준 네트워크 제한과 연관시키기 시작했을 때 찾아왔습니다.
가장 유용한 신호는 EC2 ENA 드라이버가 ethtool을 통해 노출하는 네트워크 허용량 메트릭이었습니다.
EC2 ENA 허용량 메트릭
| 메트릭 | 설명 |
|---|---|
ethtool_linklocal_allowance_exceeded | 링크‑로컬 서비스로의 트래픽이 초당 패킷(PPS) 제한을 초과하여 패킷이 삭제되었습니다. 이는 DNS, IMDS, Amazon Time Sync에 직접 영향을 줍니다. |
ethtool_conntrack_allowance_available | 인스턴스의 연결 추적 제한에 도달하기 전에 추적할 수 있는 남은 연결 수입니다. (Nitro 기반 인스턴스에서만 지원됩니다.) |
ethtool_conntrack_allowance_exceeded | 연결 추적 제한을 초과하여 새로운 연결을 설정할 수 없게 되어 패킷이 삭제되었습니다. |
ethtool_bw_in_allowance_exceeded | 인바운드 총 대역폭이 인스턴스 제한을 초과하여 패킷이 대기열에 쌓이거나 삭제되었습니다. |
ethtool_bw_out_allowance_exceeded | 아웃바운드 총 대역폭이 인스턴스 제한을 초과하여 패킷이 대기열에 쌓이거나 삭제되었습니다. |
ethtool_pps_allowance_exceeded | 양방향 초당 패킷(PPS) 제한을 초과하여 패킷이 대기열에 쌓이거나 삭제되었습니다. |
모든 *_allowance_exceeded 메트릭은 이상적으로 0이어야 합니다.
지속적인 비 0 값은 인스턴스 수준에서 네트워킹 병목 현상이 있음을 나타냅니다.
메트릭 수집
이 메트릭은 EC2 ENA 드라이버가 ethtool을 통해 노출하며, node exporter가 수집하고 Prometheus가 스크랩하며 Grafana에서 시각화합니다.
Amazon Linux EKS 노드에서는 ethtool이 기본으로 설치됩니다. 메트릭을 수집하려면 node exporter 컨테이너에서 ethtool 컬렉터를 활성화하십시오:
# node exporter container configuration
containers:
- args:
- --collector.ethtool
- --collector.ethtool.device-include=(eth|em|eno|ens|enp)[0-9s]+
- --collector.ethtool.metrics-include=.*
이 변경을 적용하면 메트릭이 Prometheus와 Grafana에서 사용 가능해집니다.
Prometheus 메트릭
-
현재 사용 가능한 허용량
node_ethtool_conntrack_allowance_available{job="node-exporter"} -
허용량 초과 카운터 (비율로 변환)
sum by (instance) ( rate( node_ethtool_conntrack_allowance_exceeded{job="node-exporter"}[1m] ) )다른 allowance‑exceeded 메트릭에 대해서도 유사한 패널을 만들 수 있습니다:
node_ethtool_bw_in_allowance_exceedednode_ethtool_bw_out_allowance_exceedednode_ethtool_pps_allowance_exceedednode_ethtool_linklocal_allowance_exceeded
각 패널은 노드당 초당 삭제된 패킷 수를 보여줍니다.
Grafana 대시보드
전체 Grafana 대시보드 JSON(이름 Network limits dashboard)은 노드별 모든 allowance‑exceeded 메트릭을 시각화합니다. 모든 패널은 노드별 시간‑시계열 패널로, 네트워크 포화와 DNS 오류 또는 지연을 연관시키는 데 도움이 됩니다.
주요 요점
- 모든 allowance‑exceeded 메트릭은 EC2 인스턴스 크기에 연관되어 있으며, 링크 로컬 트래픽은 인스턴스 크기에 관계없이 초당 1024 패킷이라는 고정 제한을 가집니다.
- 이 고정 제한 때문에 CPU, 메모리, 파드 수준 메트릭이 정상이라도 DNS가 실패할 수 있습니다.
- 병목 현상은 Kubernetes 아래, EC2 네트워킹 레이어에 존재합니다.
- EKS에서 간헐적인 DNS 실패를 디버깅할 때, CoreDNS 메트릭에만 머물지 말고 항상 인스턴스 수준 네트워크 허용량을 확인해야 합니다.
DNS 잘못 구성에 대한 추가 내용은 우리 EKS 클러스터에서 성능을 저하시키던 숨겨진 DNS 잘못 구성(및 해결 방법) 게시물을 참조하십시오.