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

本文主要是介绍云原生之深入解析如何在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 架构或云环境中正常运行是关键。

这篇关于云原生之深入解析如何在K8S环境中使用Prometheus来监控CoreDNS指标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/509313

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV