3. CoreDNS 部署与配置:Helm 部署、ConfigMap 详解、Corefile 语法、日志与监控配置

CoreDNS 作为 Kubernetes 集群的默认 DNS 组件,其部署质量直接影响服务发现、网络连通性与集群稳定性。本章围绕生产级 CoreDNS 治理展开,涵盖 Helm 声明式部署、ConfigMap 配置管理、Corefile 语法解析以及日志与监控体系搭建,帮助运维人员构建可观测、可审计、可回滚的 DNS 基础设施。

3.1 Helm 部署 CoreDNS:声明式与版本化管理

Helm 是 Kubernetes 生态中最主流的包管理工具,使用 Helm Chart 部署 CoreDNS 可以实现版本锁定、参数化配置与一键回滚。以下为生产环境推荐部署流程:

  1. 添加 Helm 仓库:helm repo add coredns https://coredns.github.io/helm
  2. 创建自定义 values 文件:覆盖默认参数,如副本数、资源限制、插件列表
  3. 执行部署:helm install coredns coredns/coredns -n kube-system -f values.yaml
  4. 验证 Pod 状态:kubectl get pods -n kube-system -l app.kubernetes.io/name=coredns
关键参数对比表:生产环境与测试环境 values 差异
参数路径 测试环境 生产环境 说明
replicaCount 1 3~5 高可用冗余
resources.requests.cpu 100m 500m 避免突发流量 OOM
resources.limits.memory 128Mi 512Mi 防止内存泄漏影响节点
livenessProbe.initialDelaySeconds 10 30 生产环境启动更慢
service.clusterIP 自动分配 固定 IP 避免 IP 变更导致缓存失效
运维建议:生产环境务必使用 helm list --all-namespaces 定期审计已部署版本,配合 helm history coredns -n kube-system 查看变更记录,实现配置漂移可追溯。

3.2 ConfigMap 详解:CoreDNS 配置的声明式管理

CoreDNS 的所有运行时行为由 ConfigMap 定义,该资源挂载到 Pod 内的 /etc/coredns/Corefile。任何对 Corefile 的修改都会触发 CoreDNS 自动热加载(无需重启 Pod),但生产环境建议通过 kubectl rollout restart 确保所有副本同步。

以下是一个生产级 ConfigMap 示例:

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health {
            lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
            pods insecure
            fallthrough in-addr.arpa ip6.arpa
            ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
            max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }
配置漂移风险:当多个运维人员通过 kubectl edit configmap coredns -n kube-system 直接修改时,极易出现配置不一致。建议将 ConfigMap 纳入 GitOps 流程,通过 ArgoCD 或 Flux 实现声明式同步。

3.3 Corefile 语法深度解析

Corefile 是 CoreDNS 的核心配置文件,采用类似 Caddyfile 的块级语法。每个 Server Block 定义一组监听地址和插件链。以下为语法结构图:

Corefile 语法结构解析 Server Block:.:53 { ... } 监听所有网络接口的 53 端口,处理所有域名请求 插件链(从左到右顺序执行) errors health kubernetes forward cache • errors:记录 DNS 错误日志 • health:暴露 /health 端点,支持优雅关闭 • kubernetes:从 K8s API 解析 Service/Pod DNS • forward:将外部域名转发到上游 DNS

Corefile 支持以下高级语法特性:

  • 环境变量替换:{$CLUSTER_DOMAIN} 可在启动时动态注入
  • 导入外部文件:import /etc/coredns/custom/*.conf 实现配置拆分
  • 条件判断:通过 acl 插件实现基于 IP 的访问控制
  • 多 Server Block:可同时监听不同端口处理不同域名空间

3.4 日志与监控配置

CoreDNS 的日志与监控是故障排查和容量规划的基础。生产环境必须同时启用结构化日志和 Prometheus 指标暴露。

3.4.1 日志配置

通过 errors 插件记录错误日志,结合 log 插件输出所有 DNS 请求日志。建议使用 JSON 格式输出以便日志系统(如 ELK、Loki)解析:

log . {
    class all
    output file /var/log/coredns/query.log
    format json
}
日志轮转:CoreDNS 本身不提供日志轮转能力,生产环境建议将日志输出到 stdout,由容器运行时(如 Docker 的 json-file 驱动)或 sidecar(如 fluent-bit)统一管理轮转与采集。

3.4.2 监控指标与告警

启用 prometheus 插件后,CoreDNS 会在 :9153 端口暴露 Prometheus 指标。以下为关键监控指标及推荐告警规则:

指标名称 类型 含义 推荐告警阈值
coredns_dns_requests_total Counter 总请求数 无(用于容量规划)
coredns_dns_responses_total Counter 总响应数 无(用于对比请求丢失率)
coredns_dns_request_duration_seconds Histogram 请求延迟分布 P99 > 1s 触发告警
coredns_health_request_failures_total Counter 健康检查失败次数 > 5 次/5min 触发告警
coredns_cache_hits_total Counter 缓存命中次数 命中率 < 80% 触发告警
coredns_forward_requests_total Counter 上游转发请求数 无(用于上游依赖分析)

以下为 CoreDNS 监控架构示意图:

CoreDNS 监控与告警架构 CoreDNS Pod :9153/metrics Prometheus scrape 间隔 15s Grafana 仪表盘可视化 Alertmanager 告警路由与抑制 告警示例:coredns_dns_request_duration_seconds{quantile="0.99"} > 1 持续 5 分钟 → 触发 P1 告警

3.5 配置漂移审计实战

配置漂移是 CoreDNS 运维中最隐蔽的风险。以下为推荐的审计策略:

  • 基线比对:使用 kubectl diff -f coredns-config.yaml 对比当前集群配置与 Git 仓库中的期望配置
  • 变更记录:通过 kubectl describe configmap coredns -n kube-system 查看 annotations 中的最后变更时间与变更人
  • 自动化修复:结合 kubectl apply --server-side 和 GitOps 工具,当检测到漂移时自动回滚到基线版本
常见漂移场景:手动修改 ConfigMap 后未同步到所有副本;不同节点上的 CoreDNS Pod 因启动顺序不同加载了不同版本的 Corefile;Helm 升级时 values 文件未正确合并导致插件丢失。