CoreDNS 是 Kubernetes 環(huán)境的?DNS add-on[1]組件。它是在控制平面節(jié)點(diǎn)中運(yùn)行的組件之一,使其正常運(yùn)行和響應(yīng)是 Kubernetes 集群正常運(yùn)行的關(guān)鍵。學(xué)習(xí)如何監(jiān)控 CoreDNS,以及它最重要的指標(biāo)是什么,對(duì)于運(yùn)維團(tuán)隊(duì)來(lái)說(shuō)是必須的。
DNS 是每個(gè)體系結(jié)構(gòu)中最敏感和最重要的服務(wù)之一。應(yīng)用程序、微服務(wù)、服務(wù)、主機(jī)......如今,萬(wàn)物互聯(lián),并不一定意味著只用于內(nèi)部服務(wù)。它也可以應(yīng)用于外部服務(wù)。DNS 負(fù)責(zé)解析域名并關(guān)聯(lián)內(nèi)部或外部服務(wù)和 PodIP。維護(hù) Pod 的 DNS 記錄是一項(xiàng)關(guān)鍵任務(wù),尤其是涉及到臨時(shí) Pod 時(shí),IP 地址可以在沒(méi)有警告的情況下隨時(shí)更改。
如果您在 Kubernetes 中運(yùn)行您的工作負(fù)載,并且您不知道如何監(jiān)控 CoreDNS,請(qǐng)繼續(xù)閱讀本文:如何使用 Prometheus 來(lái)抓取 CoreDNS 指標(biāo),您應(yīng)該檢查哪些指標(biāo),以及它們的含義。
什么是 Kubernetes CoreDNS?
從 Kubernetes 1.11 開(kāi)始,在基于 DNS 的服務(wù)發(fā)現(xiàn)達(dá)到一般可用性 (GA) 之后,引入了?CoreDNS[2]?作為 kube-dns 的替代方案,CoreDNS 到目前為止一直是 Kubernetes 事實(shí)上集群的 DNS 引擎。顧名思義,CoreDNS 是一種用 Go 編寫(xiě)的 DNS 服務(wù),因其靈活性而被廣泛采用。
談到 kube-DNS 附加組件,它是以單個(gè) pod 中三個(gè)不同容器的形式提供整個(gè) DNS 功能: kubedns、 dnsmasq 和 sidecar。我們來(lái)看看這三個(gè)容器:
kubedns:這是 Kubernetes 的 SkyDNS 實(shí)現(xiàn)。它負(fù)責(zé) Kubernetes 集群內(nèi)的 DNS 解析。它監(jiān)視 Kubernetes API 并提供適當(dāng)?shù)?DNS 記錄。
dnsmasq: 為 SkyDNS 解析請(qǐng)求提供 DNS 緩存機(jī)制。
sidecar:此容器導(dǎo)出指標(biāo)并對(duì) DNS 服務(wù)執(zhí)行健康檢查。
現(xiàn)在讓我們談?wù)?CoreDNS!
CoreDNS 解決了 Kube-dns 當(dāng)時(shí)帶來(lái)的一些問(wèn)題。Dnsmasq 引入了一些安全漏洞問(wèn)題,導(dǎo)致在過(guò)去需要 Kubernetes 安全補(bǔ)丁。此外,CoreDNS 在一個(gè)容器中而不是 kube-dns 中需要的三個(gè)容器中提供所有功能,解決了 kube-dns 中外部服務(wù)的存根域的一些其他問(wèn)題。
CoreDNS 在 9153 端口上公開(kāi)其指標(biāo)端點(diǎn),并且可以從 SDN 網(wǎng)絡(luò)中的 Pod 或主機(jī)節(jié)點(diǎn)網(wǎng)絡(luò)訪問(wèn)它。
# kubectl get ep kube-dns -n kube-system -o json |jq -r ".subsets" [ { "addresses": [ { "ip": "192.169.107.100", "nodeName": "k8s-control-2.lab.example.com", "targetRef": { "kind": "Pod", "name": "coredns-565d847f94-rz4b6", "namespace": "kube-system", "uid": "c1b62754-4740-49ca-b506-3f40fb681778" } }, { "ip": "192.169.203.46", "nodeName": "k8s-control-3.lab.example.com", "targetRef": { "kind": "Pod", "name": "coredns-565d847f94-8xqxg", "namespace": "kube-system", "uid": "bec3ca63-f09a-4007-82e9-0e147e8587de" } } ], "ports": [ { "name": "dns-tcp", "port": 53, "protocol": "TCP" }, { "name": "dns", "port": 53, "protocol": "UDP" }, { "name": "metrics", "port": 9153, "protocol": "TCP" } ] } ]
您已經(jīng)知道 CoreDNS 是什么以及已經(jīng)解決的問(wèn)題。是時(shí)候深入了解如何獲取 CoreDNS 指標(biāo),以及如何配置 Prometheus 實(shí)例以開(kāi)始抓取其指標(biāo)。讓我們開(kāi)始吧!
如何在 Kubernetes 中監(jiān)控 CoreDNS?
正如您剛剛看到的那樣,CoreDNS 已經(jīng)被檢測(cè)并在每個(gè) CoreDNS Pod 的端口 9153 上公開(kāi)了?端點(diǎn)。訪問(wèn)這個(gè)?端點(diǎn)很簡(jiǎn)單,只需運(yùn)行 curl 并立即開(kāi)始提取 CoreDNS 指標(biāo)!/metrics/metrics
手動(dòng)訪問(wèn)端點(diǎn)
知道運(yùn)行 CoreDNS 的端點(diǎn)或 IP 后,請(qǐng)嘗試訪問(wèn) 9153 端口。
# curl http://192.169.203.46:9153/metrics # 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.18.2",revision="45b0a11",version="1.9.3"} 1 # HELP coredns_cache_entries The number of elements in the cache. # TYPE coredns_cache_entries gauge coredns_cache_entries{server="dns://:53",type="denial",zones="."} 46 coredns_cache_entries{server="dns://:53",type="success",zones="."} 9 # HELP coredns_cache_hits_total The count of cache hits. # TYPE coredns_cache_hits_total counter coredns_cache_hits_total{server="dns://:53",type="denial",zones="."} 6471 coredns_cache_hits_total{server="dns://:53",type="success",zones="."} 6596 # 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://:53",zones="."} 1951 # HELP coredns_cache_requests_total The count of cache requests. # TYPE coredns_cache_requests_total counter coredns_cache_requests_total{server="dns://:53",zones="."} 15018 # HELP coredns_dns_request_duration_seconds Histogram of the time (in seconds) each request took per zone. # TYPE coredns_dns_request_duration_seconds histogram coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="0.00025"} 14098 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="0.0005"} 14836 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="0.001"} 14850 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="0.002"} 14856 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="0.004"} 14857 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="0.008"} 14870 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="0.016"} 14879 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="0.032"} 14883 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="0.064"} 14884 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="0.128"} 14884 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="0.256"} 14885 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="0.512"} 14886 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="1.024"} 14887 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="2.048"} 14903 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="4.096"} 14911 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="8.192"} 15018 coredns_dns_request_duration_seconds_bucket{server="dns://:53",zone=".",le="+Inf"} 15018 coredns_dns_request_duration_seconds_sum{server="dns://:53",zone="."} 698.531992215999 coredns_dns_request_duration_seconds_count{server="dns://:53",zone="."} 15018 … (output truncated)
您還可以通過(guò) Kubernetes 集群中默認(rèn)公開(kāi)的 CoreDNS Kubernetes 服務(wù)訪問(wèn)端點(diǎn)。/metrics
# kubectl get svc -n kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.96.0.1053/UDP,53/TCP,9153/TCP 129d # kubectl exec -it my-pod -n default -- /bin/bash # curl http://kube-dns.kube-system.svc:9153/metrics
如何配置 Prometheus 以抓取 CoreDNS 指標(biāo)
Prometheus 提供了一組角色來(lái)開(kāi)始發(fā)現(xiàn)目標(biāo)并從多個(gè)來(lái)源(如 Pods、 Kubernetes 節(jié)點(diǎn)和 Kubernetes 服務(wù)等)獲取指標(biāo)。當(dāng)需要從嵌入在 Kubernetes 集群中的 CoreDNS 服務(wù)中獲取指標(biāo)時(shí),您只需要使用適當(dāng)?shù)呐渲脕?lái)配置 prometheus.yml 文件。這一次,您應(yīng)該使用?endpoints role[3]?來(lái)發(fā)現(xiàn)這個(gè)目標(biāo)。
編輯包含配置文件的。prometheus.ymlConfigMap
# kubectl edit cm prometheus-server -n monitoring -o yaml
然后,在部分下添加下面的配置片段。scrape_configs
- honor_labels: true job_name: kubernetes-service-endpoints kubernetes_sd_configs: - role: endpoints relabel_configs: - action: keep regex: true source_labels: - __meta_kubernetes_service_annotation_prometheus_io_scrape - action: drop regex: true source_labels: - __meta_kubernetes_service_annotation_prometheus_io_scrape_slow - action: replace regex: (https?) source_labels: - __meta_kubernetes_service_annotation_prometheus_io_scheme target_label: __scheme__ - action: replace regex: (.+) source_labels: - __meta_kubernetes_service_annotation_prometheus_io_path target_label: __metrics_path__ - action: replace regex: (.+?)(?::d+)?;(d+) replacement: $1:$2 source_labels: - __address__ - __meta_kubernetes_service_annotation_prometheus_io_port target_label: __address__ - action: labelmap regex: __meta_kubernetes_service_annotation_prometheus_io_param_(.+) replacement: __param_$1 - action: labelmap regex: __meta_kubernetes_service_label_(.+) - action: replace source_labels: - __meta_kubernetes_namespace target_label: namespace - action: replace source_labels: - __meta_kubernetes_service_name target_label: service - action: replace source_labels: - __meta_kubernetes_pod_node_name target_label: node
此時(shí),在重新部署 Prometheus Pod 后,您應(yīng)該能夠在 Prometheus 控制臺(tái)中看到可用的 CoreDNS 指標(biāo)端點(diǎn)(轉(zhuǎn)到 Status -> Targets)。
CoreDNS 指標(biāo)從現(xiàn)在開(kāi)始可用,并可從 Prometheus 控制臺(tái)訪問(wèn)。
應(yīng)該檢查哪些指標(biāo)?
注意:CoreDNS 指標(biāo)可能因 Kubernetes 版本和平臺(tái)而異。在這里,我們使用了 Kubernetes 1.25 和 CoreDNS 1.9.3。您可以在?CoreDNS 存儲(chǔ)庫(kù)[4]?中檢查適用于您的版本的指標(biāo)。
首先,讓我們談?wù)効捎眯?。集群中運(yùn)行的 CoreDNS 副本數(shù)量可能會(huì)有所不同,因此最好進(jìn)行監(jiān)控,以防出現(xiàn)任何可能影響可用性和性能的變化。
CoreDNS 副本數(shù):如果您想監(jiān)控在 Kubernetes 環(huán)境中運(yùn)行的 CoreDNS 副本數(shù),您可以通過(guò)計(jì)算. 此指標(biāo)提供有關(guān)在此類(lèi) Pod 上運(yùn)行的 CoreDNS 構(gòu)建的信息。coredns_build_info metric
?
?
count(coredns_build_info)
?
?
從現(xiàn)在開(kāi)始,讓我們遵循四個(gè)黃金信號(hào)方法。在本節(jié)中,您將學(xué)習(xí)如何從該角度監(jiān)控 CoreDNS,測(cè)量錯(cuò)誤、延遲、流量和飽和度。
錯(cuò)誤 Errors
能夠測(cè)量 CoreDNS 服務(wù)中的錯(cuò)誤數(shù)量是更好地了解 Kubernetes 集群、應(yīng)用程序和服務(wù)健康狀況的關(guān)鍵。如果任何應(yīng)用程序或內(nèi)部 Kubernetes 組件從 DNS 服務(wù)收到意外錯(cuò)誤響應(yīng),您可能會(huì)遇到嚴(yán)重的麻煩。當(dāng)心?SERVFAIL?和?REFUSED?錯(cuò)誤。在解析 Kubernetes 內(nèi)部組件和應(yīng)用程序的名稱時(shí),這些可能意味著問(wèn)題。
coredns_dns_responses_total:此計(jì)數(shù)器提供有關(guān) CoreDNS 響應(yīng)代碼、命名空間和 CoreDNS 實(shí)例的數(shù)量的信息。您可能希望獲取每個(gè)響應(yīng)代碼的速率。它始終是測(cè)量 CoreDNS 實(shí)例中的錯(cuò)誤率的有用方法。
sum(rate(coredns_dns_responses_total{instance=~".*"}[2m])) by (rcode, instance)
?
?
延遲 Latency
測(cè)量延遲是確保 DNS 服務(wù)性能最佳以在 Kubernetes 中正常運(yùn)行的關(guān)鍵。如果延遲很高或隨著時(shí)間的推移而增加,則可能表示存在負(fù)載問(wèn)題。如果 CoreDNS 實(shí)例過(guò)載,您可能會(huì)遇到 DNS 名稱解析問(wèn)題,并預(yù)計(jì)您的應(yīng)用程序和 Kubernetes 內(nèi)部服務(wù)會(huì)出現(xiàn)延遲甚至中斷。
coredns_dns_request_duration_seconds_bucket:CoreDNS 請(qǐng)求持續(xù)時(shí)間(以秒為單位)。您可能想要計(jì)算第 99 個(gè)百分位數(shù),以查看延遲在 CoreDNS 實(shí)例之間的分布情況。
histogram_quantile(0.99, sum(rate(coredns_dns_request_duration_seconds_bucket{instance=~".*"}[2m])) by (server,zone,le,instance))
?
?
流量 Traffic
CoreDNS 服務(wù)正在處理的流量或請(qǐng)求量。監(jiān)控 CoreDNS 中的流量非常重要,值得定期檢查。觀察流量是否有峰值或任何趨勢(shì)變化是保證良好性能和避免問(wèn)題的關(guān)鍵。
coredns_dns_requests_total:每個(gè)區(qū)域、協(xié)議和系列的 DNS 請(qǐng)求計(jì)數(shù)器。您可能希望按類(lèi)型(A、AAAA)測(cè)量和監(jiān)控 CoreDNS 請(qǐng)求的速率。?代表 ipv4 查詢,而?是 ipv6 查詢。AAAAA
(sum(rate(coredns_dns_requests_total{instance=~".*"}[2m])) by (type,instance))
?
?
飽和度 Saturation
您可以使用系統(tǒng)資源消耗指標(biāo)(例如 CoreDNS Pod 的 CPU、內(nèi)存和網(wǎng)絡(luò)使用情況)輕松監(jiān)控 CoreDNS 飽和度。
其他的
CoreDNS 實(shí)現(xiàn)了一種緩存機(jī)制[5],允許 DNS 服務(wù)緩存記錄長(zhǎng)達(dá) 3600 秒。此緩存可以顯著降低 CoreDNS 負(fù)載并提高性能。
coredns_cache_hits_total:緩存命中計(jì)數(shù)器。您可能希望通過(guò)運(yùn)行以下查詢來(lái)監(jiān)視緩存命中率。多虧了這個(gè) PromQL 查詢,您可以輕松監(jiān)控 CoreDNS 緩存命中的拒絕率和成功率。
sum(rate(coredns_cache_hits_total{instance=~".*"}[2m])) by (type,instance)
?
?
結(jié)論
與 kube-dns 一起,CoreDNS 是可用于在 Kubernetes 環(huán)境中實(shí)施 DNS 服務(wù)的選擇之一。DNS 是 Kubernetes 集群正常運(yùn)行所必需的,而 CoreDNS 一直是大多數(shù)人的首選,因?yàn)樗撵`活性以及與 kube-dns 相比它解決的問(wèn)題數(shù)量。
如果您想確保您的 Kubernetes 基礎(chǔ)設(shè)施健康且正常工作,您必須持續(xù)檢查您的 DNS 服務(wù)。確保在每個(gè)應(yīng)用程序、操作系統(tǒng)、IT 架構(gòu)或云環(huán)境中正常運(yùn)行是關(guān)鍵。
在本文中,您了解了如何提取 CoreDNS 指標(biāo)以及如何配置您自己的 Prometheus 實(shí)例以從 CoreDNS 端點(diǎn)抓取指標(biāo)。得益于 CoreDNS 的關(guān)鍵指標(biāo),您可以輕松地在任何 Kubernetes 環(huán)境中開(kāi)始監(jiān)控您自己的 CoreDNS。
?
編輯:黃飛
?
評(píng)論