nodelocaldns
nodelocaldns는 kube-dns에 부담을 완해해주는 dns캐시역할입니다. 쿠버네티스 pod개수가 증가할수록 kube-dns의 부담이 커지는데, kube-dns의 pod가 비정상상태가 되면 쿠버네티스 전체 장애로 확산됩니다.
그래서 아키텍처 관점에서 DNS캐시가 필요했고, nodelocaldns가 쿠버네티스에서 DNS캐시 구현체입니다.

localdns 설치방법
쿠버네티스 공식 홈페이지에 nodelocaldns설치 방법이 공개되어 있습니다. template.yaml에서 sed를 사용하여 localdns IP 등을 치환하여 설치합니다.
- https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/
설치 명령어는 아래가 끝입니다.
wget https://github.com/kubernetes/kubernetes/raw/master/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml
kubedns=$(kubectl get svc -n kube-system kube-dns -o jsonpath='{.spec.clusterIP}')
domain=cluster.local
localdns=169.254.20.10
# linux
sed -i "s/__PILLAR__LOCAL__DNS__/$localdns/g; s/__PILLAR__DNS__DOMAIN__/$domain/g; s/__PILLAR__DNS__SERVER__/$kubedns/g" nodelocaldns.yaml
# mac
sed -i '' "s|__PILLAR__LOCAL__DNS__|$localdns|g; s|__PILLAR__DNS__DOMAIN__|$domain|g; s|__PILLAR__DNS__SERVER__|$kubedns|g" nodelocaldns.yaml
localdns는 hostnetwork를 사용하기 때문에, pod ip가 node ip와 동일합니다.

nodelocaldns 동작원리
nodelocaldns의 동작원리는 kube-dns로 가는 트래픽을 nodelocaldns pod가 대신 받게 하면 됩니다. 구현방법은 kube-proxy 사용 유무에 따라 다릅니다.
kube-proxy를 쓰는 곳
kube-proxy를 쓰는 곳에서는 별도로 설정할 작업이 없습니다. nodelocaldns pod가 실행되면서 작업을 하기 때문입니다.
noodelocaldns pod는 kube-dns pod ip로 가는 dns질의가 가지 않도록, 노드에 NOTRACK규칙을 추가합니다. NOTRACK은 iptables로 설정합니다. 그리고 local route를 생성하여 link local IP(169.254.20.10/32)를 갖는 nodelocaldns pod가 dns질의를 받도록합니다.
ip route show table local


kube-proxy를 안쓰는 곳
cilium처럼 kube-proxy를 안쓴다면, 모든 pod의 /etc/resolv.conf nameserver를 nodelocaldns ip로 변경해야 합니다. ip는 link local ip인 169.254.20.10를 사용합니다.
만약 /etc/resolv.conf 설정이 안되면 모든 pod에 DNS질의가 실패합니다.

실습
저희 github에 실습자료가 있습니다.