3. CoreDNS 部署与配置:Helm 部署、ConfigMap 详解、Corefile 语法、日志与监控配置
CoreDNS 作为 Kubernetes 集群的默认 DNS 组件,其部署质量直接影响服务发现、网络连通性与集群稳定性。本章围绕生产级 CoreDNS 治理展开,涵盖 Helm 声明式部署、ConfigMap 配置管理、Corefile 语法解析以及日志与监控体系搭建,帮助运维人员构建可观测、可审计、可回滚的 DNS 基础设施。
3.1 Helm 部署 CoreDNS:声明式与版本化管理
Helm 是 Kubernetes 生态中最主流的包管理工具,使用 Helm Chart 部署 CoreDNS 可以实现版本锁定、参数化配置与一键回滚。以下为生产环境推荐部署流程:
- 添加 Helm 仓库:
helm repo add coredns https://coredns.github.io/helm - 创建自定义 values 文件:覆盖默认参数,如副本数、资源限制、插件列表
- 执行部署:
helm install coredns coredns/coredns -n kube-system -f values.yaml - 验证 Pod 状态:
kubectl get pods -n kube-system -l app.kubernetes.io/name=coredns
| 参数路径 | 测试环境 | 生产环境 | 说明 |
|---|---|---|---|
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 支持以下高级语法特性:
- 环境变量替换:
{$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
}
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 监控架构示意图:
3.5 配置漂移审计实战
配置漂移是 CoreDNS 运维中最隐蔽的风险。以下为推荐的审计策略:
- 基线比对:使用
kubectl diff -f coredns-config.yaml对比当前集群配置与 Git 仓库中的期望配置 - 变更记录:通过
kubectl describe configmap coredns -n kube-system查看annotations中的最后变更时间与变更人 - 自动化修复:结合
kubectl apply --server-side和 GitOps 工具,当检测到漂移时自动回滚到基线版本