一次 DNS 解析超时引发的线上告警

💡 原文中文,约4600字,阅读约需11分钟。
📝

内容提要

周五下午,某核心服务的P99延迟骤增至2秒,原因是DNS解析问题。Go语言的默认DNS解析器在特定环境下可能导致延迟,K8s的ndots值为5,导致外部域名解析失败。最终通过修改域名和配置DNS缓存解决了问题。

🎯

关键要点

  • 周五下午某核心服务的P99延迟骤增至2秒,原因是DNS解析问题。

  • Go语言有两套DNS解析器,分别是纯Go实现和通过cgo调用系统的getaddrinfo函数。

  • K8s的ndots值为5,导致外部域名解析失败,增加了DNS查询的次数。

  • CoreDNS在处理大量DNS请求时响应延迟增加,导致接口的P99延迟上升。

  • 可以通过在外部域名后加点、修改ndots值或使用DNS缓存来解决问题。

  • 最终采取的方案是外部域名加点和部署NodeLocal DNSCache,降低ndots值至2。

  • DNS解析的逻辑导致外部域名请求变慢,需注意配置环境的影响。

延伸问答

DNS解析问题是如何导致服务延迟的?

DNS解析问题导致服务延迟是因为K8s的ndots值设为5,使得外部域名被视为不完整,增加了DNS查询次数,最终导致P99延迟上升至2秒。

Go语言的DNS解析器有什么不同?

Go语言有两套DNS解析器:一套是纯Go实现,直接构造DNS查询包;另一套是通过cgo调用系统的getaddrinfo函数,依赖操作系统的DNS解析流程。

如何解决K8s中DNS解析导致的延迟问题?

可以通过在外部域名后加点、修改ndots值至2或使用NodeLocal DNSCache来解决K8s中DNS解析导致的延迟问题。

ndots值对DNS解析有什么影响?

ndots值决定了域名中点的个数,如果域名中的点少于ndots值,系统会尝试拼接搜索域,增加DNS查询次数,导致解析变慢。

CoreDNS在处理DNS请求时可能出现什么问题?

CoreDNS在处理大量DNS请求时可能响应延迟增加,导致外部域名解析变慢,从而影响服务的P99延迟。

在K8s中如何配置DNS以避免解析延迟?

在K8s中可以通过自定义Pod的dnsConfig,将ndots值设置为2,或者使用NodeLocal DNSCache来避免解析延迟。

🏷️

标签

➡️

继续阅读