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 场景下的典型插件链:

CoreDNS 核心插件链架构 CoreDNS 核心插件链(Kubernetes 场景) DNS 查询 errors health ready prometheus kubernetes cache forward loop reload 说明: 查询按从左到右、从上到下的顺序经过插件链。errors/health/ready/prometheus 为管理类插件;kubernetes/cache/forward 为核心业务插件。 loop 插件检测转发环路,reload 支持热更新 Corefile。每个插件均可产生延迟和错误指标。

典型 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])
  )
)