CoreDNS 可观测最佳实践
本文介绍如何通过观测云采集 CoreDNS 的性能指标,识别潜在的性能瓶颈和优化机会,确保 DNS 查询的快速响应。
CoreDNS 介绍
CoreDNS 是一个灵活、高性能且可扩展的 DNS 服务器,设计用于云原生环境。它最初是作为 Kubernetes 的默认 DNS 解决方案开发的,但它同样适用于传统 DNS 服务以及其他服务发现需求。
- DNS 服务: 提供域名解析服务,包括正向解析(从域名到 IP 地址)和反向解析(从 IP 地址到域名)。
- 服务发现: 在云原生环境中,CoreDNS 通过与 Kubernetes 集成实现服务发现。
- 插件式架构: CoreDNS 的功能通过插件扩展,能够处理不同的 DNS 请求类型以及其他扩展功能,如负载均衡、缓存、重定向等。
- 监控的必要性:CoreDNS 是 Kubernetes 集群中关键的 DNS 服务,负责解析集群内的服务名称。如果 CoreDNS 出现故障,集群内的服务将无法通过 DNS 名称进行通信,导致服务中断。
本文基于 coredns v1.8.6。
观测云
观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。
部署 DataKit
DataKit 是一个开源的、跨平台的数据收集和监控工具,由观测云开发并维护。它旨在帮助用户收集、处理和分析各种数据源,如日志、指标和事件,以便进行有效的监控和故障排查。DataKit 支持多种数据输入和输出格式,可以轻松集成到现有的监控系统中。
登录观测云控制台,在「集成」 - 「DataKit」选择对应安装方式。这里使用 kubernates 方式安装。
下载 datakit.yaml

替换 token

使用 kubectl 命令安装
kubectl create namespace datakit
kubectl apply -f datakit.yaml
开启采集器
由于 coredns 自带 metrics 接口,端口 9153,故指标采集方式同 Prometheus 指标采集,具体方式有如下两种:
1、使用 KubernetesPrometheus 自动发现
- 前置条件:使用 DaemonSet 方式部署 DataKit,且 DataKit > 1.34.0
- DataKit 配置:默认 K8S 安装会自动开启 kubernetesprometheus 采集

进入 DataKit 安装目录下的 conf.d/kubernetesprometheus,修改kubernetesprometheus.conf,添加如下内容:
[[inputs.kubernetesprometheus.instances]]
role = "pod"
namespaces = ["kube-system"]
selector = "k8s-app=kube-dns"
port = "__kubernetes_pod_container_coredns_port_metrics_number"
[inputs.kubernetesprometheus.instances.custom]
[inputs.kubernetesprometheus.instances.custom.tags]
cluster = "demo"

如需手动配置或更多自定义配置参考 Kubernetes Prometheus Discovery。
2、使用 DataKit 采集 coredns 的 metric 接口
- 前置条件:使用 Deployment 方式或主机部署 DataKit
- DataKit 配置:进入 DataKit 安装目录下的
conf.d/coredns目录,复制coredns.conf.sample并命名为coredns.conf。示例如下:
[[inputs.prom]]
url = "http://kube-dns.kube-system:9153/metrics"
source = "coredns"
metric_types = ["counter", "gauge"]
## filter metrics by names
metric_name_filter = ["^coredns_(acl|cache|dnssec|forward|grpc|hosts|template|dns)_([a-z_]+)$"]
# measurement_prefix = ""
measurement_name = "coredns"
interval = "10s"
# tags_ignore = [""]
## TLS config
tls_open = false
# tls_ca = "/tmp/ca.crt"
# tls_cert = "/tmp/peer.crt"
# tls_key = "/tmp/peer.key"
[inputs.prom.tags]
cluster = "demo"
其中 url 需修改为实际的 coredns 暴露出的 service 名或 ingress 地址。
配置好后,重启 DataKit 即可。
关键指标
以下指标为 Prometheus 指标:
基础运行状态
coredns_dns_request_total
- 用途: 监控 CoreDNS 的流量负载,判断是否有异常高峰。
- 关注点: 请求量是否突然激增或下降。
coredns_dns_response_rcode_count_total
- 用途: 检查 DNS 响应的状态。
- 关注点: 是否有大量 NXDOMAIN、SERVFAIL 等异常响应。
coredns_dns_request_duration_seconds
- 用途: 检查请求的响应时间。
- 关注点: 响应时间是否过高,是否存在长尾延迟。
缓存性能
coredns_cache_hits_total 与 coredns_cache_misses_total
- 用途: 评估缓存性能。
- 关注点: 缓存命中率是否下降,缓存未命中次数是否异常增多。
上游转发
coredns_forward_request_duration_seconds
- 用途: 监控上游服务器的响应性能。
- 关注点: 上游请求是否延迟增加。
coredns_forward_request_count_total
- 用途: 检查转发请求的频率。
- 关注点: 是否有大量转发请求,可能表明本地缓存未命中。
场景视图
登录观测云控制台,点击「场景」 -「新建仪表板」搜索 Core DNS 监控视图,点击“确定”,即可完成 coreDNS 仪表板的快速创建。
注意:由于 coredns 版本不同,可能会导致部分指标不存在,本仪表板基于 coredns:v1.8.6。

监控器(告警)
上游响应延迟异常 - 阈值检测
用以监控上游系统响应情况,防止当上游系统异常时对集群产生影响。监控 forward_request_duration_bucket 指标,单位 ns。

缓存命中率异常 - 突变告警
用于检测突发的缓存未命中的场景。大量的缓存未命中会导致对上游 DNS 产生较大压力以及内部服务无法访问的情况。

大量响应错误 - 突变告警
检查 DNS 响应的状态。是否有大量 NXDOMAIN、SERVFAIL 等异常响应。监控服务配置错误或上游解析失败。

总结
CoreDNS 是 Kubernetes 集群中关键的 DNS 服务,负责解析集群内的服务名称。如果 CoreDNS 出现故障,集群内的服务将无法通过 DNS 名称进行通信,导致服务中断。监控 CoreDNS 的性能指标(如查询延迟、QPS、缓存命中率等)可以帮助识别潜在的性能瓶颈和优化机会,确保 DNS 查询的快速响应。
Contact us
Join the community
to join the community
Try Guance
Start online and pay only for what you use.
Get startedChoose a Guance plan