CoreDNS 모니터링 및 최적화 가이드
📅 작성일: 2025-05-20 | 수정일: 2026-02-18 | ⏱️ 읽는 시간: 약 13분
Amazon EKS와 최신 Kubernetes 클러스터에서 CoreDNS는 클러스터 내 모든 서비스 디스커버리와 외부 도메인 이름 해석을 담당하는 핵심 컴포넌트입니다. CoreDNS의 성능과 가용성은 애플리케이션 응답 시간과 안정성에 직접적인 영향을 미치기 때문에, 효과적인 모니터링 및 최적화 아키텍처를 구축하는 것이 중요합니다. 이 아티클에서는 CoreDNS 성능 모니터링 메트릭, TTL 설정 가이드, 모니터링 아키텍처 모범 사례, AWS 권장 사항 및 실무 사례를 분석합니다. 각 섹션에서는 Prometheus 메트릭, Amazon EKS 환경에서의 적용 예시를 활용하여 CoreDNS 모니터링 전략을 알아봅니다.
1. CoreDNS 성능 모니터링: 주요 Prometheus 메트릭과 의미
CoreDNS는 metrics 플러그인을 통해 Prometheus 형식의 메트릭을 제공하며, 기본적으로 EKS에서는 kube-dns 서비스의 9153 포트로 노출됩니다. 핵심 메트릭들은 DNS 요청의 처리량, 지연 시간, 오류, 캐싱 효율 등을 보여주며, 이를 모니터링함으로써 DNS 성능 병목이나 장애 징후를 빠르게 포착할 수 있습니다.
CoreDNS 4 Golden Signals
CoreDNS 핵심 Prometheus 메트릭
이 외에도 요청/응답 크기(coredns_dns_request_size_bytes, ...response_size_bytes), DO 비트 설정 여부(coredns_dns_do_requests_total) 등의 메트릭이 제공되며, CoreDNS에 로드된 플러그인별 추가 메트릭도 존재할 수 있습니다. 예를 들어 Forward 플러그인을 통한 업스트림 질의 시간(coredns_forward_request_duration_seconds)이나 kubernetes 플러그인의 API 업데이트 지연(coredns_kubernetes_dns_programming_duration_seconds) 등이 있습니다.
주요 메트릭 의미 및 활용
예를 들어 coredns_dns_requests_total의 초당 증가율로 DNS QPS를 파악하고, 이를 CoreDNS Pod별로 나누어 부하가 균등한지 확인합니다. QPS가 지속적으로 증가하면 CoreDNS 스케일 아웃이 필요한지 검토합니다. coredns_dns_request_duration_seconds의 99퍼센타일이 평소보다 높아지면, CoreDNS가 응답 지연을 겪고 있다는 의미이므로 업스트림 DNS 지연이나 CoreDNS CPU/메모리 포화 여부를 점검합니다. 이 때 CoreDNS 캐시(coredns_cache_hits_total) hit 비율이 낮다면, TTL이 너무 짧아 캐시효과가 떨어지는지 확인하고 조정합니다. coredns_dns_responses_total에서 SERVFAIL 또는 REFUSED 비율이 증가하면 CoreDNS 외부 통신 문제나 접근 권한 문제가 없는지 로그를 점검해야 합니다. 한편 NXDOMAIN 증가가 특정 도메인에 대해 급증한다면, 애플리케이션이 잘못된 도메인을 조회하고 있을 수 있으므로 해당 부분을 수정해야 합니다.
또한 시스템 리소스 메트릭 (CPU/메모리)도 중요합니다. CoreDNS Pod의 CPU/메모리 사용률을 모니터링하여, 각 Pod가 리소스 한계에 근접하는 경우 알림을 설정합니다. 예를 들어 EKS의 기본 CoreDNS 메모리 요청/제한은 70Mi/170Mi로 설정되어 있으므로, 메모리 사용량이 150Mi를 넘어서는지 추적하여 임계치 도달 시 경보를 울리고 메모리 한계를 늘리거나 Pod을 추가하는 등의 조치를 취할 수 있습니다. CPU도 제한에 도달하면 kubelet이 CoreDNS 프로세스를 스로틀링하여 DNS 지연을 초래할 수 있으므로, CPU 사용률이 제한치에 근접하면 확장이나 자원 할당 증설을 고려해야 합니다.
각 노드 ENI는 초당 1024개의 DNS 패킷만 허용합니다. CoreDNS의 max_concurrent 한계를 풀어도, ENI PPS 한계(1024 PPS)의 제한으로 인하여 원하는 성능에 도달하지 못할 수도 있습니다.
2. CoreDNS TTL 설정 가이드 및 Amazon EKS 적용 예시
**TTL(Time-To-Live)**은 DNS 레코드의 유효 캐시 시간을 의미하며, 적절한 TTL 설정은 DNS 트래픽 부하와 정보 신선도 사이의 균형을 좌우합니다. CoreDNS에서는 두 가지 수준에서 TTL을 다룹니다:
- 권한 영역 레코드(SOA, Start of Authority) TTL: Kubernetes 클러스터 내부 도메인(
cluster.local등)에 대한 kubernetes 플러그인 응답 TTL로, 기본값은 5초입니다. CoreDNSCorefile에서kubernetes섹션에ttl옵션을 지정하여 변경할 수 있으며, 최소 0초(캐싱 안 함)에서 최대 3600초까지 설정 가능합니다. - 캐시 TTL: cache 플러그인에서 캐시된 항목을 보관하는 최대 시간으로, 기본값은 **최대 3600초 (성공 응답)**이며 CoreDNS 설정에서
cache [TTL]형태로 조정할 수 있습니다. 지정된 TTL은 상한치로 동작하며, 실제 DNS 레코드의 TTL이 그보다 짧으면 그 짧은 값에 따라 캐시에서 제거됩니다. (cache플러그인의 기본 최소 TTL은 5초이며,MINTTL로 조정 가능).
Amazon EKS 기본 CoreDNS 설정
EKS에 배포되는 기본 CoreDNS Corefile을 살펴보면, kubernetes 플러그인에 별도의 TTL이 지정되지 않아 기본 5초가 사용되고 있고, 대신 cache 30 설정을 통해