이름 규칙
| 대상 | DNS 이름 |
|---|---|
| 서비스 | <서비스>.<네임스페이스>.svc.cluster.local |
| Headless 서비스 뒤의 StatefulSet 파드 | <파드>.<서비스>.<네임스페이스>.svc.cluster.local (예. web-0.nginx.default.svc.cluster.local) |
| 파드(IP 기반) | 10-244-1-5.<네임스페이스>.pod.cluster.local |
같은 네임스페이스면 db-svc, 다른 네임스페이스면 db-svc.data 만 써도 됩니다. 파드의 /etc/resolv.conf 를 보면 이유가 나옵니다.
kubectl exec web -- cat /etc/resolv.conf
# search default.svc.cluster.local svc.cluster.local cluster.local
# nameserver 10.96.0.10 ← kube-dns 서비스 IP
# options ndots:5
search 목록을 차례로 붙여 조회하기 때문에 짧은 이름이 됩니다. nameserver 는 kube-system 의 kube-dns 서비스 IP 이고, 그 뒤에 CoreDNS 파드가 있습니다.
CoreDNS 구성 요소
kubectl get deploy coredns -n kube-system # 보통 레플리카 2
kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl get svc kube-dns -n kube-system # 10.96.0.10, 53/UDP 53/TCP
kubectl get ep kube-dns -n kube-system # CoreDNS 파드 IP 가 있어야 한다
kubectl get cm coredns -n kube-system -o yaml # Corefile
.:53 {
errors
health
ready
kubernetes cluster.local in-addr.arpa ip6.arpa { ← 클러스터 도메인
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
forward . /etc/resolv.conf ← 바깥 이름은 노드의 DNS 로
cache 30
loop
reload
}
확인하는 법
kubectl run tmp --rm -it --image=busybox:1.37 --restart=Never -- nslookup kubernetes.default
kubectl run tmp --rm -it --image=busybox:1.37 --restart=Never -- nslookup db-svc.data.svc.cluster.local
정상이면 Name: … Address: 10.96.x.x, 실패하면 두 가지 중 하나입니다.
| 출력 | 뜻 |
|---|---|
** server can't find …: NXDOMAIN | DNS 서버는 응답했지만 그런 이름이 없다 → 서비스 이름·네임스페이스 오타 |
;; connection timed out; no servers could be reached | DNS 서버에 닿지 못했다 → CoreDNS 가 죽었거나, NetworkPolicy 가 53 번 egress 를 막았다 |
DNS 장애 점검 순서
- CoreDNS 파드가 Running·Ready 인가? (레플리카 0, CrashLoop, 이미지 오타, Pending)
kube-dns서비스의 엔드포인트가 채워져 있나?- CoreDNS 로그:
kubectl logs -n kube-system -l k8s-app=kube-dns - Corefile 을 누가 고쳤나? (
cluster.local오타,forward대상) - 그 파드에 egress NetworkPolicy 가 있다면 UDP·TCP 53 을 허용했나?
- 파드의
dnsPolicy가Default로 되어 있지 않나?(그러면 클러스터 DNS 를 안 씀. 기본값은ClusterFirst)