云原生之深入解析如何在K8S环境中使用Prometheus来监控CoreDNS指标

一、什么是 Kubernetes CoreDNS?

  • CoreDNS 是 Kubernetes 环境的DNS add-on 组件,它是在控制平面节点中运行的组件之一,使其正常运行和响应是 Kubernetes 集群正常运行的关键。
  • DNS 是每个体系结构中最敏感和最重要的服务之一。应用程序、微服务、服务、主机……如今,万物互联,并不一定意味着只用于内部服务,它也可以应用于外部服务。DNS 负责解析域名并关联内部或外部服务和 PodIP,维护 Pod 的 DNS 记录是一项关键任务,尤其是涉及到临时 Pod 时,IP 地址可以在没有警告的情况下随时更改。
  • 从 Kubernetes 1.11 开始,在基于 DNS 的服务发现达到一般可用性 (GA) 之后,引入了CoreDNS 作为 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 解决了 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"}]}
]

二、如何在 Kubernetes 中监控 CoreDNS?

  • 正如刚刚那样,CoreDNS 已经被检测并在每个 CoreDNS Pod 的端口 9153 上公开了 /metrics 端点。
  • 访问这个 /metrics 端点很简单,只需运行 curl 并立即开始提取 CoreDNS 指标。

① 手动访问端点

  • 知道运行 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)
  • 还可以/metrics通过 Kubernetes 集群中默认公开的 CoreDNS Kubernetes 服务访问端点:
# kubectl get svc -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/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 来发现这个目标。
  • 编辑包含 prometheus.yml 配置文件的 ConfigMap:
# kubectl edit cm prometheus-server -n monitoring -o yaml
  • 然后,在 scrape_configs 部分下添加下面的配置片段:
- honor_labels: truejob_name: kubernetes-service-endpointskubernetes_sd_configs:- role: endpointsrelabel_configs:- action: keepregex: truesource_labels:- __meta_kubernetes_service_annotation_prometheus_io_scrape- action: dropregex: truesource_labels:- __meta_kubernetes_service_annotation_prometheus_io_scrape_slow- action: replaceregex: (https?)source_labels:- __meta_kubernetes_service_annotation_prometheus_io_schemetarget_label: __scheme__- action: replaceregex: (.+)source_labels:- __meta_kubernetes_service_annotation_prometheus_io_pathtarget_label: __metrics_path__- action: replaceregex: (.+?)(?::\d+)?;(\d+)replacement: $1:$2source_labels:- __address__- __meta_kubernetes_service_annotation_prometheus_io_porttarget_label: __address__- action: labelmapregex: __meta_kubernetes_service_annotation_prometheus_io_param_(.+)replacement: __param_$1- action: labelmapregex: __meta_kubernetes_service_label_(.+)- action: replacesource_labels:- __meta_kubernetes_namespacetarget_label: namespace- action: replacesource_labels:- __meta_kubernetes_service_nametarget_label: service- action: replacesource_labels:- __meta_kubernetes_pod_node_nametarget_label: node
  • 此时,在重新部署 Prometheus Pod 后,应该能够在 Prometheus 控制台中看到可用的 CoreDNS 指标端点(转到 Status -> Targets):

在这里插入图片描述

  • CoreDNS 指标从现在开始可用,并可从 Prometheus 控制台访问:

在这里插入图片描述

三、检查指标

  • CoreDNS 指标可能因 Kubernetes 版本和平台而异。在这里使用了 Kubernetes 1.25 和 CoreDNS 1.9.3,可以在 CoreDNS 存储库中检查适用于版本的指标。
  • 首先,集群中运行的 CoreDNS 副本数量可能会有所不同,因此最好进行监控,以防出现任何可能影响可用性和性能的变化。CoreDNS 副本数:如果想监控在 Kubernetes 环境中运行的 CoreDNS 副本数,可以通过计算coredns_build_info metric,此指标提供有关在此类 Pod 上运行的 CoreDNS 构建的信息。
count(coredns_build_info)
  • 从现在开始,遵循四个黄金信号方法。

① 错误 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 请求的速率,A 代表 ipv4 查询,而 AAAA 是 ipv6 查询:
(sum(rate(coredns_dns_requests_total{instance=~".*"}[2m])) by (type,instance))

在这里插入图片描述

④ 饱和度 Saturation

  • 可以使用系统资源消耗指标(例如 CoreDNS Pod 的 CPU、内存和网络使用情况)轻松监控 CoreDNS 饱和度。

⑤ 其他的

  • CoreDNS 实现了一种缓存机制,允许 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 架构或云环境中正常运行是关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/285028.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

去掉乘法的加法神经网络

AdderNet: Do We Really Need Multiplications in Deep Learning? 核心贡献 用filter与input feature之间的L1-范数距离作为“卷积层”的输出为了提升模型性能&#xff0c;提出全精度梯度的反向传播方法根据不同层的梯度级数&#xff0c;提出自适应学习率策略 研究动机 加…

1.[BUU][极客大挑战 2019]EasySQL1

1.了解万能密码--》1 or 11# 这是一种常见的SQL注入攻击。在一个SQL查询中&#xff0c;这个语句会导致条件始终为真&#xff08;11&#xff09;&#xff0c;因此查询会返回所有的结果。#表示注释&#xff0c;可以用来结束SQL语句&#xff0c;防止后续的部分执行。因此&#xf…

HTML_CSS的基本选择器的使用及其作用范围和优先级

目录 ✨CSS的使用&#xff1a;行内样式内部样式外部样式 ✨CSS基本选择器&#xff1a;id选择器class选择器标签选择器 ✨优先级&#xff1a;选择器的优先级样式表的优先级 ✨CSS的使用&#xff1a; 根据定义CSS的位置不同&#xff0c;分为行内样式、内部样式和外部样式 行内样…

【目标检测】视频输出体积太大?分析视频的编码与码率问题

在做视频目标检测时&#xff0c;发现一个问题&#xff0c;检测输出完的视频时大时小&#xff0c;有时输出体积过大&#xff0c;造成播放器播放时严重卡顿现象。本文就这一情况进行分析&#xff0c;并就该问题提出相关解决方案。 视频基础知识 隔行扫描和逐行扫描 早期电视台在…

Unity与Android交互通信系列(2)

在上一篇文章中&#xff0c;我们介绍了Unity和Android交互通信的原理及在Unity中直接调用Java代码的方式&#xff0c;但没有给出代码示例&#xff0c;下面通过实际例子演示上篇文章中AndroidJavaClass、AndroidJavaObject两个类的基本用法&#xff0c;由于交互通信涉及到两端&a…

Rust与python联动进行多线程跑数据

最近有个学弟想请教我联动多线程爬取数据的案例&#xff0c;看了以前的模版没有合适的&#xff0c;我就利用空闲时间&#xff0c;专门给他写了一段模版作为参考。这里遇到注意的是需要代理IP介入&#xff0c;才能让多线程爬取减少网站风控限制。 以下是一个使用 Rust 编写的爬虫…

传统软件集成AI大模型——Function Calling

传统软件和AI大模型的胶水——Function Calling 浅谈GPT对传统软件的影响Function Calling做了什么&#xff0c;为什么选择Function CallingFunction Calling简单例子&#xff0c;如何使用使用场景 浅谈GPT对传统软件的影响 目前为止好多人对chatGPT的使用才停留在OpenAI自己提…

打响指针的第一枪:指针家族

前言 指针其实是我们学习C语言中最难的知识点&#xff0c;很多人在学习指针的时候会被绕晕&#xff0c;包括博主也是&#xff0c;当初百思不得其解&#xff0c;脑袋都要冒烟了&#xff0c;本来打算在学习指针的时候就写一篇博客&#xff0c;但是当初自己的能力还是没有办法去完…

【具身智能评估7】ProcTHOR: Large-Scale Embodied AI Using Procedural Generation

论文标题&#xff1a;ProcTHOR: Large-Scale Embodied AI Using Procedural Generation 论文作者&#xff1a;Matt Deitke, Eli VanderBilt, Alvaro Herrasti, Luca Weihs, Jordi Salvador, Kiana Ehsani, Winson Han, Eric Kolve, Ali Farhadi, Aniruddha Kembhavi, Roozbeh M…

【TI毫米波雷达】上电时序、串口回环BUG及SOP模式不正常工作的解决方案(LP87524电源PMIC芯片的BUCK供电时序配置)

【TI毫米波雷达】雷达上电时序及SOP模式不正常工作的解决方案&#xff08;LP87524电源PMIC芯片的BUCK供电时序配置&#xff09; 文章目录 上电时序上电以后的雷达串口回环问题延迟上电时序LP87524电源PMIC芯片的BUCK供电时序LP87524电源PMIC芯片的BUCK默认供电输出附录&#x…

早期的OCR是怎么识别图片上的文字的?

现在的OCR技术融合了人工智能技术&#xff0c;通过深度学习&#xff0c;无论是识别的准确率还是效果都非常不错&#xff0c;那您知道在早期的OCR是通过什么技术来实现的吗&#xff1f;如果您不知道&#xff0c;那么&#xff0c;就让我来告诉您&#xff1a;它主要是基于字符的几…

LibreNMS:从docker出发

引言 LibreNMS 是一个免费开源的网络监控和自动化工具&#xff0c;用于监视网络设备、服务器和应用程序的性能和状态。它提供了一个集中的管理平台&#xff0c;帮助管理员实时监控和管理整个网络基础设施。 以下是 LibreNMS 的一些主要特点和功能&#xff1a; 自动发现&#…