Kubernetes에서 DNS 구성은 단순한 네트워크 설정을 넘어 애플리케이션의 운영 효율성과 확장성에 중요한 역할을 합니다. 효율적인 DNS 해석은 빠르고 신뢰할 수 있는 서비스 검색을 제공하여 애플리케이션의 성능과 안정성을 향상시킬 수 있습니다.
NodeLocal DNSCache
Kubernetes 클러스터에서는 모든 DNS 질의를 CoreDNS가 처리합니다. 이로 인해 CoreDNS에 부하가 발생할 수 있으며, 부하가 커지면 DNS 질의 실패로 서비스 장애가 발생할 수 있습니다. NodeLocal DNSCache 데몬셋을 설치하면 DNS 성능을 향상시키고 CoreDNS의 부하를 줄일 수 있습니다.
Install
nodelocaldns configuration 문서를 보고 설치하시거나, helm 명령어를 사용하여 설치할 수 있습니다.
$ helm repo add deliveryhero https://charts.deliveryhero.io/
$ helm repo update
$ helm install node-local-dns -n kube-system deliveryhero/node-local-dns
CoreDNS NXDOMAIN 오류 해결
NXDOMAIN 오류
- NXDOMAIN 오류는 등록되지 않은 DNS를 조회하여 나오는 오류입니다. Kubernetes에서 service discovery를 위해 사용하는 규칙으로 DNS 질의시
dnsConfig ndots 설정 기본 값이 5
로 되어있어서 5번정도 더 질의하게 되는데, 이때 질의되는 도메인이 DNS서버에 등록되지 않은 도메인이므로 NXDOMAIN 로그가 출력됩니다. - NXDOMAIN 오류는 CoreDNS 서버에 부하를 발생시키고, 이로 인해 DNS 질의 실패로 인한 서비스 장애가 발생할 수 있습니다.
- AWS 환경에서는 도메인 질의를 너무 많이하게되면, EC2 DNS Limit(1024 packets per second) 제한이 걸려서 DNS질의 실패로 서비스에 장애가 발생할 가능성이 있습니다.
- CoreDNS 로그를 출력하려면 log plugin을 설정해야합니다.
[INFO] 10.0.100.100:43584 - 252 "A IN secretsmanager.ap-northeast-2.amazonaws.com.cluster.local. udp 75 false 512" NXDOMAIN qr,aa,rd 168 0.000103938s
[INFO] 10.0.4.3:43584 - 584 "AAAA IN secretsmanager.ap-northeast-2.amazonaws.com.cluster.local. udp 75 false 512" NXDOMAIN qr,aa,rd 168 0.000147656s
[INFO] 10.1.10.100:42304 - 10747 "AAAA IN secretsmanager.ap-northeast-2.amazonaws.com.kube-system.svc.cluster.local. udp 91 false 512" NXDOMAIN qr,aa,rd 184 0.000053758s
[INFO] 10.1.0.182:42304 - 10347 "A IN secretsmanager.ap-northeast-2.amazonaws.com.kube-system.svc.cluster.local. udp 91 false 512" NXDOMAIN qr,aa,rd 184 0.000095001s
ndots 설정이란
dnsConfig의 ndots 설정은 DNS 쿼리 시 도메인 이름 뒤에 붙일 점(.)의 최대 개수를 지정하는 설정입니다. 이 설정은 DNS 서버가 FQDN(Fully Qualified Domain Name)을 해석하는 데 사용되며 아래와 같은 목적이있습니다.
- DNS 쿼리 성능 향상: ndots를 적절히 설정하면 불필요한 DNS 쿼리를 줄여 DNS 해결 시간을 단축할 수 있습니다.
- DNS 서버 부하 분산: 많은 수의 DNS 쿼리를 특정 DNS 서버로 집중시키는 것을 방지하여 DNS 서버의 부하를 분산시킬 수 있습니다.
- DNS 오류 감소: 잘못된 도메인 이름에 대한 쿼리를 줄여 DNS 오류 발생 가능성을 낮출 수 있습니다.
해결방법
dnsConfig ndots 설정을 통해 NXDOMAIN 오류를 줄일 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: dns-example
spec:
containers:
- name: nginx
image: nginx:1.22
dnsConfig:
options:
- name: ndots
value: "1"
결론
- CoreDNS의 부하를 줄이기 위해 NodeLocal DNSCache 데몬셋을 설치하고, 모든 가능한 POD에 dnsConfig의 ndots 설정을 1로 설정하는 것을 권장합니다.
- Service FQDN 사용시
${service}.${namespace}.svc.cluster.local
형식으로 사용하는 것을 권장합니다.