当前位置:首页 > 技术 > 正文内容

CoreDNS故障排查与优化实战:从超时到高可用的蜕变

访客 技术 2026年5月13日 15:17 2

一次Kubernetes DNS故障的深度复盘

故障初现:支付服务超时之谜

凌晨11:42分收到告警,支付服务不可达。通过kubectl检查发现所有Pod和Service均处于正常状态:


kubectl get pods -n production | grep payment
payment-svc-8d4f6b7c-x2k9m   1/1     Running   0          45d
order-processor-6c8d9f4-x7q2w 1/1     Running   0          45d

kubectl get svc -n production
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)
payment-service    ClusterIP   10.102.144.200   <none>        8080/TCP
order-processor    ClusterIP   10.102.145.88    <none>        8080/TCP

进一步测试发现IP直连正常但DNS解析失败:


kubectl exec -it payment-svc-8d4f6b7c-x2k9m -n production -- nslookup order-processor.production.svc.cluster.local
;; connection timed out; no servers could be reached

根因分析:五重致命问题

  1. ndots配置不当:默认值5导致DNS查询放大80%
  2. 缺乏节点级缓存:所有DNS请求都需要跨节点传输
  3. 资源限制过紧:CPU使用率达97m/100m导致goroutine饥饿
  4. 缓存策略低效:内存不足导致缓存频繁失效
  5. 副本数固定:无自动扩缩容机制

解决方案:六步优化策略

1. 调整ndots参数

将ndots从5调整为2,减少DNS查询次数:


spec:
  dnsPolicy: ClusterFirst
  dnsConfig:
    options:
      - name: ndots
        value: "2"

2. 部署NodeLocal DNSCache

在每个节点部署本地DNS缓存:


apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nodelocaldns
  namespace: kube-system
spec:
  template:
    spec:
      hostNetwork: true
      containers:
      - name: node-cache
        image: registry.k8s.io/dns/k8s-dns-node-cache:1.23.0
        args:
          - "-localip=169.254.20.10"
          - "-conf=/etc/Corefile/Corefile"
        ports:
          - containerPort: 53
            protocol: UDP
          - containerPort: 53
            protocol: TCP

3. 优化CoreDNS配置


apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        cache {
            success 99840 30
            denial 60
            prefetch 120 1200 4 25
        }
        forward . 8.8.8.8 8.8.4.4 {
            max_concurrent 1000
            prefer_tcp
        }
    }

4. 调整资源配额


resources:
  requests:
    cpu: "200m"
    memory: "150Mi"
  limits:
    cpu: "500m"
    memory: "250Mi"

5. 部署集群比例自动扩缩器


apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns-cpa-config
data:
  linear: |
    {"nodesPerReplica": 4, "preventSinglePointFailure": true}

6. 配置Pod中断预算


apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: coredns-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      k8s-app: kube-dns

验证与监控


# 验证解析速度
time nslookup google.com

# 查看资源使用
kubectl top pods -n kube-system -l k8s-app=kube-dns

# 检查缓存命中率
kubectl exec -n kube-system -l k8s-app=kube-dns -- curl -s localhost:9153/metrics | grep cache

最佳实践清单

  • ✓ 设置ndots: 2
  • ✓ 部署NodeLocal DNSCache
  • ✓ 优化CoreDNS配置
  • ✓ 合理配置资源限制
  • ✓ 部署集群比例自动扩缩器
  • ✓ 配置Pod中断预算
  • ✓ 实施监控告警
  • ✓ 定期验证DNS解析

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。