본문으로 바로가기
반응형

Intro

kubnernetes는 MSA의 기반으로 만들어진 오픈소스 솔루션으로 kubernetes 클러스터 내부에서 모두 도메인기반으로 통신을 합니다. 쿠버네티스에서 기본적으로 사용되는 DNS는 CoreDNS입니다. MSA구조는 최대한 작은 단위로 나누어 지기 때문에 클러스터 내부에 서비스가 증가하면할 수록 많은 도메인 쿼리 처리가 필요 하게 됩니다. 여기서 CoreDNS의 성능 저하가 발생할 수 있는데요. 오늘은 CoreDNS앞단에서 도메인 캐싱을 하여 도메인 쿼리 성능을 향상시켜 주는 NodeLocal DNS Cache에 대해 알아 보도록 하겠습니다.

NodLocal DNS Cache란?

Nodelocal DNS Cache는 클러스터 노드에서 DaemonSet으로 DNS캐싱 에이전트를 실행하여 클러스터 DNS성능을 향상 시키는 기술입니다.

Nodelocal DNS Cache를 통해서 Pod안에 application에서 전송하는 Domain Resolve요청을 빠르게 처리할 수 있습니다.

NodeLocal DNS Cache 아키텍처

NodeLocal DNS Cache의 기본적인 개념도는 아래와 같습니다. 일반적인 캐시 개념하고 동일하게 client pod가 DNS요청을 Local DNS Cache에 던질때 DNS정보가 있으면 곧바로 응답을 하고 그렇지 않으면(Cache miss) KubeDNS에 요청을 하는 형태 입니다. Local DNS Cache가 DNS 정보를 갖고 있으면 Client에게 바로 응다할 수 있으므로 성능을 향상 시킬 수 있게 됩니다.

iptables kube-proxy Mode

아래는 Kubernetes Cluster가 iptables kube-proxy Mode를 이용할 때, NodeLocal DNSCache 의 상세 구성도 입니다. 이렇게 깊게 알필요가 있을까 싶지만 최대한 간단히 설명드리겠습니다.

일반적으로 kubernetes 1.12 버전이상 부터는 kubdns보다는 coredns 사용이 권장되고 있습니다. kubedns 와 coredns의 역할은 같지만 완전히 같은 서비스는 아닙니다.

이 coredns는 cluster내부에서 DNS쿼리 요청을 해야하기때문에 pod와 그 앞에 service로 구성이 됩니다. 그림에서는 각각 Cluster CoreDNS pod, Cluster DNS Service.

NodeLocal DNSCache Pod는 Damonset 즉, 모든 Node에 하나씩 구성이 됩니다. 그 내부에는 CoreDNS가 동작하는데 Cache용도로 동작하고 있습니다. Cache CoreDNS의 네트워크 구성이 어떻게 되는지는 사실 크게 중요 하지 않기때문에 눈으로만 간단히 “이런게 있구나” 하고 넘어가면 될 것 같습니다.

리눅스 네트워크에는 Namespace 개념이 있는데 이 Cache CoreDNS는 Host Network Namespace에서 동작합니다. 또한 CoreDNS Service의 ClusterIP인 10.96.0.10과 Local Address IP인중 하나인 169.254.25.10을 IP 주소로 갖는 nodelocaldns Dummy Interface를 생성을 합니다. 참고로 이 Dummy Interface는 실제로 네트워크 트래픽을 전송을하지 않고 패킷 라우팅 역할만하는 interface입니다. 결과적으로 Cache CoreDNS는 10.96.0.10와 169.254.25.10 IP 주소로 Listen 상태로 대기하며 Domain Resolve 요청을 대기하게 됩니다.

이외에 ipvs kube-proxy Mode 에서도 NodeLocal DNSCache 를 지원합니다.

EKS에서 NodeLocal DNS Cache 사용하기

EKS Cluster에서 Node를 어떻게 구성할지는 여러가지 방법이 있지만 오늘은 managed 형태의 Node 구성에서 Node Local DNS Cache 사용하는 방법에 대해 알아보도록 하겠습니다.

EKS Cluster를 구성하고 helm으로 node local dns cache를 설치합니다.

helm repo add cloudflare-exporter https://lablabs.github.io/k8s-nodelocaldns-helm/
helm install k8s-nodelocaldns-helm/node-local-dns

managed Node는 AWS 에서 제공해주는 optimized AMI라고 해서 EKS Cluster를 구성하기 위해 필요한 구성들이 담겨있는 AMI를 필수로 사용하게 됩니다. 이 AMI는 OS가 부팅될때 /etc/eks/bootstrap.sh 가 동작하게 되어있고 여기에는 kubelet을 실행할때 동작하게 하는 여러 옵션값을이 포함되어 있습니다.

그중에 DNS_CLUSTER_IP 가 있는데 기본으로 172.20.0.10 으로 설정이 되도록 구성이 되어있습니다. 이를 Node local DNS Cache의 IP인 169.254.20.10 으로 변경해주어야 합니다.

변경은 Node가 처음생성될때 동작하는 UserData에 아래와 같이 리눅스 쉘 스크립트를 통해서 변경합니다.

반응형