[네떡스터디🔥kans] CoreDNS (작성 중)

 

CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 KANS 3기 내용을 정리한 글입니다.

 

 

CoreDNS

쿠버네티스에서는 서비스를 생성하면 해당 서비스 명이 도메인 명이 되어 호출이 가능해진다. 이것을 가능하게 해주는것은 coredns로 쿠버네티스를 설치하면 kube-system에 가면 들어있는 도메인 서버이다. 플러그인도 다양하게 있어서 기본 설정 이외에도 플러그인으로 추가하여 기능을 확장할 수도 있습니다. 

 

https://coredns.io/

 

CoreDNS: DNS and Service Discovery

 

coredns.io

 

기본 설정 이해하기

처음에 쿠버네티스를 설정하면 다음과 같이 설정되어있습니다.

.:53 {                                   # CoreDNS가 53번 포트에서 DNS 요청을 처리하도록 설정
    errors                               # DNS 쿼리 처리 중 발생한 오류를 로그로 출력
    health {                             # CoreDNS 헬스 체크 활성화
       lameduck 5s                       # 종료 시 5초 동안 요청을 받으며 종료 절차 진행
    }
    ready                                # CoreDNS가 준비 상태(ready)일 때 신호를 보냄
    kubernetes cluster.local in-addr.arpa ip6.arpa {  # Kubernetes 클러스터 내부 DNS 설정
       pods insecure                     # Pod 이름 인증 없이 DNS 조회 가능
       fallthrough in-addr.arpa ip6.arpa # 지정된 도메인 쿼리 실패 시 다음 플러그인으로 넘어감
       ttl 30                            # DNS 응답의 TTL(Time to Live)을 30초로 설정
    }
    prometheus :9153                     # Prometheus 메트릭을 9153 포트로 노출
    forward . /etc/resolv.conf {         # 외부 DNS 서버로 쿼리 포워딩
       max_concurrent 1000               # 최대 1000개의 동시 DNS 요청 처리
    }
    cache 30                             # DNS 응답을 30초 동안 캐싱
    loop                                 # DNS 쿼리 루프 감지 활성화
    reload                               # 구성 파일 변경 시 자동 재로드
    loadbalance                          # 여러 서버로 부하 분산하여 DNS 요청 처리
}

 

Plugin - forward

플러그인 중 forward 플러그인이 있습니다. forward 플러그인은 CoreDNS에서 외부 DNS 서버로 쿼리를 전달하는 데 사용됩니다. 기본 설정으로는 node의 /etc/resolv.conf를 보게 되어있는데 노드의 설정과는 다르게 직접 외부 dns서버로 통신하게도 설정할 수 있습니다. 

 

forward . 8.8.8.8 8.8.4.4 {
   max_concurrent 1000
   policy random
   health_check 5s
}

 

다음과 같이 직접 coredns에서 노드의 파일이 아닌 외부 dns서버로 바로 질의를 하게 됩니다. 

외부 DNS서버로 Forward 하는 구조

 

 

Zone 생성하기

실제로 없는 도메인이지만 쿠버네티스에서만 인식되고 동작하게도 가능합니다. 

 

 

 

(✰) NodeLocal Dns Cache 구성하기

사실 한번도 써본적은 없지만.. 정말 ebpf로 동작하는 cni에 kube-proxy가 없는 한마디로 conntrack 테이블을 사용하지 않아도되는 환경이 아니라면  coredns와 관련한 이슈는 꼭 한번쯤 마주치게 되는 이슈인것 같습니다.

우회방안으로 ndot 설정을 통해 dns쿼리를 줄이고 nodelocal dns 캐싱을 통해 해결하는 분들도 많은 것 같아 공유해보려고 합니다.

 

😱 겪었던 이슈 목록 😱

2024.09.28 - [K8S/issue] - DNS 리졸빙 이슈 파헤치기: Nginx의 갑작스러운 DNS 리졸빙 실패

 

node local dns 구성도

 

 

node local dns 캐싱을 하기 위해서는 각 노드별로 한개의 dns파드를 추가로 더띄워야합니다. 샘플로 제공되는 예제가 있어서 이걸 참고해서 추가하셔도 좋습니다. 

 

# 🔥 주의 🔥 파일 수정 필요
wget https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml

 

이 파일을 다운 받은 뒤로 __ (언더바 2개)로 감싸진 변수들을 올바르게 구성하여서 배포하면 됩니다. 

 

다음의 명령어를 통해 각 변수를 가져옵니다.

kubedns=`kubectl get svc kube-dns -n kube-system -o jsonpath={.spec.clusterIP}`
domain=<cluster-domain>
localdns=<node-local-address>

 

총 변경해야하는 값이 3개가 있습니다. 

  • __PILLAR__DNS__DOMAIN__
  • __PILLAR__LOCAL__DNS__
  • __PILLAR__DNS__SERVER__

 

IPTABLES를 사용하는 경우

sed -i "s/__PILLAR__LOCAL__DNS__/$localdns/g; s/__PILLAR__DNS__DOMAIN__/$domain/g; s/__PILLAR__DNS__SERVER__/$kubedns/g" nodelocaldns.yaml

 

 

IPVS를 사용하는 경우 

sed -i "s/__PILLAR__LOCAL__DNS__/$localdns/g; s/__PILLAR__DNS__DOMAIN__/$domain/g; s/,__PILLAR__DNS__SERVER__//g; s/__PILLAR__CLUSTER__DNS__/$kubedns/g" nodelocaldns.yaml

 

중요한 Metric 정보들 

CoreDNS에서 모니터링할 수 있는 주요 메트릭에 대해 설명합니다. 이러한 메트릭들은 CoreDNS의 성능을 최적화하고 문제를 진단하는 데 중요한 역할을 합니다.

forward 관련 메트릭

forward 플러그인은 CoreDNS가 외부 DNS 서버로 쿼리를 전달할 때 사용하는 플러그인입니다. 이와 관련된 주요 메트릭들은 다음과 같습니다

coredns_forward_healthcheck_broken_total

coredns_forward_max_concurrent_rejects_total

coredns_proxy_request_duration_seconds

coredns_proxy_conn_cache_misses_total

캐시 관련 메트릭

CoreDNS에서 캐시는 DNS 요청에 대한 응답 속도를 높이고 외부 DNS 서버로 보내는 쿼리 수를 줄이기 위해 사용됩니다.

coredns_cache_misses_total

coredns_cache_requests_total

DNS 요청 및 응답 관련 메트릭

이 메트릭들은 CoreDNS가 처리하는 모든 DNS 요청과 응답에 대한 통계 정보를 제공합니다.

coredns_dns_request_duration_seconds

coredns_dns_request_size_bytes

coredns_dns_requests_total

coredns_dns_response_size_bytes

coredns_dns_responses_total

헬스체크 관련 메트릭

CoreDNS는 자체 헬스 체크를 통해 서버의 상태를 지속적으로 모니터링합니다.

coredns_health_request_duration_seconds

coredns_health_request_failures_total

프로세스 및 Go 관련 메트릭

CoreDNS는 Go 언어로 작성되었으며, Go 런타임 환경에 대한 메트릭도 제공됩니다.

go_goroutines

process_cpu_seconds_total

process_resident_memory_bytes