CoreDNS 是 Kubernetes 環境的?DNS add-on[1]組件。它是在控制平面節點中運行的組件之一,使其正常運行和響應是 Kubernetes 集群正常運行的關鍵。學習如何監控 CoreDNS,以及它最重要的指標是什么,對于運維團隊來說是必須的。
DNS 是每個體系結構中最敏感和最重要的服務之一。應用程序、微服務、服務、主機......如今,萬物互聯,并不一定意味著只用于內部服務。它也可以應用于外部服務。DNS 負責解析域名并關聯內部或外部服務和 PodIP。維護 Pod 的 DNS 記錄是一項關鍵任務,尤其是涉及到臨時 Pod 時,IP 地址可以在沒有警告的情況下隨時更改。
如果您在 Kubernetes 中運行您的工作負載,并且您不知道如何監控 CoreDNS,請繼續閱讀本文:如何使用 Prometheus 來抓取 CoreDNS 指標,您應該檢查哪些指標,以及它們的含義。
什么是 Kubernetes CoreDNS?
從 Kubernetes 1.11 開始,在基于 DNS 的服務發現達到一般可用性 (GA) 之后,引入了?CoreDNS[2]?作為 kube-dns 的替代方案,CoreDNS 到目前為止一直是 Kubernetes 事實上集群的 DNS 引擎。顧名思義,CoreDNS 是一種用 Go 編寫的 DNS 服務,因其靈活性而被廣泛采用。
談到 kube-DNS 附加組件,它是以單個 pod 中三個不同容器的形式提供整個 DNS 功能: kubedns、 dnsmasq 和 sidecar。我們來看看這三個容器:
kubedns:這是 Kubernetes 的 SkyDNS 實現。它負責 Kubernetes 集群內的 DNS 解析。它監視 Kubernetes API 并提供適當的 DNS 記錄。
dnsmasq: 為 SkyDNS 解析請求提供 DNS 緩存機制。
sidecar:此容器導出指標并對 DNS 服務執行健康檢查。
現在讓我們談談 CoreDNS!
CoreDNS 解決了 Kube-dns 當時帶來的一些問題。Dnsmasq 引入了一些安全漏洞問題,導致在過去需要 Kubernetes 安全補丁。此外,CoreDNS 在一個容器中而不是 kube-dns 中需要的三個容器中提供所有功能,解決了 kube-dns 中外部服務的存根域的一些其他問題。
CoreDNS 在 9153 端口上公開其指標端點,并且可以從 SDN 網絡中的 Pod 或主機節點網絡訪問它。
# 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" } ] } ]
您已經知道 CoreDNS 是什么以及已經解決的問題。是時候深入了解如何獲取 CoreDNS 指標,以及如何配置 Prometheus 實例以開始抓取其指標。讓我們開始吧!
如何在 Kubernetes 中監控 CoreDNS?
正如您剛剛看到的那樣,CoreDNS 已經被檢測并在每個 CoreDNS Pod 的端口 9153 上公開了?端點。訪問這個?端點很簡單,只需運行 curl 并立即開始提取 CoreDNS 指標!/metrics/metrics
手動訪問端點
知道運行 CoreDNS 的端點或 IP 后,請嘗試訪問 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)
您還可以通過 Kubernetes 集群中默認公開的 CoreDNS Kubernetes 服務訪問端點。/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 指標
Prometheus 提供了一組角色來開始發現目標并從多個來源(如 Pods、 Kubernetes 節點和 Kubernetes 服務等)獲取指標。當需要從嵌入在 Kubernetes 集群中的 CoreDNS 服務中獲取指標時,您只需要使用適當的配置來配置 prometheus.yml 文件。這一次,您應該使用?endpoints role[3]?來發現這個目標。
編輯包含配置文件的。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
此時,在重新部署 Prometheus Pod 后,您應該能夠在 Prometheus 控制臺中看到可用的 CoreDNS 指標端點(轉到 Status -> Targets)。
CoreDNS 指標從現在開始可用,并可從 Prometheus 控制臺訪問。
應該檢查哪些指標?
注意:CoreDNS 指標可能因 Kubernetes 版本和平臺而異。在這里,我們使用了 Kubernetes 1.25 和 CoreDNS 1.9.3。您可以在?CoreDNS 存儲庫[4]?中檢查適用于您的版本的指標。
首先,讓我們談談可用性。集群中運行的 CoreDNS 副本數量可能會有所不同,因此最好進行監控,以防出現任何可能影響可用性和性能的變化。
CoreDNS 副本數:如果您想監控在 Kubernetes 環境中運行的 CoreDNS 副本數,您可以通過計算. 此指標提供有關在此類 Pod 上運行的 CoreDNS 構建的信息。coredns_build_info metric
?
?
count(coredns_build_info)
?
?
從現在開始,讓我們遵循四個黃金信號方法。在本節中,您將學習如何從該角度監控 CoreDNS,測量錯誤、延遲、流量和飽和度。
錯誤 Errors
能夠測量 CoreDNS 服務中的錯誤數量是更好地了解 Kubernetes 集群、應用程序和服務健康狀況的關鍵。如果任何應用程序或內部 Kubernetes 組件從 DNS 服務收到意外錯誤響應,您可能會遇到嚴重的麻煩。當心?SERVFAIL?和?REFUSED?錯誤。在解析 Kubernetes 內部組件和應用程序的名稱時,這些可能意味著問題。
coredns_dns_responses_total:此計數器提供有關 CoreDNS 響應代碼、命名空間和 CoreDNS 實例的數量的信息。您可能希望獲取每個響應代碼的速率。它始終是測量 CoreDNS 實例中的錯誤率的有用方法。
sum(rate(coredns_dns_responses_total{instance=~".*"}[2m])) by (rcode, instance)
?
?
延遲 Latency
測量延遲是確保 DNS 服務性能最佳以在 Kubernetes 中正常運行的關鍵。如果延遲很高或隨著時間的推移而增加,則可能表示存在負載問題。如果 CoreDNS 實例過載,您可能會遇到 DNS 名稱解析問題,并預計您的應用程序和 Kubernetes 內部服務會出現延遲甚至中斷。
coredns_dns_request_duration_seconds_bucket:CoreDNS 請求持續時間(以秒為單位)。您可能想要計算第 99 個百分位數,以查看延遲在 CoreDNS 實例之間的分布情況。
histogram_quantile(0.99, sum(rate(coredns_dns_request_duration_seconds_bucket{instance=~".*"}[2m])) by (server,zone,le,instance))
?
?
流量 Traffic
CoreDNS 服務正在處理的流量或請求量。監控 CoreDNS 中的流量非常重要,值得定期檢查。觀察流量是否有峰值或任何趨勢變化是保證良好性能和避免問題的關鍵。
coredns_dns_requests_total:每個區域、協議和系列的 DNS 請求計數器。您可能希望按類型(A、AAAA)測量和監控 CoreDNS 請求的速率。?代表 ipv4 查詢,而?是 ipv6 查詢。AAAAA
(sum(rate(coredns_dns_requests_total{instance=~".*"}[2m])) by (type,instance))
?
?
飽和度 Saturation
您可以使用系統資源消耗指標(例如 CoreDNS Pod 的 CPU、內存和網絡使用情況)輕松監控 CoreDNS 飽和度。
其他的
CoreDNS 實現了一種緩存機制[5],允許 DNS 服務緩存記錄長達 3600 秒。此緩存可以顯著降低 CoreDNS 負載并提高性能。
coredns_cache_hits_total:緩存命中計數器。您可能希望通過運行以下查詢來監視緩存命中率。多虧了這個 PromQL 查詢,您可以輕松監控 CoreDNS 緩存命中的拒絕率和成功率。
sum(rate(coredns_cache_hits_total{instance=~".*"}[2m])) by (type,instance)
?
?
結論
與 kube-dns 一起,CoreDNS 是可用于在 Kubernetes 環境中實施 DNS 服務的選擇之一。DNS 是 Kubernetes 集群正常運行所必需的,而 CoreDNS 一直是大多數人的首選,因為它的靈活性以及與 kube-dns 相比它解決的問題數量。
如果您想確保您的 Kubernetes 基礎設施健康且正常工作,您必須持續檢查您的 DNS 服務。確保在每個應用程序、操作系統、IT 架構或云環境中正常運行是關鍵。
在本文中,您了解了如何提取 CoreDNS 指標以及如何配置您自己的 Prometheus 實例以從 CoreDNS 端點抓取指標。得益于 CoreDNS 的關鍵指標,您可以輕松地在任何 Kubernetes 環境中開始監控您自己的 CoreDNS。
?
編輯:黃飛
?
評論
查看更多