首页 > 解决方案 > Minikube 的 CoreDNS 无法从 JVM 解析名称

问题描述

我们的 JVM 服务(基于 Java SE 8/Scala/Finagle)在解析 DNS 名称时存在问题。我检查了命名空间coredns中的部署日志,kube-system发现java.net.InetAddress.getAllByName()正在查询ANY记录类型。

如果我通过检查名称解析,nslookup我可以确认ANY记录类型不可解析,但AAAAA记录是:

# kubectl exec -i -t dnsutils -- nslookup -type=a weather.mab.matjazmav.test
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   dev-proxy.default.svc.cluster.local
Address: 10.100.187.185

# kubectl exec -i -t dnsutils -- nslookup -type=any weather.mab.matjazmav.test
Server:         10.96.0.10
Address:        10.96.0.10#53

*** Can't find weather.mab.matjazmav.test: No answer

我的问题是,如何让 Minikube 的 CoreDNS 响应ANY查询,或者如何强制java.net.InetAddress发送AAAAA查询?

编辑: 事实证明,我们使用了 Java SE 8 () 附带的旧 NS 提供程序,sun.net.spi.nameservice.provider.1=dns,sun有关详细信息,请参阅我的答案。

标签: kubernetesdnsjvmminikubecoredns

解决方案


我找到了两种可能的解决方案:

1.使用CoreDNS重写插件

将查询类型从 重写ANYA。这是文档的链接:https ://coredns.io/plugins/rewrite/

2.在JVM中使用默认的NS提供者

这仅适用于在 Jave SE 8 或更早版本上运行的情况。Java SE 9 删除了这个系统属性,在这里阅读更多:https ://www.oracle.com/java/technologies/javase/9​​-removed-features.html#JDK-8134577

Java SE 8 附带两个 NS 提供程序defaultdns,sun. defaultprovider 使用系统的 NS 提供者,同时dns,sun使用一些旧的 NS 实现。

要使用defaultNS 提供程序,只需设置以下属性:

sun.net.spi.nameservice.provider.1=default

在此处阅读更多信息:https ://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html

这也是一本不错的读物:https ://medium.com/@maheshsenni/host-name-resolution-in-java-80301fea465a


推荐阅读