A K8S CoreDNS Problem
记录一下之前遇到的一个 CoreDNS 问题。
问题
服务在运行过程中,偶尔出现超时的情况,影响到服务的稳定性。
通过服务日志可以看到解析域名超时了,而这个解析是由 CoreDNS 处理的。
排查
- 通过 CoreDNS 监控,我们并没有看到 serverfail 的请求,与此同时 CoreDNS 也没有资源压力,CPU、Mem 的使用情况也很稳定,也就是 CoreDNS 的处理没有问题
- 查看 CoreDNS 的日志,也没有看到相应的错误日志。而我们从服务日志中得到的信息是 i/o timeout,现在不是处理超时或者处理失败导致超时,那么就有可能是网络超时了
- 通过 Gemini 配合排查得知,在节点数量增加或者 Pod 数量较多的情况下,由于 DNS 请求使用 UDP 的协议,初步判断是流量在节点转发 UDP 请求的过程中,有的请求被丢弃了。而我们 K8S 节点是动态弹性伸缩的,出现问题的时间点确实也是在节点数量高峰期时最容易出现。
- 通过 K8S 官方文档,我们也发现,官方提供一个 CoreDNS 的优化方案,那就是通过 NodeLocalDNS 来做一层缓存,在所有节点上跑一个 NodeLocalDNS,缓存 DNS 解析记录,直接返回解析结果,避免所有的 DNS 请求都走到 CoreDNS 去处理
处理
既然知道了问题所在,那就是部署 NodeLocalDNS 了,通过指引部署即可,部署之后可以 Grafana 观察解析指标,以及观察服务访问日志,发现再也没有出现解析超时的问题。