Kubernetes DNS 이해

Jaemyeong.Lee·2026년 4월 13일

📘 Kubernetes DNS 이해


발표 목표

  • Kubernetes DNS 동작 이해
  • CoreDNS / node-local-dns 역할 구분
  • dig vs curl 차이로 장애 분석

1. DNS 기본 개념

  • DNS = 도메인 → IP 변환
example.com → 1.2.3.4

기본 흐름:

Client → DNS Server → IP 응답

2. Kubernetes DNS 전체 구조

Pod
  ↓
node-local-dns (169.254.20.10)
  ├─ cluster.local → CoreDNS
  └─ 외부 도메인 → node /etc/resolv.conf → 외부 DNS

3. Pod DNS 설정 (kubelet)

👉 kubelet이 Pod 생성 시 /etc/resolv.conf 생성

✔ kubelet 설정 (중요)

clusterDNS:
  - 169.254.20.10
clusterDomain: cluster.local
resolvConf: /etc/resolv.conf

각 항목 의미

항목설명
clusterDNSPod이 사용할 DNS 서버
clusterDomain클러스터 도메인
resolvConf참조할 node의 resolv.conf

👉 즉:

Pod의 nameserver = clusterDNS 값

✔ 일반 Pod

dnsPolicy: ClusterFirst
nameserver 169.254.20.10

👉 node-local-dns 사용

✔ node DNS 사용

dnsPolicy: Default
node의 /etc/resolv.conf 기반

4. CoreDNS 역할

  • *.cluster.local 처리
  • 서비스 이름 → IP 변환

예시:

kubernetes.default.svc.cluster.local

5. node-local-dns 역할

  • 로컬 DNS 캐시
  • DNS 프록시
요청처리
cluster.localCoreDNS
외부 도메인외부 DNS

6. /etc/resolv.conf

👉 DNS 서버 목록

nameserver 169.254.169.53
nameserver 169.254.169.54

❗ 핵심 포인트

  • 복제 ❌
  • 단순 참조 ❌
  • 👉 파일을 읽어서 upstream DNS로 사용

내부 동작

forward . /etc/resolv.conf

7. DNS search domain

👉 /etc/resolv.conf에 포함된 기능
짧은 이름을 자동으로 FQDN으로 확장

예시

search default.svc.cluster.local svc.cluster.local cluster.local

동작 방식

Pod에서:

curl myservice

실제로는 순차적으로 시도:

myservice.default.svc.cluster.local
myservice.svc.cluster.local
myservice.cluster.local

왜 중요한가

  • Kubernetes 서비스는 보통 짧은 이름 사용
  • search domain 덕분에 FQDN 없이 통신 가능

핵심 정리

👉 search domain은 “짧은 이름을 자동으로 완성해주는 기능”


8. CoreDNS 없이 외부 DNS 되는 이유

Pod
  ↓
node-local-dns
  ↓
169.254.169.53 / 169.254.169.54

9. dig vs curl 차이

✔ dig

dig → DNS 서버 직접 질의

✔ curl

curl → OS resolver 사용

OS resolver 흐름

curl
  ↓
getaddrinfo()
  ↓
1. /etc/hosts
2. DNS (/etc/resolv.conf)

❗ 주요 차이

항목digcurl
/etc/hosts
DNS 캐시
search domain
DNS 직접 질의

10. dig은 안되고 curl은 되는 이유

✔ 케이스 1: /etc/hosts

curl → hosts 사용 → 성공
dig → DNS만 조회 → 실패

✔ 케이스 2: DNS 경로 차이

curl → node-local-dns → 169.254.169.53 → 성공
dig → 다른 DNS → 실패

✔ 케이스 3: 캐시

curl → 캐시 있음 → 성공
dig → 없음 → 실패

✔ 케이스 4: search domain 영향

curl myservice → 자동 확장
dig myservice → 실패

🔥 핵심 정리

  • dig = DNS 테스트
  • curl = 실제 서비스 테스트

11. 전체 흐름 정리

Pod
  ↓
node-local-dns (169.254.20.10)
  ├─ cluster.local → CoreDNS
  └─ 외부 → 169.254.169.53 / 169.254.169.54

🎯 Takeaway

  • kubelet이 DNS 설정 생성
  • clusterDNS가 Pod DNS를 결정
  • CoreDNS = cluster DNS
  • node-local-dns = 캐시 + 외부 DNS 처리
  • /etc/resolv.conf는 읽어서 사용
  • 외부 DNS는 CoreDNS 없이 가능
  • dig ≠ curl

🙋 Q&A 대비

  • CoreDNS 죽으면?
  • dnsPolicy 차이?
  • 왜 DNS loop 발생?
  • dig vs curl 언제 써야 하나?

👍 핵심 한 줄

Pod DNS는 kubelet의 clusterDNS 설정에서 시작된다
curl은 OS resolver를 쓰고, dig은 DNS 서버를 직접 본다

0개의 댓글