2. CoreDNS 基础回顾:在 Kubernetes 中的角色、核心插件链与性能指标
在深入 eBPF 节点池 SLO 错误预算面板化之前,必须重新校准对 CoreDNS 的认知基线。CoreDNS 是 Kubernetes 集群的默认 DNS 解析引擎,其稳定性直接决定 Pod 间服务发现、集群入口流量调度以及节点池健康状态。本章从三个维度展开:角色定位、插件链架构、关键性能指标。
2.1 CoreDNS 在 Kubernetes 中的角色
CoreDNS 以 Deployment 形式运行在 kube-system 命名空间,通常由 2 个或更多副本构成高可用组。其核心职责包括:
- 服务发现:将 Service 名称(如
my-svc.my-ns.svc.cluster.local)解析为 Cluster IP 或 Pod IP。 - Pod 解析:支持
hostname.subdomain.namespace.svc.cluster.local格式的 Pod DNS 记录。 - 外部 DNS 转发:对集群外域名(如
api.example.com)向上游 DNS 服务器递归查询。 - 缓存与负缓存:减少上游查询压力,提升响应速度。
- 健康检查与就绪探针:通过
/health和/ready端点暴露自身状态。
SRE 视角:CoreDNS 是集群网络的“单点依赖”——虽然本身高可用,但任何性能劣化都会引发级联故障。节点池级别的 SLO 错误预算必须将 CoreDNS 延迟和错误率作为核心输入。
2.2 核心插件链架构
CoreDNS 采用插件链(Plugin Chain)机制处理每个 DNS 查询。查询按 Corefile 中定义的顺序依次经过各插件,直到返回响应或触发错误。下图展示了 Kubernetes 场景下的典型插件链:
典型 Corefile 配置片段如下:
.:53 {
errors
health {
lameduck 5s
}
ready
prometheus :9153
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
cache 30
forward . /etc/resolv.conf {
max_concurrent 1000
}
loop
reload
}
插件链关键点:
- errors:捕获并记录所有 DNS 错误,是 SLO 错误预算的原始数据源。
- prometheus:暴露
/metrics端点,输出请求量、延迟、缓存命中率等指标。 - kubernetes:负责集群内部域名解析,其性能直接影响 Pod 启动速度和 Service 发现。
- cache:减少重复查询,但过期缓存可能导致陈旧记录——需平衡 TTL 与一致性。
- forward:外部 DNS 转发的瓶颈点,超时和并发限制是常见故障源。
2.3 关键性能指标
为构建节点池 SLO 错误预算,必须从 CoreDNS 的 Prometheus 指标中提取以下核心维度:
| 指标名称 | 类型 | 标签 | SLO 相关含义 |
|---|---|---|---|
coredns_dns_requests_total |
Counter | zone, family, proto, server, type | 总请求量,用于计算错误率分母 |
coredns_dns_responses_total |
Counter | zone, rcode, server | 按响应码(NOERROR, NXDOMAIN, SERVFAIL 等)统计,SERVFAIL 计入错误预算 |
coredns_dns_request_duration_seconds |
Histogram | zone, type, server | 请求延迟分布,用于计算延迟 SLO(如 p99 < 100ms) |
coredns_forward_requests_total |
Counter | to, rcode | 上游转发请求量,上游超时直接导致 SERVFAIL |
coredns_cache_hits_total |
Counter | server, type | 缓存命中次数,低命中率意味着更多上游压力 |
coredns_cache_misses_total |
Counter | server, type | 缓存未命中次数,与命中率共同反映缓存效率 |
coredns_health_request_failures_total |
Counter | — | 健康检查失败次数,预示 Pod 可能不健康 |
常见陷阱:
NXDOMAIN(域名不存在)通常不计入错误预算,但大量 NXDOMAIN 可能表明客户端配置错误或缓存污染。SRE 应区分“服务端错误”(SERVFAIL, REFUSED)与“客户端错误”(NXDOMAIN, FORMERR),避免错误预算被误消耗。
2.4 节点池维度的指标聚合
在 eBPF 节点池场景中,CoreDNS 指标需要按 节点池标签(如 node_pool=spot、node_pool=ondemand)进行聚合。典型 PromQL 查询示例:
# 按节点池聚合的错误率(SERVFAIL / 总请求)
sum by (node_pool) (
rate(coredns_dns_responses_total{rcode="SERVFAIL"}[5m])
)
/
sum by (node_pool) (
rate(coredns_dns_requests_total[5m])
)
# 按节点池聚合的 p99 延迟
histogram_quantile(0.99,
sum by (le, node_pool) (
rate(coredns_dns_request_duration_seconds_bucket[5m])
)
)