微服务之间用域名互相调用,偶发整三秒的超时,抓包发现请求发出前一次 DNS 查询等了 2.9 秒,容器里用的是 CoreDNS。
一开始怀疑是「CoreDNS 上游偶发超时,递归链路不稳」,查了一圈,方向不对。
排查方向其实有限,先把可能性排一排。resolv.conf 配了多个 nameserver,第一个不通要等超时。少数情况下是ndots 设成五,短域名要先补全后缀再查。
另外,应用侧没有本地缓存,每次都走完整解析。
计时确认一次解析的耗时
time getent hosts order-svc.default.svc.cluster.local
随后看超时与 ndots 的配置
cat /etc/resolv.conf
调小 ndots 并缩短单次超时
kubectl edit configmap coredns -n kube-system
等前面都确认过,再开启应用侧 DNS 缓存后复测
dig +stats order-svc.default.svc.cluster.local @10.96.0.10
改之前先确认了最近有没有人动过配置,避免白查一遍。
改完先别撤,确认这几项。解析耗时稳定在 2ms 以内,整三秒的超时不再出现,抓包里 DNS 往返只剩一次。
这里还有个坑。三秒这种整数超时基本都是 DNS 或建连超时,先量解析再量建连;容器里 ndots 默认值对短域名很不友好。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
