DNS 서비스 발견

Kubernetes 내부 DNS 시스템과 서비스 발견 메커니즘


Kubernetes 내부 DNS 시스템과 서비스 발견 메커니즘

목표: Pod가 서비스를 찾고 통신하는 원리를 이해할 수 있는 수준


🌐 CoreDNS

개요

graph TB
    subgraph "DNS 질의 흐름"
        Pod["📦 Pod"] -->|"my-service"| CoreDNS["🌐 CoreDNS"]
        CoreDNS -->|"질의"| API["🔷 API Server"]
        API -->|"Service 정보"| CoreDNS
        CoreDNS -->|"10.96.123.456"| Pod
    end

CoreDNS는 Kubernetes의 기본 DNS 서버입니다.

  • 클러스터 낮 DNS 질의 처리
  • Service/Pod 이름 → IP 변환
  • 플러그인 기반 확장

📋 DNS 이름 규칙

리소스DNS 이름예시
Serviceservice.namespace.svc.cluster.localmy-svc.default.svc.cluster.local
Podpod-ip.namespace.pod.cluster.local10-244-1-2.default.pod.cluster.local
Headless Servicepod-name.service.namespace.svc.cluster.localmysql-0.mysql.default.svc.cluster.local

짧은 이름

# 같은 네임스페이스
my-service

# 다른 네임스페이스
my-service.other-namespace

# 전체 도메인
my-service.default.svc.cluster.local

🔧 CoreDNS 설정

ConfigMap

# CoreDNS ConfigMap 확인
kubectl get configmap coredns -n kube-system -o yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }

🎯 Headless Service

개념

ClusterIP가 None인 서비스.

  • 로드밸런싱 없음
  • 각 Pod의 IP 직접 반환
  • StatefulSet과 함께 사용
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  selector:
    app: mysql
  ports:
  - port: 3306
  clusterIP: None  # Headless

DNS 조회 결과

# Headless Service
nslookup mysql
# Name: mysql.default.svc.cluster.local
# Address: 10.244.1.10
# Address: 10.244.1.11
# Address: 10.244.1.12

# 일반 Service
nslookup my-service
# Name: my-service.default.svc.cluster.local
# Address: 10.96.123.456  # ClusterIP만 반환

🐛 문제 해결

DNS 테스트

# DNS Pod 실행
kubectl run -it --rm debug --image=busybox:1.28 --restart=Never -- sh

# 테스트
nslookup kubernetes.default
nslookup my-service
nslookup my-service.other-namespace

# 외부 DNS
nslookup google.com

CoreDNS 문제

# CoreDNS Pod 상태
kubectl get pods -n kube-system -l k8s-app=kube-dns

# 로그 확인
kubectl logs -n kube-system -l k8s-app=kube-dns

# 재시작
kubectl rollout restart deployment coredns -n kube-system

📋 체크리스트

  • CoreDNS 동작 확인
  • Service DNS 이름 규칙
  • Headless Service 사용처
  • Pod DNS 질의 테스트
  • 네임스페이스 간 DNS
  • CoreDNS 문제 해결

🔗 관련 노트

  • 01-06-Service-타입 — 서비스 노출
  • 02-03-CNI-네트워크 — 네트워크 플러그인
  • 02-11-Pod-실패-원인-분석 — DNS 문제

마지막 업데이트: 2026-06-01