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 查询的快速响应。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。