쿠버네티스 용어 사전
네트워킹CoreDNS · ndots · resolv.conf

클러스터 DNS

서비스 이름을 IP로 바꿔 준다. ndots:5 때문에 외부 도메인 조회에 왕복이 늘어난다.

서비스가 생기면 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는 예외" → 명시적으로 열어야 한다.

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — 네트워킹 — 서비스부터 Gateway API까지