在过去一段时间内,有一套相同的软件在不同的部署环境之间,断断续续有现场反馈出现 Pod 在用域名访问 Service 的时候无法解析域名。经过简单排查:
- 排除掉了使用姿势问题,即
pod.spec.dnsPolicy
是正确配置的; - 排除了运行时问题,即 Pod 里
/etc/resolv.conf
是符合预期的; - 排除了网络问题,即 Pod 来回到 CoreDNS 的 UDP/TCP 都是正常通信无丢包的;
那么,排除掉基础设施的问题,去怀疑的用户态应用层就很合理了。而且众所周知且 Musl 被广为诟病(虽然其实可能是 Glibc 实现不规范的问题)的是 Musl 在容器里一直多多少少存在些坑,这点在差不多 10 年前就已经领教了过了因为 musl 不认识 nsswitch.conf
导致 Go 程序出问题。
排查中得知,的确出问题的 Pod 都是使用的 Alpine,所以基本上可以确定是 Musl 的问题,但是还有一个关键问题没有搞清楚:
为什么有的环境是好的,有的环境就不行了。这究竟是命中了什么 Musl 的哪个场景导致了这个行为?
这不是巧了么,这个问题属于三不管:
- 系统团队:管我屁事,你又没用我们的发行版本;
- DNS 团队:我看 DNS 都是好的,你看宿主机上就返回的很快,是网络问题吧?是 K8s 问题吧?
- 业务团队:我测过都是好的,你说的我听不懂,阿巴阿巴。但是我换镜像、测试、发 hotfix 要 N 天,肯定都是 K8s 的问题。
- 现场运维:客户说了,不管你用啥方法,这周要找到原因修好。另外,你先告诉我一个绕过的方法。
屮,行吧。