高级分布式系统调试: 网络疑难杂症 - 追踪 DNS、丢包与 TLS
第一部分:“问题总出在 DNS” (It’s Always DNS)
这句在 SRE 和运维圈广为流传的“名言”,虽然略带调侃,但却道出了一个深刻的真相:DNS 是现代分布式系统的基石,它无处不在,但又常常被我们忽视,直到它出问题。
为什么 DNS 问题如此棘手?
- 多层缓存 (Multi-layer Caching): DNS 解析结果在多个层面都有缓存——浏览器、操作系统 (如
nscd
或systemd-resolved
)、应用运行时 (如 JVM)、集群内部 DNS 解析器 (如 CoreDNS)、上游递归 DNS 服务器、权威 DNS 服务器。任何一层的缓存配置错误或数据陈旧,都可能导致解析问题。 - UDP 的不可靠性: DNS 查询通常优先使用 UDP 协议,UDP 本身是无连接、不可靠的。在网络拥堵时,DNS 查询包可能会被丢弃,导致解析超时。
- 配置复杂性:
resolv.conf
文件中的search
域、ndots
选项等配置,可能会导致非预期的查询行为(例如,对一个外部域名www.google.com
,系统可能会先尝试查询www.google.com.my-namespace.svc.cluster.local
)。 - 动态环境: 在 Kubernetes 等环境中,Service 和 Pod 的 DNS 记录是动态生成的,这引入了新的复杂性。
诊断 DNS 问题的工具箱
当你的应用报告“无法解析主机名”或“连接超时”时,不要只满足于 ping
。你需要像侦探一样,层层深入。
-
dig
(Domain Information Groper): 这是你的首选工具,比nslookup
更强大、信息更丰富。- 基本查询:
dig my-service.my-namespace.svc.cluster.local
- 输出解读: 关注
ANSWER SECTION
(是否返
- 输出解读: 关注
- 基本查询: