Cloud/Kubernetes

NodeLocal DNSCache

Jinseung의 블로그 2025. 10. 27. 10:02

이번 블로그에서는 CoreDNS에 부하를 해결하기 위한 도구인 NodeLocal DNSCache에 대한 글을 작성해보려합니다.

 

NodeLocal DNSCache란?

Kubernetes 환경에서는 Pod가 다른 Service나 외부 도메인과 통신할 때마다 DNS 조회가 발생합니다. 일반적으로 모든 DNS 요청은 CoreDNS(kube-dns)를 거쳐 처리되는데, 클러스터 규모가 커질수록 DNS 요청이 집중되어 지연 시간이 증가하거나 CoreDNS에 부하가 발생할 수 있습니다.

 

이러한 문제를 해결하기 위해 Kubernetes에서는 NodeLocal DNSCache를 제공합니다.

 

NodeLocal DNSCache는 각 노드(Node)에 DaemonSet 형태로 DNS 캐시 서버를 배포하여, Pod의 DNS 요청을 먼저 로컬에서 처리하도록 합니다. 이미 조회했던 DNS 정보는 캐시(Cache)에 저장되어 동일한 요청이 발생하면 CoreDNS까지 전달하지 않고 즉시 응답할 수 있습니다. 이를 통해 DNS 응답 속도를 향상시키고 CoreDNS의 부하를 줄여 클러스터 전체의 네트워크 성능을 개선할 수 있습니다.

 

NodeLocal DNSCache 동작 방식

NodeLocal DNSCache

기존에는 모든 Pod가 CoreDNS의 ClusterIP로 직접 DNS 요청을 전송했습니다.

Pod
  ↓
CoreDNS (ClusterIP)
  ↓
외부 DNS

 

하지만 NodeLocal DNSCache를 적용하면 각 노드에 실행 중인 DNS Cache가 먼저 요청을 처리합니다.

Pod
  ↓
NodeLocal DNSCache
  ├─ Cache Hit  → 즉시 응답
  └─ Cache Miss → CoreDNS → 외부 DNS

 

즉, 이러한 방식으로 불필요한 DNS 조회를 줄일 수 있습니다.

  • Cache Hit : 이미 조회했던 DNS 정보라면 즉시 응답
  • Cache Miss : CoreDNS로 전달하여 조회한 뒤 캐시에 저장

 

NodeLocal DNSCache의 장점

NodeLocal DNSCache를 사용하면 다음과 같은 이점을 얻을 수 있습니다. 특히 많은 Pod가 동시에 실행되는 환경에서는 CoreDNS 병목 현상을 완화하는 데 큰 도움이 됩니다.

  • DNS 조회 속도 향상
  • CoreDNS(kube-dns) 부하 감소
  • DNS 요청으로 인한 네트워크 트래픽 감소
  • UDP 기반 DNS 요청의 패킷 손실 감소
  • 대규모 Kubernetes 클러스터에서 안정적인 DNS 성능 제공

 

 

NodeLocal DNS 설치

먼저 Kubernetes에서 제공하는 NodeLocal DNSCache 매니페스트를 다운로드합니다.

wget https://github.com/kubernetes/kubernetes/raw/master/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml

 

현재 클러스터에서 사용 중인 CoreDNS의 ClusterIP를 조회합니다.

kubedns=$(kubectl get svc kube-dns -n kube-system -o jsonpath={.spec.clusterIP})

 

NodeLocal DNS에서 사용할 값을 변수로 지정합니다.

  • domain : Kubernetes 클러스터 DNS 도메인 (기본값: cluster.local)
  • localdns : 각 노드에서 사용할 NodeLocal DNS IP (기본값: 169.254.20.10)
domain='cluster.local'
localdns='169.254.20.10'

 

다운로드한 YAML 파일의 Placeholder 값을 실제 환경에 맞게 변경합니다.

sed -i "s/__PILLAR__LOCAL__DNS__/$localdns/g; \
s/__PILLAR__DNS__DOMAIN__/$domain/g; \
s/__PILLAR__DNS__SERVER__/$kubedns/g" nodelocaldns.yaml

 

마지막으로 DaemonSet을 배포합니다.

kubectl apply -f nodelocaldns.yaml

 

정상적으로 배포되면 모든 Worker Node에 하나씩 NodeLocal DNSCache Pod가 생성됩니다.

kubectl get pods -n kube-system -l k8s-app=node-local-dns

 

이것으로 NodeLocal DNSCache에 대한 글을 마치겠습니다. 감사합니다!

'Cloud > Kubernetes' 카테고리의 다른 글

EKS S3 CSI Driver  (0) 2026.07.09
Calico CNI  (0) 2026.01.05
Istio Keycloak 인증 연동  (0) 2025.09.29
쿠버네티스 기본 명령어를 알아보자  (0) 2025.05.01
쿠버네티스(k8s)의 구성요소 및 작동원리  (0) 2025.05.01