DNS in Kubernetes

Yu Sang Min·2025년 6월 28일

CKA

목록 보기
83/110
post-thumbnail

🌐 Kubernetes DNS 동작 원리 정리


🚀 DNS가 필요한 이유

  • Pod는 IP가 동적이다. (삭제/재생성 시 변경)
  • IP 기반 통신은 불안정하고 유지보수가 어려움
    → 서비스나 Pod를 DNS 이름으로 접근 가능하게 만들어 줌

🔥 Kubernetes DNS 기본 구조

  • 클러스터 내부 전용 DNS 서비스
  • 일반적으로 CoreDNS가 디플로이됨
  • 모든 Pod는 /etc/resolv.conf에 클러스터 DNS가 자동으로 설정됨

🏗️ 서비스 DNS 이름 체계

✅ 기본 구성

  • 서비스명: web-service
  • 네임스페이스: apps

✅ FQDN (Fully Qualified Domain Name)

web-service.apps.svc.cluster.local

✅ 계층 구조

[서비스명].[네임스페이스].svc.cluster.local
구성요소의미
web-service서비스 이름
apps네임스페이스
svc서비스(Service) 도메인
cluster.local클러스터 기본 도메인 (변경 가능)

→ 동일 네임스페이스 내에서는 web-service만으로도 접근 가능


🌍 DNS 이름 예시

상황도메인 이름
같은 네임스페이스web-service
다른 네임스페이스web-service.apps
FQDN 전체web-service.apps.svc.cluster.local

🎯 Pod DNS 레코드

  • 기본적으로 Pod에 대한 DNS 레코드는 생성되지 않음
  • 선택적으로 CoreDNS 설정을 통해 활성화 가능

✅ Pod DNS 레코드 이름 형식

[IP-주소를-하이픈으로-변환].[네임스페이스].pod.cluster.local

✅ 예시

Pod IPDNS 이름
10.244.1.510-244-1-5.default.pod.cluster.local

→ 이 도메인을 통해 Pod 직접 접근 가능


🔗 서비스 vs Pod DNS

구분서비스 DNSPod DNS
기본 활성화❌ (옵션)
이름 형태서비스.네임스페이스.svc.cluster.localIP변환.네임스페이스.pod.cluster.local
사용 목적일반적인 통신디버깅, 특수한 목적
추천제한적 사용

🧠 DNS 동작 흐름

1️⃣ Pod 생성 시 /etc/resolv.conf에 클러스터 DNS 서버가 자동으로 등록
2️⃣ Pod가 서비스명을 호출하면 CoreDNS가
svc.cluster.local 도메인에서 이름을 해석
3️⃣ CoreDNS는 Kubernetes API와 연동해 Service IP를 조회하고 응답
4️⃣ 클라이언트는 Service IP로 트래픽을 전달


🔍 DNS 확인 명령어

✅ DNS 레코드 조회

nslookup web-service
dig web-service.apps.svc.cluster.local

✅ Pod 내부에서 확인

kubectl exec -it <pod-name> -- nslookup web-service

⚙️ CoreDNS 설정 변경으로 Pod DNS 활성화

  • CoreDNS ConfigMap 수정
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods verified  # ← pod DNS 활성화
          fallthrough in-addr.arpa ip6.arpa
        }
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }

💡 클러스터 도메인 변경 가능

  • kubelet, kube-apiserver 플래그:
--cluster-domain=<도메인명>

예:

--cluster-domain=internal.company.com

→ FQDN은
web-service.apps.svc.internal.company.com으로 변환


🚀 실제 활용 사례

  • 서비스 검색: http://db-service:3306
  • 네임스페이스 구분 서비스 검색:
    http://db-service.database.svc.cluster.local:3306
  • 디버깅 시 Pod 직접 접근:
    ping 10-244-1-5.default.pod.cluster.local

🏆 결론

  • Kubernetes DNS는 클러스터 내부에서 서비스 검색을 위한 필수 요소
  • 서비스 이름 → Service IP로 변환
  • Pod DNS는 비활성화 상태가 기본이며 디버깅 목적에서 선택적 사용
  • 네임스페이스 기반 도메인 체계로 서비스 구분 및 접근이 명확함
profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글