CoreDNS 企业 DNS 转发与故障定位

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。
本文缩写(英文全称与中文含义)
缩写 英文全称/名称 中文含义
API Application Programming Interface 应用程序编程接口
CNI Container Network Interface 容器网络接口
CPU Central Processing Unit 中央处理器
DNS Domain Name System 域名系统
EKS Elastic Kubernetes Service AWS 托管 Kubernetes 服务
FQDN Fully Qualified Domain Name 完全限定域名
GKE Google Kubernetes Engine Google 托管 Kubernetes 服务
IP Internet Protocol 网际协议;IP 地址是网络寻址标识
IPVS IP Virtual Server Linux IP 虚拟服务器负载均衡机制
NXDOMAIN Non-Existent Domain DNS 响应:域名不存在
PDB Pod Disruption Budget Pod 中断预算,约束自愿驱逐
QPS Queries Per Second 每秒查询数
SLO Service Level Objective 服务等级目标
TCP Transmission Control Protocol 传输控制协议
TTL Time To Live 存活时间;具体指缓存有效期或记录过期时间
UDP User Datagram Protocol 用户数据报协议

场景:订单服务解析 Kubernetes Service、企业私域和外部云服务,DNS 可用性不依赖单节点。前置:基线、企业 DNS IP/转发权限、TCP/UDP 53 路由。CoreDNS 负责集群解析;ExternalDNS负责更新权威记录,两者不同。

先确认管理者#

kubectl -n kube-system get deployment,daemonset,configmap,service | rg 'dns'
kubectl -n kube-system get configmap coredns -o yaml
kubectl -n kube-system get pods -l k8s-app=kube-dns -o wide

EKS 用 add-on configuration 的 schema 管理 Corefile/副本/PDB,避免 Helm/手工更改被覆盖;GKE 可能用 kube-dns/Cloud DNS/NodeLocal DNS,按实际模式配置,不能硬套 coredns Deployment 名。

Hands-on:自管 CoreDNS 私域转发#

下面仅针对自管 CoreDNS。先把完整 ConfigMap 和 Deployment 存到平台 Git,保留 cluster.local 的 kubernetes、health/ready、loop、reload 等插件。只追加企业域 server block,不覆盖整份 Corefile:

corp.example.com:53 {
    errors
    cache 30
    forward . 10.20.0.10 10.20.1.10 {
        policy random
        max_concurrent 1000
    }
}

替换企业 resolver IP 并确认它们不把该域再转回集群,防止循环。max_concurrent 与 cache 值按 QPS×延迟和企业 TTL 调整;DNS TTL/负缓存影响故障恢复时间。forward 插件

保存合并后的 coredns-configmap.yaml,先在同版本预生产 CoreDNS 验证语法/转发,再应用;注意 DNS 查询日志可能包含敏感域名,不长期全量记录。

kubectl apply --dry-run=server -f coredns-configmap.yaml
kubectl apply -f coredns-configmap.yaml
kubectl -n kube-system logs deployment/coredns --since=5m
kubectl -n kube-system rollout status deployment/coredns --timeout=5m

配置 reload 不一定触发 Deployment rollout,日志无解析错误和真实查询成功才是验收。自管配置至少两副本跨节点,按负载扩容,PDB 保留一个可用实例;与 DNS autoscaler 的副本管理职责分开。

从真实业务网络验证#

使用组织批准、固定 digest 的诊断镜像,在 与 orders-api 相同 NetworkPolicy 条件下创建临时诊断 Job,运行以下命令;distroless 业务镜像无需为排障添加工具:

cat /etc/resolv.conf
dig orders-api.orders.svc.cluster.local
dig db.corp.example.com
dig +tcp db.corp.example.com
dig example.com

比较 Service FQDN、企业域、公网域、UDP/TCP 的结果和延迟;同时从真实 API 发起数据库连接/外部调用。查询短名产生的 search/ndots 放大需压测评估,不能统一把所有 Pod 的 ndots 改成 1。

企业故障演练#

现象 检查顺序
所有域失败 Pod resolv.conf → DNS Service/EndpointSlice → CNI/NetworkPolicy → DNS Pod
仅私域失败 条件转发配置、resolver 路由/防火墙、权威记录、转发循环
间歇超时 CPU throttling、并发上限、conntrack、丢包、上游延迟、TCP 回退
新记录仍 NXDOMAIN 缓存/负缓存 TTL、权威是否更新、客户端缓存

只在预生产阻断其中一个上游 resolver,验证另一台接管、告警触发、业务 SLO;恢复后确认延迟回落。排空一个 DNS 所在节点验证仍可解析。监控 DNS QPS、rcode、p95/p99、forward health、Pod CPU/内存和失败率。

误配恢复 Git 中完整旧 ConfigMap,必要时滚动重建 DNS Pod,不能同时重启全部副本。部署 NodeLocal DNS 要单独验证本地 IP、NetworkPolicy、iptables/IPVS 和缓存行为;EKS/GKE 按托管升级流程保留自定义配置。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭