title: "Istio DNS proxy: 지연 개선, DNS 부하 감소"
description: "Kubernetes 환경에서의 Istio DNS Proxy 사용에 대한 설명으로, 이를 사용하면 CoreDNS를 포함한 DNS server로의 호출이 대폭 줄어든다. 이는 DNS server로의 부하 감소 뿐 아니라 app의 응답 속도 개선으로 이어진다."
cleanUrl: /sw-engineer/istio-dns-proxying
ogImage: "<https://anyflower.notion.site/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7570d2fc-66b1-4e23-bb3c-ff7b56842b0d%2F67de4643-ce15-4863-a01f-46ac966fa0d0%2FUntitled.png?table=block&id=e864ed0c-43e2-4f65-a6d4-b64eaa858f08&spaceId=7570d2fc-66b1-4e23-bb3c-ff7b56842b0d&width=1420&userId=&cache=v2>"
floatFirstTOC: right
Kubernetes 환경에서의 Istio DNS Proxy 사용에 대한 설명으로, 이를 사용하면 CoreDNS를 포함한 DNS server로의 호출이 대폭 줄어든다. 이는 DNS server로의 부하 감소 뿐 아니라 app의 응답 속도 개선으로 이어진다. References 은 참조 문서다.
Istio의 DNS Proxying을 눈여겨 보게된 동기는 Nodelocal DNSCache에 대한 대체 가능성 때문이다. 용도가 중복된다면 굳이 둘 모두를 운용할 필요가 없다.
Nodelocal DNSCache는 CoreDNS로의 부하 감소를 위한 DaemonSet
로 동작하는 추가 패키지인데, 이 부하는 iptables 모드의 kube-proxy
환경에서 DNS lookup 실패를 유발한다. Appendix: conntrack race condition과 해결안 은 이에 대한 상세이다.
Service
, Pod
및 Istio ServiceEntry
내 주소를 통해 투명하게(즉, app 변경 없이) DNS 서비스를 이룬다. 나머지 주소에 대해서는 관여하지 않아 일반적 DNS lookup 경로를 그대로 따른다.Istio DNS proxying의 기본 아이디어는 “Istio가 가진 주소 정보 활용”인 듯 보인다. Istio proxy에는 이미 DNS 서비스에 필요한 Domain Name과 VIP(virtual IP - service IP), RIP(real IP - pod IP)가 있기 때문이다.
이를 고려하면 적어도 in-cluster 연산에는 CoreDNS 호출 필요성이 아예 사라진다. 해당 호출이 사라지므로 성능 증대는 물론 CoreDNS에 대한 부하를 (공식 문서 표현에 따르면) ‘drastically’ 완화하여, 이는 pod가 많아질 수록 더욱 그렇다.
Istio DNS Proxying 구조
윗 그림은 Istio DNS proxying 구조로, DNS Proxying에 필요한 Domain name, VIP, RIP가 어떻게 sync되고 사용되는지를 나타낸다. 각 번호는 동작 순서로 1~3은 이들 정보에 대한 sync 과정, 4 ~ 6 부터는 사용 과정이다.
istiod
: 15017
: Kubernetes API Server 참조.istiod
→ Istio proxy: Istio Internals: xDS 참조. 추가로 istiod
는 Kubernetes 뿐 아니라 Istio ServiceEntry
를 통한 Kubernetes 외부의 Domain Name, IP도 함께 보유한다. 이 역시 sync 대상이다.