example.com → 1.2.3.4
기본 흐름:
Client → DNS Server → IP 응답
Pod
↓
node-local-dns (169.254.20.10)
├─ cluster.local → CoreDNS
└─ 외부 도메인 → node /etc/resolv.conf → 외부 DNS
👉 kubelet이 Pod 생성 시 /etc/resolv.conf 생성
clusterDNS:
- 169.254.20.10
clusterDomain: cluster.local
resolvConf: /etc/resolv.conf
| 항목 | 설명 |
|---|---|
| clusterDNS | Pod이 사용할 DNS 서버 |
| clusterDomain | 클러스터 도메인 |
| resolvConf | 참조할 node의 resolv.conf |
👉 즉:
Pod의 nameserver = clusterDNS 값
dnsPolicy: ClusterFirst
nameserver 169.254.20.10
👉 node-local-dns 사용
dnsPolicy: Default
node의 /etc/resolv.conf 기반
*.cluster.local 처리예시:
kubernetes.default.svc.cluster.local
| 요청 | 처리 |
|---|---|
| cluster.local | CoreDNS |
| 외부 도메인 | 외부 DNS |
/etc/resolv.conf👉 DNS 서버 목록
nameserver 169.254.169.53
nameserver 169.254.169.54
forward . /etc/resolv.conf
👉 /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
👉 search domain은 “짧은 이름을 자동으로 완성해주는 기능”
Pod
↓
node-local-dns
↓
169.254.169.53 / 169.254.169.54
dig → DNS 서버 직접 질의
curl → OS resolver 사용
curl
↓
getaddrinfo()
↓
1. /etc/hosts
2. DNS (/etc/resolv.conf)
| 항목 | dig | curl |
|---|---|---|
| /etc/hosts | ❌ | ✅ |
| DNS 캐시 | ❌ | ✅ |
| search domain | ❌ | ✅ |
| DNS 직접 질의 | ✅ | ❌ |
curl → hosts 사용 → 성공
dig → DNS만 조회 → 실패
curl → node-local-dns → 169.254.169.53 → 성공
dig → 다른 DNS → 실패
curl → 캐시 있음 → 성공
dig → 없음 → 실패
curl myservice → 자동 확장
dig myservice → 실패
Pod
↓
node-local-dns (169.254.20.10)
├─ cluster.local → CoreDNS
└─ 외부 → 169.254.169.53 / 169.254.169.54
Pod DNS는 kubelet의 clusterDNS 설정에서 시작된다
curl은 OS resolver를 쓰고, dig은 DNS 서버를 직접 본다