서비스가 생기면 CoreDNS 에 레코드가 만들어진다
web.default.svc.cluster.local
│ │ │ └ 클러스터 도메인
│ │ └ 리소스 종류
│ └ 네임스페이스
└ 서비스 이름
같은 네임스페이스면 web
다른 네임스페이스면 web.other
완전한 이름 web.other.svc.cluster.local
ndots:5 가 만드는 지연
파드의 /etc/resolv.conf nameserver 10.96.0.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5
ndots:5 는 "점이 5개 미만이면 search 도메인을 먼저 붙여 본다" 는 뜻이다
api.example.com (점 2개) 을 조회하면
→ api.example.com.default.svc.cluster.local ← 실패
→ api.example.com.svc.cluster.local ← 실패
→ api.example.com.cluster.local ← 실패
→ api.example.com ← 성공
외부 도메인 하나 조회에 4번의 왕복이 든다 트래픽이 많으면 CoreDNS 부하와 지연이 눈에 띄게 늘어난다
대응
- 외부 주소 끝에 점을 붙인다 (api.example.com.) — 완전한 이름이 된다
- 파드의 dnsConfig 로 ndots 를 낮춘다
- dnsConfig: { options: [{ name: ndots, value: "2" }] }
- NodeLocal DNSCache 를 둔다 (노드마다 캐시 — 규모가 크면 효과가 확실하다)
- CoreDNS 레플리카와 캐시 TTL 을 조정한다
CoreDNS 가 아플 때의 증상
· 이름 해석이 간헐적으로 실패한다 (UnknownHostException 이 가끔)
· 요청 지연이 계단식으로 튄다
· 특정 파드에서만 안 된다 (그 노드의 문제일 수 있다)
확인
kubectl -n kube-system get pods -l k8s-app=kube-dns
kubectl -n kube-system logs -l k8s-app=kube-dns --tail=50
kubectl run tmp --rm -it --image=nicolaka/netshoot -- nslookup web
egress 정책과 함께 쓸 때
NetworkPolicy 로 egress 를 막을 때 DNS(53/UDP·TCP)를 안 열면 이름 해석이 안 돼 '전부' 깨진다
증상이 "어떤 서비스도 연결이 안 된다" 라서 DNS 문제라는 것을 늦게 깨닫는다
egress:
- to: [{ namespaceSelector: { matchLabels: { kubernetes.io/metadata.name: kube-system } } }]
ports: [{ protocol: UDP, port: 53 }, { protocol: TCP, port: 53 }]
CoreDNS 설정 확인
kubectl -n kube-system get cm coredns -o yaml
Corefile 의 주요 플러그인
kubernetes 클러스터 서비스 레코드
forward 외부 질의를 어디로 넘길지 (/etc/resolv.conf 또는 지정 DNS)
cache 캐시 TTL
loop DNS 루프 감지 — 잘못 설정하면 CoreDNS 가 기동 실패한다
ready/health 프로브 엔드포인트
forward 대상이 잘못되면 외부 도메인만 안 풀린다 "내부는 되는데 외부가 안 된다" 의 원인이다
규모별 대응
- 소규모 — 기본 설정으로 충분하다 (replicas 2)
- 중규모 — replicas 를 노드 수에 비례해 늘린다
- cache TTL 을 올린다
- 대규모 — NodeLocal DNSCache 를 배포한다
- 노드마다 캐시 파드가 뜨고 파드는 그것을 본다
- CoreDNS 로 가는 질의가 크게 준다
- 노드 간 홉이 사라져 지연도 준다
DNS 는 조용히 전체 지연에 기여하는 항목이라 문제가 드러났을 때는 이미 늦은 경우가 많다
면접 함정
- ❌ "DNS는 그냥 되는 것" → ndots 때문에 외부 조회 비용이 크다.
- ❌ "egress를 막아도 DNS는 예외" → 명시적으로 열어야 한다.