Kubernetes同集群API通过HTTPS域名调用gRPC报name or service not known
Kubernetes集群内跨服务调用域名解析故障修复方案
问题场景:Kubernetes集群中同时部署API服务与gRPC服务,gRPC配置了公网子域名,本地通过HTTPS、公网IP均可正常访问gRPC,但同集群内的API服务调用gRPC时抛出
name or service not known错误。
该故障属于典型的集群内部DNS解析异常,公网能访问是因为请求走了Ingress暴露的公网链路,集群内请求默认走CoreDNS做内部解析,不会默认同步公网域名解析规则。
故障排查与修复步骤
- 优先改用集群内部服务域名调用
同集群内服务调用不需要走公网,直接使用K8s默认的内部服务域名即可,格式为{gRPC服务名}.{服务所在命名空间}.svc.cluster.local:{服务端口},例如gRPC服务在default命名空间,Service名为grpc-svc,监听端口为9000,调用地址填grpc-svc.default.svc.cluster.local:9000即可。
- 优先改用集群内部服务域名调用
- 确需使用公网子域名调用的修复方案
如果业务逻辑必须使用配置的公网子域名调用,可通过两种方式修复:
- 给gRPC服务的Ingress资源添加注解
external-dns.alpha.kubernetes.io/internal-hostname: {你的gRPC公网子域名},让内部DNS同步该域名的解析记录 - 修改CoreDNS配置,添加公网子域名的重写规则,指向内部Service的ClusterIP
- 确需使用公网子域名调用的修复方案
- 排查Pod DNS配置异常
如果修改调用地址后仍报错,进入API服务的Pod执行nslookup {目标调用地址}命令验证解析是否正常:
- 若解析失败,检查API服务Pod的
dnsPolicy配置,默认值应为ClusterFirst,不要误配置为Default或None - 执行
kubectl get pods -n kube-system -l k8s-app=kube-dns检查CoreDNS服务运行状态,确保所有CoreDNS Pod处于Running状态
- 排查Pod DNS配置异常
- 排查gRPC Service配置错误
执行kubectl get svc -n {gRPC服务所在命名空间}确认gRPC对应的Service资源存在,且spec.ports配置的端口与gRPC进程监听端口一致,spec.selector标签能正确匹配到gRPC的Pod实例。
- 排查gRPC Service配置错误
最优实践
同集群内微服务调用优先走内部Service域名,不需要经过公网Ingress转发,网络延迟更低、安全性更高,也不会出现公网域名在集群内解析失败的问题。
内容的提问来源于stack exchange,提问作者MM-Dev
相关产品推荐
相关产品推荐

