NodeLocalDNS 수동 설치 가이드

진웅·2025년 7월 8일

K8S Basics

목록 보기
18/41

NodeLocalDNS 수동 설치 가이드

개요

NodeLocalDNS는 Kubernetes 클러스터에서 DNS 성능을 개선하기 위한 애드온입니다. 각 노드에서 DNS 캐싱 에이전트를 실행하여 CoreDNS로의 요청을 줄이고 DNS 조회 지연 시간을 단축합니다.

사전 요구사항

  • Kubernetes 클러스터 (v1.13 이상)
  • kubectl 명령어 도구
  • 클러스터 관리자 권한
  • CoreDNS가 설치된 환경

설치 단계

1. 현재 DNS 설정 확인

# CoreDNS 서비스 IP 확인
kubectl get svc -n kube-system kube-dns

# 기존 DNS 정책 확인
kubectl get configmap -n kube-system coredns -o yaml

2. NodeLocalDNS 매니페스트 다운로드

# 공식 매니페스트 다운로드
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

3. 환경 변수 설정

# 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"

4. 매니페스트 파일 수정

# 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

5. NodeLocalDNS 설치

# DaemonSet 배포
kubectl apply -f nodelocaldns.yaml

# 설치 확인
kubectl get daemonset -n kube-system node-local-dns

6. 설치 상태 확인

# 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

설정 상세 내용

NodeLocalDNS ConfigMap

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
    }

DaemonSet 주요 설정

  • hostNetwork: true: 노드의 네트워크 네임스페이스 사용
  • dnsPolicy: Default: 노드의 DNS 설정 사용
  • tolerations: 모든 노드에서 실행되도록 설정

검증 및 테스트

1. DNS 해상도 테스트

# 테스트 Pod 생성
kubectl run -it --rm --restart=Never test-dns --image=busybox:1.28 -- nslookup kubernetes.default

# 특정 노드에서 테스트
kubectl exec -it <pod-name> -- nslookup kubernetes.default

2. 성능 측정

# DNS 조회 시간 측정
kubectl run -it --rm --restart=Never dns-test --image=busybox:1.28 -- sh -c "
time nslookup kubernetes.default
time nslookup google.com
"

3. 캐시 통계 확인

# 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

주의사항

  1. 네트워크 정책: 기존 네트워크 정책이 169.254.20.10에 대한 액세스를 차단하지 않는지 확인
  2. 방화벽 설정: 노드 간 통신이 가능한지 확인
  3. 리소스 사용량: 각 노드에서 추가 메모리와 CPU를 사용함
  4. 업그레이드: Kubernetes 업그레이드 시 NodeLocalDNS 호환성 확인

참고 자료


이 가이드를 따라 NodeLocalDNS를 성공적으로 설치하고 구성할 수 있습니다. 추가 질문이나 문제가 있으면 언제든지 문의하세요.

profile
bytebliss

0개의 댓글