一次 DNS 解析超时引发的线上告警
内容提要
周五下午,某核心服务的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来避免解析延迟。