Node Local DNS Cache

2026. 3. 9. 11:16·IT/기타
반응형

1. 쿠버네티스 DNS의 기본 구조

기본적으로 K8s 클러스터 내부의 모든 Pod는 도메인 질의를 위해 클러스터 단위의 DNS 서버(주로 CoreDNS)를 바라봅니다.

  • 문제점: 서비스 규모가 커지면 수천 개의 Pod가 하나의 CoreDNS로 요청을 보냅니다. 이는 CoreDNS의 부하로 이어지고, 네트워크 지연(Latency)이나 패킷 유실을 발생시킬 수 있습니다.
  • 해결책: 각 노드(Node)에 작은 DNS 캐시 서버를 두는 것, 이것이 쿠버네티스에서의 로컬 캐시 전략입니다.

2. NodeLocal DNSCache의 등장

쿠버네티스는 NodeLocal DNSCache라는 애드온을 통해 로컬 캐싱을 구현합니다. 이는 각 노드에 데몬셋(DaemonSet) 형태로 실행되는 가벼운 캐싱 에이전트입니다.

작동 원리

  1. Pod의 요청: Pod가 DNS 쿼리를 보내면, 멀리 있는 CoreDNS가 아니라 같은 노드 안에 있는 NodeLocal DNSCache가 먼저 받습니다.
  2. 캐시 히트: 이미 알고 있는 주소라면 즉시 응답합니다. (매우 빠름)
  3. 캐시 미스: 모르는 주소라면 TCP를 통해 클러스터의 CoreDNS에 물어보고 결과를 캐싱한 뒤 Pod에 전달합니다.

3. 왜 쿠버네티스에서 로컬 캐시를 써야 할까?

① 인프라 안정성 (dnstap / Conntrack 문제 해결)

리눅스 커널의 네트워크 추적(conntrack) 기능에서 발생하는 레이스 컨디션(Race Condition)으로 인해 DNS 응답이 5초씩 걸리는 고질적인 이슈가 있습니다. 로컬 캐시는 UDP 대신 TCP를 사용해 CoreDNS와 통신함으로써 이 문제를 원천 봉쇄합니다.

② 성능 최적화

  • Latency 감소: 노드 외부로 나가지 않고 로컬에서 응답을 처리하므로 응답 시간이 대폭 단축됩니다.
  • CoreDNS 부하 절감: 클러스터 전체 DNS 트래픽의 상당 부분을 노드 수준에서 처리하므로 CoreDNS가 과부하로 뻗는 일을 방지합니다.

③ 검색 도메인 최적화 (ndots 문제)

K8s는 ndots:5라는 설정을 기본으로 사용합니다. 이는 외부 도메인 하나를 찾기 위해 내부 도메인 형식으로 먼저 4~5번 헛발질(질의)을 한다는 뜻인데, 로컬 캐시는 이런 불필요한 반복 질의를 훨씬 효율적으로 관리합니다.

 


CoreDNS IP 확인

kube-system   kube-dns   ClusterIP      10.254.0.10      <none>        53/UDP,53/TCP,9153/TCP           513d

 

wget https://github.com/kubernetes/kubernetes/raw/master/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml

 

우선 내가 이해한 DNS 플로우임

Pod -> localdns -> 캐시있으면 그대로 localdns에서 질의 -> 캐시없으면 coredns로 넘김

 

우선 pod에서 localdns를 기본적으로 바라보게해야함 (빨간글씨가 원래  10.254.0.10로 되어있었음. kube-dns svc IP임)

 

워커노드 kubelet 변경함 (/etc/kubernetes/kubelet)

KUBELET_ARGS="--pod-manifest-path=/etc/kubernetes/manifests --kubeconfig /etc/kubernetes/kubelet-config.yaml --hostname-override=dev-cluster-int-worker-b-node-0 --address=10.2.0.79 --port=10250 --read-only-port=0 --anonymous-auth=false --authorization-mode=Webhook --authentication-token-webhook=true --cluster-dns=169.254.20.10 --cluster-domain=cluster.local --volume-plugin-dir=/var/lib/kubelet/volumeplugins --node-labels=magnum.openstack.org/role=worker --node-labels=magnum.openstack.org/nodegroup=worker-b --protect-kernel-defaults  --cloud-provider=external --client-ca-file=/etc/kubernetes/pki/ca.crt --tls-cert-file=/etc/kubernetes/pki/kubelet.crt --tls-private-key-file=/etc/kubernetes/pki/kubelet.key --cgroup-driver=systemd --runtime-cgroups=/system.slice/containerd.service --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock --resolv-conf /run/systemd/resolve/resolv.conf --node-ip=10.2.0.79"

KUBE_TLS_CIPHER="--tls-cipher-suites=TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_256_GCM_SHA384"

 

 

테스트 파드 띄우고 네임서버 변경 확인

 

# kubectl run dns-test --image=busybox:1.28 -- sleep 36000

pod/dns-test created

 

# kubectl get pod

NAME       READY   STATUS    RESTARTS   AGE

dns-test   1/1     Running   0          3s

dnsutils   1/1     Running   0          21h

 

# kubectl exec dns-test -- cat /etc/resolv.conf

search default.svc.cluster.local svc.cluster.local cluster.local openstacklocal

nameserver 169.254.20.10

options ndots:5

 

메트릭 확인

 

머리가 너무아픔
중간 정리

┌───────────────────────────┐
│          Pod                                                     │
│  (nslookup, curl 등 실행)                               │
└──────────────┬────────────┘
                                       │
                                      ▼
┌───────────────────────────┐
│    NodeLocalDNS (169.254.x.x)  
│    - hosts 없음
│    - local cache only
└──────────────┬────────────┘
                                      │ forward
                                     ▼
┌───────────────────────────┐
│        CoreDNS (10.254.0.10)    
│    - hosts 플러그인 보유
│      → a.com = 180.210.88.178
│      → test.a.com = SAME
│      → abcd.unknown.gbsa = 1.1.1.1
│    - cluster.local
│    - upstream resolver (/etc/resolv.conf)
└──────────────┬────────────┘
                                      │
                                     ▼
┌───────────────────────────┐
│   외부 DNS (ISP / Public) │
│   - google.com 같은 일반 도메인
└───────────────────────────┘

 

POD는 항상 NodeLocalDNS로 질의한다

위에서 변경한 kubelet 설정 때문에, Pod가 생성될때 /etc/resolv.conf는 NodeLocalDNS로 설정됨

/etc/resolv.conf
nameserver 169.254.20.10

 

실제 Query 흐름

 

Pod → NodeLocalDNS → CoreDNS(hosts hit → 바로 응답) → NodeLocalDNS → Pod

NodeLocalDNS에는 hosts 룰이 없지만
CoreDNS가 hosts로 응답하기 때문에 최종적으로 Pod는 원하는 IP를 받음.

 

hosts 조차 없으면 아래와 같음

Pod → NodeLocalDNS → CoreDNS → 외부 DNS → CoreDNS → NodeLocalDNS → Pod

 

테스트

테스트 URL : abcd.unknown.gbsa (CoreDNS에 hosts로 박혀있음)

질의전 매트릭

볼거 없음. 초기화 상태

요약
success cache entries = 0
denial cache entries = 1 (기본적으로 하나 존재)
requests_total = 1
misses_total = 1
hits_total = 0
# HELP coredns_build_info A metric with a constant '1' value labeled by version, revision, and goversion from which CoreDNS was built.
# TYPE coredns_build_info gauge
coredns_build_info{goversion="go1.23.7",revision="",version="1.11.3"} 1
# HELP coredns_cache_entries The number of elements in the cache.
# TYPE coredns_cache_entries gauge
coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="."} 1
coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="cluster.local."} 1
coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="in-addr.arpa."} 1
coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="ip6.arpa."} 1
coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="."} 0
coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="cluster.local."} 0
coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="in-addr.arpa."} 0
coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="ip6.arpa."} 0
# HELP coredns_cache_misses_total The count of cache misses. Deprecated, derive misses from cache hits/requests counters.
# TYPE coredns_cache_misses_total counter
coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="."} 1
coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="cluster.local."} 1
coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="in-addr.arpa."} 1
coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="ip6.arpa."} 1
# HELP coredns_cache_requests_total The count of cache requests.
# TYPE coredns_cache_requests_total counter
coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="."} 1
coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="cluster.local."} 1
coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="in-addr.arpa."} 1
coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="ip6.arpa."} 1

1회 질의 후 매트릭 (첫 질의)

1회의 A/AAAA 질의에도 캐시 entry가 2개 생김

A cache 1개

AAAA cache 1개

→ 즉, 동일 도메인을 lookup 해도 A, AAAA는 별개의 캐시로 관리됨

in-addr.arpa denial 또한 증가

(nslookup은 A, AAAA 뿐 아니라 역검색(PTR)도 자동으로 함)

 

결론

첫 질의는 100% cache miss, CoreDNS로 forward 되었음

NodeLocalDNS는 두 개의 success cache를 저장함

 

요약
success entries = 2
denial (in-addr.arpa) = 2
requests_total = 3
misses_total = 3
hits_total = 0
# HELP coredns_build_info A metric with a constant '1' value labeled by version, revision, and goversion from which CoreDNS was built.
# TYPE coredns_build_info gauge
coredns_build_info{goversion="go1.23.7",revision="",version="1.11.3"} 1
# HELP coredns_cache_entries The number of elements in the cache.
# TYPE coredns_cache_entries gauge
coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="."} 1
coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="cluster.local."} 1
coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="in-addr.arpa."} 2
coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="ip6.arpa."} 1
coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="."} 2
coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="cluster.local."} 0
coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="in-addr.arpa."} 1
coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="ip6.arpa."} 0
# HELP coredns_cache_misses_total The count of cache misses. Deprecated, derive misses from cache hits/requests counters.
# TYPE coredns_cache_misses_total counter
coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="."} 3
coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="cluster.local."} 1
coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="in-addr.arpa."} 3
coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="ip6.arpa."} 1
# HELP coredns_cache_requests_total The count of cache requests.
# TYPE coredns_cache_requests_total counter
coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="."} 3
coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="cluster.local."} 1
coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="in-addr.arpa."} 3
coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="ip6.arpa."} 1

 

30초 (TTL)내에 질의 재시도 매트릭

 

의미

success 캐시 엔트리 변화 없음 → TTL(30s)이 살아 있음

requests_total 증가 3→5

→ 2번의 추가 질의가 들어옴

misses_total

→ 3 → 4

→ 추가 질의 2번 중 1번은 miss → 1번은 hit

hits_total

→ success hit = 1

 

결론

2번 질의 중 1번은 NodeLocalDNS cache hit

나머지 1번은 cache miss → CoreDNS로 재질의되었다는 의미

(보통 AAAA 또는 PTR 질의가 miss가 됨)

요약
success entries = 2 (변화 없음 → TTL 유효)
denial (in-addr.arpa) = 2 (변화 없음)
requests_total = 5
misses_total = 4
hits_total = 1
# HELP coredns_build_info A metric with a constant '1' value labeled by version, revision, and goversion from which CoreDNS was built.
# TYPE coredns_build_info gauge
coredns_build_info{goversion="go1.23.7",revision="",version="1.11.3"} 1
# HELP coredns_cache_entries The number of elements in the cache.
# TYPE coredns_cache_entries gauge
coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="."} 1
coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="cluster.local."} 1
coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="in-addr.arpa."} 2
coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="ip6.arpa."} 1
coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="."} 2
coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="cluster.local."} 0
coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="in-addr.arpa."} 1
coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="ip6.arpa."} 0
# HELP coredns_cache_hits_total The count of cache hits.
# TYPE coredns_cache_hits_total counter
coredns_cache_hits_total{server="dns://169.254.20.10:53",type="denial",view="",zones="in-addr.arpa."} 1
coredns_cache_hits_total{server="dns://169.254.20.10:53",type="success",view="",zones="."} 1
coredns_cache_hits_total{server="dns://169.254.20.10:53",type="success",view="",zones="in-addr.arpa."} 1
# HELP coredns_cache_misses_total The count of cache misses. Deprecated, derive misses from cache hits/requests counters.
# TYPE coredns_cache_misses_total counter
coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="."} 4
coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="cluster.local."} 1
coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="in-addr.arpa."} 3
coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="ip6.arpa."} 1
# HELP coredns_cache_requests_total The count of cache requests.
# TYPE coredns_cache_requests_total counter
coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="."} 5
coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="cluster.local."} 1
coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="in-addr.arpa."} 5
coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="ip6.arpa."} 1

 

왜 HIT가 2가 아니라 1임?

nslookup은 다음을 질의함:

AAAA

A

PTR (in-addr.arpa)

따라서:

A, AAAA는 TTL 30s라서 HIT 가능

그러나 PTR은 TTL이 매우 짧거나 SERVFAIL → MISS 자주 발생 → 그래서 “2번 중 1번만 HIT”가 되는 것.

 


이번에는 CoreDNS에 없는 외부 URL로 테스트 진행

테스트 URL :  www.google.com

 

Google

 

www.google.com

 

TEST1

HELP coredns_build_info A metric with a constant '1' value labeled by version, revision, and goversion from which CoreDNS was built. # TYPE coredns_build_info gauge coredns_build_info{goversion="go1.23.7",revision="",version="1.11.3"} 1 # HELP coredns_cache_entries The number of elements in the cache. # TYPE coredns_cache_entries gauge coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="."} 1 coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="cluster.local."} 1 coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="in-addr.arpa."} 2 coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="ip6.arpa."} 1 coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="."} 2 coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="cluster.local."} 0 coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="in-addr.arpa."} 1 coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="ip6.arpa."} 1 # HELP coredns_cache_hits_total The count of cache hits. # TYPE coredns_cache_hits_total counter coredns_cache_hits_total{server="dns://169.254.20.10:53",type="denial",view="",zones="in-addr.arpa."} 3 # HELP coredns_cache_misses_total The count of cache misses. Deprecated, derive misses from cache hits/requests counters. # TYPE coredns_cache_misses_total counter coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="."} 3 coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="cluster.local."} 1 coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="in-addr.arpa."} 3 coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="ip6.arpa."} 2 # HELP coredns_cache_requests_total The count of cache requests. # TYPE coredns_cache_requests_total counter coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="."} 3 coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="cluster.local."} 1 coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="in-addr.arpa."} 6 coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="ip6.arpa."} 2 # HELP coredns_dns_request_duration_seconds Histogram of the time (in seconds) each request took per zone. # TYPE coredns_dns_request_duration_seconds histogram

 

TEST2

HELP coredns_build_info A metric with a constant '1' value labeled by version, revision, and goversion from which CoreDNS was built. # TYPE coredns_build_info gauge coredns_build_info{goversion="go1.23.7",revision="",version="1.11.3"} 1 # HELP coredns_cache_entries The number of elements in the cache. # TYPE coredns_cache_entries gauge coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="."} 1 coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="cluster.local."} 1 coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="in-addr.arpa."} 2 coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="ip6.arpa."} 1 coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="."} 2 coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="cluster.local."} 0 coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="in-addr.arpa."} 1 coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="ip6.arpa."} 1 # HELP coredns_cache_hits_total The count of cache hits. # TYPE coredns_cache_hits_total counter coredns_cache_hits_total{server="dns://169.254.20.10:53",type="denial",view="",zones="in-addr.arpa."} 6 coredns_cache_hits_total{server="dns://169.254.20.10:53",type="success",view="",zones="."} 2 coredns_cache_hits_total{server="dns://169.254.20.10:53",type="success",view="",zones="in-addr.arpa."} 1 coredns_cache_hits_total{server="dns://169.254.20.10:53",type="success",view="",zones="ip6.arpa."} 1 # HELP coredns_cache_misses_total The count of cache misses. Deprecated, derive misses from cache hits/requests counters. # TYPE coredns_cache_misses_total counter coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="."} 3 coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="cluster.local."} 1 coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="in-addr.arpa."} 4 coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="ip6.arpa."} 2 # HELP coredns_cache_requests_total The count of cache requests. # TYPE coredns_cache_requests_total counter coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="."} 5 coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="cluster.local."} 1 coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="in-addr.arpa."} 11 coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="ip6.arpa."} 3 # HELP coredns_dns_request_duration_seconds Histogram of the time (in seconds) each request took per zone. # TYPE coredns_dns_request_duration_seconds histogram

 

TEST3

HELP coredns_build_info A metric with a constant '1' value labeled by version, revision, and goversion from which CoreDNS was built. # TYPE coredns_build_info gauge coredns_build_info{goversion="go1.23.7",revision="",version="1.11.3"} 1 # HELP coredns_cache_entries The number of elements in the cache. # TYPE coredns_cache_entries gauge coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="."} 1 coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="cluster.local."} 1 coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="in-addr.arpa."} 2 coredns_cache_entries{server="dns://169.254.20.10:53",type="denial",view="",zones="ip6.arpa."} 1 coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="."} 2 coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="cluster.local."} 0 coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="in-addr.arpa."} 1 coredns_cache_entries{server="dns://169.254.20.10:53",type="success",view="",zones="ip6.arpa."} 1 # HELP coredns_cache_hits_total The count of cache hits. # TYPE coredns_cache_hits_total counter coredns_cache_hits_total{server="dns://169.254.20.10:53",type="denial",view="",zones="in-addr.arpa."} 9 coredns_cache_hits_total{server="dns://169.254.20.10:53",type="success",view="",zones="."} 2 coredns_cache_hits_total{server="dns://169.254.20.10:53",type="success",view="",zones="in-addr.arpa."} 1 coredns_cache_hits_total{server="dns://169.254.20.10:53",type="success",view="",zones="ip6.arpa."} 1 # HELP coredns_cache_misses_total The count of cache misses. Deprecated, derive misses from cache hits/requests counters. # TYPE coredns_cache_misses_total counter coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="."} 5 coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="cluster.local."} 1 coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="in-addr.arpa."} 6 coredns_cache_misses_total{server="dns://169.254.20.10:53",view="",zones="ip6.arpa."} 3 # HELP coredns_cache_requests_total The count of cache requests. # TYPE coredns_cache_requests_total counter coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="."} 7 coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="cluster.local."} 1 coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="in-addr.arpa."} 16 coredns_cache_requests_total{server="dns://169.254.20.10:53",view="",zones="ip6.arpa."} 4 # HELP coredns_dns_request_duration_seconds Histogram of the time (in seconds) each request took per zone. # TYPE coredns_dns_request_duration_seconds histogram

 

3개의 케이스에 대한 매트릭임

TEST1 : 최초 DNS 질의

TEST2 : 30초내 두번째 DNS 질의 (TTL:30)

TEST3 : 5분뒤 DNS 재질의

 

매트릭값을 해석하면 아래와 같음

 

 

결론

첫번째 시도 : MISS (최초질의니까 당연함)

두번째 시도 : HIT (TTL 30초 안에 재질의하였으므로 정상)

세번째 시도 : MISS (TTL 30초가 지난뒤 질의 했으므로, 정상)

반응형
저작자표시 (새창열림)

'IT > 기타' 카테고리의 다른 글

OTEL+Jaeger  (0) 2026.03.09
Kyverno  (0) 2026.03.09
S3 + velero  (0) 2026.03.09
OBS <-> PVC 연결  (1) 2026.03.09
젠킨스 + Junit (Maven, Gradle)  (0) 2025.02.25
'IT/기타' 카테고리의 다른 글
  • Kyverno
  • S3 + velero
  • OBS <-> PVC 연결
  • 젠킨스 + Junit (Maven, Gradle)
nyub
nyub
  • nyub
    xinyub cloud
    nyub
  • 전체
    오늘
    어제
    • 전체 글 (171)
      • Cloud (17)
        • AWS (12)
        • KT (3)
        • NHN (2)
      • IT (137)
        • Network (22)
        • Linux (41)
        • Windows server (30)
        • Docker (9)
        • Terraform (5)
        • Git, Github (3)
        • Kubernetes (9)
        • CI CD (11)
        • 기타 (7)
      • Etc (17)
        • TroubleShooting (12)
        • Other Info (4)
        • 자격증 (1)
  • 반응형
  • hELLO· Designed By정상우.v4.10.3
nyub
Node Local DNS Cache
상단으로

티스토리툴바