LabHub

쿠버네티스 네트워크 — 진짜 클러스터에서 · 이름이 풀리는 경로 · 실습

클러스터 DNS 를 실제로 캐본다

LabHub 에서 이어서 보기

이 실습은 진짜 쿠버네티스에서 돕니다

VM 안에 k3s 한 대가 실제로 떠 있습니다. CoreDNS 가 진짜로 돌고, 질의를
로그로 남기며, 파드는 실제 컨테이너입니다. 그래서 "이름을 하나 찾는 데 질의가
몇 번 나가는가" 같은 것을 세어 볼 수 있습니다.

처음 뜨는 데 2분쯤 걸립니다. VM 이 부팅하고 k3s 를 설치하기 때문입니다.

목표

파드가 이름을 찾는 경로를 처음부터 끝까지 따라가고, ndots:5 가 만드는
숨은 비용을 직접 세어 확인한 뒤 dnsConfig 로 고칩니다.

왜 중요한가

클러스터에서 "느리다" 는 신고의 상당수가 DNS 입니다. 그런데 애플리케이션
지표에는 잘 잡히지 않습니다. 요청 하나가 이름 하나를 찾는 데 질의를 다섯 번
날리고 그중 넷이 NXDOMAIN 이어도, 애플리케이션 입장에서는 그냥 "조금 느린
요청" 입니다. CoreDNS 의 부하는 조용히 올라가고, 어느 날 파드 수가 늘면
그때 터집니다.

원인은 resolv.conf 한 줄입니다. ndots:5 는 **점이 5개 미만인 이름은
먼저 검색 도메인을 붙여 시도하라**는 뜻입니다. example.com 은 점이 하나라
example.com.default.svc.cluster.local 부터 물어보게 됩니다. 클러스터 안
이름을 짧게 쓰라고 있는 편의가, 밖으로 나가는 이름에는 그대로 비용이 됩니다.

단계

1. CoreDNS 가 어디에 있고 무엇을 하는지 확인해 /root/k8sdns/coredns.txt 에 저장하세요. kube-dns 서비스의 ClusterIP 와 Corefile 전문이 들어가야 합니다.
2. 파드 안의 /etc/resolv.conf 를 그대로 /root/k8sdns/resolv.txt 에 저장하세요. nameserver·search·options 세 줄이 모두 있어야 합니다.
3. web 이라는 Deployment(레플리카 2, nginx:1.27-alpine, 포트 이름 http)와 같은 이름의 Service 를 만들고, 긴 이름과 짧은 이름 둘 다 조회해 /root/k8sdns/svc-a.txt 에 저장하세요. 같은 ClusterIP 가 나와야 합니다.
4. CoreDNS 의 Corefile 에 log 플러그인을 켜고, example.com두 가지 도구로 각각 조회해 CoreDNS 로그의 질의 수를 세어 /root/k8sdns/ndots.txt 에 저장하세요. queries_nslookup=queries_getaddrinfo= 두 줄로 시작하고 그 아래에 로그를 붙입니다.

참고

단계 8개

  1. CoreDNS 는 어디에 있는가
  2. 파드는 무엇을 보고 이름을 찾는가
  3. 서비스 이름이 주소가 되는 순간
  4. 이름 하나에 질의 몇 번인가
  5. 헤드리스는 무엇을 돌려주는가
  6. 포트 번호를 이름으로 찾는다
  7. ndots 를 낮춰 고친다
  8. 무엇을 배웠나