NodeLocal DNSCache
이번 블로그에서는 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 동작 방식

기존에는 모든 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에 대한 글을 마치겠습니다. 감사합니다!