K8S - 쿠버네티스의 Core DNS
Core DNS란?
쿠버네티스 클러스터 상에서 Pod가 어떤 도메인을 질의할 때 CoreDNS가 네임서버로 사용된다. 쿠버네티스 1.12 버전 이후로 표준으로 채택되어, kube-system 네임스페이스에 Pod 형태로 띄워져 있다.
Pod의 네임서버 확인
쿠버네티스 클러스터 상에 배포되어 있는 컨테이너들은 /etc/resolv.conf 파일에 네임서버로 CoreDNS 의 Service인 kube-dns의 ip가 등록되어 있다.
- 네임서버 확인
테스트 파드에 "cat /etc/resolv.conf" 명령어로 kube-dns의 ip가 네임서버로 등록되어있는 것을 확인할 수 있다.
/etc/resolve.conf 파일 내 구성 요소들의 의미는 아래와 같다.
- search : DNS에 질의할 도메인 주소들을 표시. 여기서 사용되는 도메인들은 클러스터 내 서비스 이름에 사용되는 로컬 도메인 접미사이다. 이 접미사를 기반으로 다른 네임스페이스에 속한 svc로 접근이 가능함.
- nameserver : DNS 질의를 보낼 곳. CoreDNS Service의 IP 주소
- ndots : 도메인에 포함된 .(dot)의 최소 개수. 최소 개수 미만이라면 search에 있는 도메인 접미사를 붙여 질의함.
CoreDNS에 질의할 때는 ndots와 search의 조합으로 질의할 도메인이 결정됨.
예를 들어 default-nginx-svc.default(default 네임스페이스에 위치한 default-nginx-svc) 라는 도메인을 질의할 때 . 의 개수가 1개이기 때문에 default-nginx-svc.default.svc.cluster.local. 로 . 의 개수를 5개로 맞춘 후 질의하게 됨.
실제 동작 확인
- Deployment, SVC 배포
위의 설명대로 동작하는지 테스트 할 것이다. 먼저 default 네임스페이스에 deployment와 svc를 생성한다.
# default 네임스페이스에 deploy 생성
$ kubectl create deploy default-nginx --image=nginx --replicas=1
# expose 명령어로 svc 생성하고 포트 오픈
$ kubectl expose deploy default-nginx --name default-nginx-svc --port 80
- curl 테스트
test 네임스페이스에 있는 nginx pod를 사용하여 default 네임스페이스의 default-nginx-svc라는 서비스 도메인으로 curl을 보내고 Core DNS의 로그를 확인해볼 것이다.
# coredns deployment를 logging
$ kubectl logs deploy/coredns -n kube-system -f
# test 네임스페이스의 nginx pod에서 default 네임스페이스의 svc로 curl
$ kubectl exec -it nginx-59bf8459ff-zf5b6 -n test -- curl default-nginx-svc.default
결과
아래 사진은 Core DNS Deploy의 로그이다. "default-nginx-svc.default" 도메인으로 질의했는데, "default-nginx-svc.default.svc.cluster.local."로 search의 도메인과 ndots 5 옵션 값의 조합으로 질의된 것을 볼 수 있다.
마무리
이번 글에서는 Core DNS가 무엇인지와 동작 방식, resolv.conf 파일의 구성요소에 대해서 알아보았다.
참조
https://newdeal123.tistory.com/100
https://jonnung.dev/kubernetes/2020/05/11/kubernetes-dns-about-coredns/