brunch

You can make anything
by writing

C.S.Lewis

by 이권수 Jun 06. 2024

Resolve DNS faster in a pod

Pod에서 조금이나마 빠르게 DNS 쿼리 하는 방법


미디엄에서 글을 보던 중, 다음의 글을 보게 되었다.

https://medium.com/@hmquan08011996/reduce-dns-resolution-time-for-10-000-pods-on-eks-7f8bddef8dc4


전체 내용을 요약하자면, 파드 안에서 도메인을 요청할 때, 끝에 . (trailing dot)을 붙이면 빠르게 쿼리가 가능하다는 것이다. 


생각보다 간단한 방법인데, 어떻게 가능한지 알아보기 위해서 조사를 해보기로 했다.


위 글에서 쿼리가 빨라지는 이유는 쿼리를 보내는 수가 적어지기 때문이다. 그냥 amazon.com을 질의하면, 내부적으로 다음의 3가지를 뒤에 붙여서 먼저 질의한다. 

  - default.svc.cluster.local 

  - svc.cluster.local 

  - cluster.local


즉, 1개를 질의하기 위해서 4개를 질의한다고 보면 된다.


실제로 CoreDNS에서 그렇게 동작하는지 테스트를 해보았다. 먼저, 다음과 같이 Corefile을 수정하여 log를 볼 수 있도록 하고, 파드를 재시작했다.



설정을 마치고, 파드 내에서 amazon.com을 질의했다. 그 결과 위에서 언급했던 것과 동일하게 4개의 레코드가 질의되었다. (마지막 AAAA는 제와)


그러면, Trailing dot을 붙이면 어떻게 될까? 


amazon.com. 으로 질의해 보니, 실제로 레코드가 1개만 질의된 것을 볼 수 있었다.



어떻게 가능한 것일까?


처음에는 CoreDNS 쪽에서 특별하게 기능을 넣어준 것이라 생각했다. 쿠버네티스 상에서는 도메인을 질의하게 되면, cluster.local로 끝나는 도메인을 먼저 찾아주는 건 알고 있었는데, 그 기능이 그냥 당연하게 제공한다고만 생각했다.


확인해 보니, 그건 CoreDNS의 기능이 아니라, glibc에서 기본적으로 제공하는 기능이라는 것을 알게 되었다.


파드에서 /etc/resolv.conf를 확인해 보면 다음과 같이 설정이 되어 있다.

nameserver는 도메인을 질의할 네임서버를 의미하고, 보통은 kube-dns 서비스 주소가 설정된다. 


search는 불완전한(fully qualified) 도메인 이름을 보완하는 데 사용된다. 예컨대, 그냥 hostname 만 질의하면 hostname 뒤에 search 리스트에 나온 도메인을 기본적으로 붙여서 질의한다. 


ndots 옵션은 absolute query로 적용되기 위한 점의 최소 개수이다. Absolute query란 search 도메인을 별도로 붙이지 않고, 실제 사용하는 고유 도메인으로 인식한다는 의미이다. 예컨대,  ndots: 2 이면, example.com 은 search에 나온 리스트를 먼저 붙여서 질의하지만, a.example.com 은 search 부분을 무시하고 바로 해당 도메인을 질의한다. 


위 설정에서처럼 ndots: 5 인 상태에서, 5개 이상의 점을 붙이면 다음과 같이 질의가 1번만 발생한다. 4개 점을 붙인 도메인을 질의했을 때랑 비교해 보면 정확하게 알 수 있다. 




glibc 함수를 살펴보면 이를 정확하게 알 수 있다.


resolv/res_query.c 파일에서  __res_context_search() 함수를 확인해 보면, 다음과 같이 조건이 absolute query에 대한 조건이 걸려있다. 만약 질의한 도메인의 점 개수가 ndots 값 이상이거나 끝에 점(.) 이 있으면 해당 이름으로 __res_context_querydomain 함수를 호출할 때 domain 값을 NULL로 지정한다.


하지만, 만약 두 가지 경우가 아니라면 다음과 같이 search 란에 적어놓은 도메인을 순차적으로 접근하면서 질의를 한다. __res_context_querydomain 함수를 호출할 때 dname으로 search 도메인을 넣는 것을 볼 수 있다.



전체 과정을 요약하면 다음과 같이 정리할 수 있다.






이번 내용은 원리를 알면 간단하지만, 모르면 쉽게 지나칠 수 있는 내용인 것 같다. 쿠버네티스 환경에서는 클러스터 외부 도메인을 질의할 때 최대한 FQDN을 사용하는 게 나중을 위해서도 좋을 수 있겠다는 생각이 든다.



DNS를 직접 만들어보면서 공부하고 싶다면, Python으로 만들어보면서 공부해 보는 것을 추천한다!

링크: https://kmong.com/gig/576754


작가의 이전글 Gunicorn은 어떻게 트래픽을 분산할까?
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari