NodeLocalDNS는 Kubernetes 클러스터에서 DNS 성능을 개선하기 위한 애드온입니다. 각 노드에서 DNS 캐싱 에이전트를 실행하여 CoreDNS로의 요청을 줄이고 DNS 조회 지연 시간을 단축합니다.
# CoreDNS 서비스 IP 확인
kubectl get svc -n kube-system kube-dns
# 기존 DNS 정책 확인
kubectl get configmap -n kube-system coredns -o yaml
# 공식 매니페스트 다운로드
wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml
# 또는 curl 사용
curl -O https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml
# CoreDNS 서비스 IP 조회
export COREDNS_SERVICE_IP=$(kubectl get svc -n kube-system kube-dns -o jsonpath='{.spec.clusterIP}')
# 로컬 DNS IP 설정 (기본값: 169.254.20.10)
export LOCAL_DNS_IP="169.254.20.10"
# 도메인 설정 (클러스터 도메인 확인)
export CLUSTER_DOMAIN="cluster.local"
# sed 명령어를 사용하여 플레이스홀더 값 교체
sed -i "s/__PILLAR__LOCAL__DNS__/$LOCAL_DNS_IP/g" nodelocaldns.yaml
sed -i "s/__PILLAR__DNS__DOMAIN__/$CLUSTER_DOMAIN/g" nodelocaldns.yaml
sed -i "s/__PILLAR__DNS__SERVER__/$COREDNS_SERVICE_IP/g" nodelocaldns.yaml
# DaemonSet 배포
kubectl apply -f nodelocaldns.yaml
# 설치 확인
kubectl get daemonset -n kube-system node-local-dns
# Pod 상태 확인
kubectl get pods -n kube-system -l k8s-app=node-local-dns
# 로그 확인
kubectl logs -n kube-system -l k8s-app=node-local-dns
# 모든 노드에서 실행 중인지 확인
kubectl get daemonset -n kube-system node-local-dns -o wide
apiVersion: v1
kind: ConfigMap
metadata:
name: node-local-dns
namespace: kube-system
data:
Corefile: |
cluster.local:53 {
errors
cache {
success 9984 30
denial 9984 5
}
reload
loop
bind 169.254.20.10
forward . CLUSTER_DNS_IP {
force_tcp
}
prometheus :9253
health 169.254.20.10:8080
}
in-addr.arpa:53 {
errors
cache 30
reload
loop
bind 169.254.20.10
forward . CLUSTER_DNS_IP {
force_tcp
}
prometheus :9253
}
ip6.arpa:53 {
errors
cache 30
reload
loop
bind 169.254.20.10
forward . CLUSTER_DNS_IP {
force_tcp
}
prometheus :9253
}
.:53 {
errors
cache 30
reload
loop
bind 169.254.20.10
forward . /etc/resolv.conf {
prefer_udp
}
prometheus :9253
}
# 테스트 Pod 생성
kubectl run -it --rm --restart=Never test-dns --image=busybox:1.28 -- nslookup kubernetes.default
# 특정 노드에서 테스트
kubectl exec -it <pod-name> -- nslookup kubernetes.default
# DNS 조회 시간 측정
kubectl run -it --rm --restart=Never dns-test --image=busybox:1.28 -- sh -c "
time nslookup kubernetes.default
time nslookup google.com
"
# Prometheus 메트릭 확인
kubectl exec -n kube-system <node-local-dns-pod> -- wget -qO- http://169.254.20.10:9253/metrics
1. Pod이 시작되지 않는 경우
# 이벤트 확인
kubectl describe pod -n kube-system <pod-name>
# 권한 문제 확인
kubectl auth can-i "*" "*" --as=system:serviceaccount:kube-system:node-local-dns
2. DNS 해상도 실패
# iptables 규칙 확인
iptables -t nat -L | grep 169.254.20.10
# 네트워크 인터페이스 확인
ip addr show nodelocaldns
3. 캐시가 작동하지 않는 경우
# CoreDNS 연결 확인
kubectl exec -n kube-system <node-local-dns-pod> -- netstat -tuln | grep 8080
# Corefile 구성 확인
kubectl get configmap -n kube-system node-local-dns -o yaml
NodeLocalDNS를 제거하려면:
# DaemonSet 제거
kubectl delete -f nodelocaldns.yaml
# 관련 리소스 정리
kubectl delete configmap -n kube-system node-local-dns
kubectl delete serviceaccount -n kube-system node-local-dns
kubectl delete clusterrole node-local-dns
kubectl delete clusterrolebinding node-local-dns
이 가이드를 따라 NodeLocalDNS를 성공적으로 설치하고 구성할 수 있습니다. 추가 질문이나 문제가 있으면 언제든지 문의하세요.