Kubernetes单集群中Service域名解析失败该如何调试排查
Kubernetes服务域名解析异常排查方案
该问题的核心特征是nslookup可返回DNS响应,但getaddrinfo调用(应用、wget、nc等工具依赖的系统调用)解析失败,可按以下步骤逐一排查:
1. 确认命名空间匹配
Kubernetes短服务域名仅在同命名空间下生效,若mongodb-service和测试Pod、mongo-express Pod不在同一个命名空间,需要使用完整域名访问:mongodb-service.<服务所在命名空间>.svc.cluster.local
你可以执行kubectl get svc -A确认mongodb-service所在命名空间,先在测试Pod内用完整域名尝试访问,验证是否为跨命名空间问题。
2. 检查容器内DNS配置
进入测试Pod执行cat /etc/resolv.conf,核对以下配置:
- nameserver地址是否为集群CoreDNS的ClusterIP,和nslookup返回的
10.96.0.10一致 - search字段是否包含
<当前Pod命名空间>.svc.cluster.local、svc.cluster.local等集群默认搜索域 - 确认
ndots参数值:K8s默认ndots为5,当访问的域名点数量小于ndots时,系统会先拼接搜索域解析,失败才会直接解析原域名。
3. 验证libc兼容性问题
如果你的测试镜像、mongo-express镜像基于Alpine制作,大概率是musl libc的DNS解析缺陷导致,musl对ndots>1的场景处理存在bug,多个搜索域解析失败后不会回退到原域名解析。可通过两个方式验证:
- 访问域名末尾加一个点,强制按绝对域名解析:
nc mongodb-service. 27017,如果访问正常即可确认是该问题 - 换用Debian/Ubuntu等基于glibc的基础镜像制作测试Pod,重新验证解析是否正常
4. 排查CoreDNS运行状态
执行kubectl get pods -n kube-system -l k8s-app=kube-dns确认所有CoreDNS Pod处于Running状态,再执行kubectl logs -n kube-system <CoreDNS Pod名称>查看日志,排查是否有解析请求相关报错。
5. 确认Service配置正确
执行kubectl describe svc mongodb-service,核对Endpoints字段是否正确绑定了mongodb Pod的IP,确认Service selector配置和mongodb Pod的label匹配。
内容的提问来源于stack exchange,提问作者Roberto
相关产品推荐
相关产品推荐

