我们的 JVM 服务(基于 Java SE 8/Scala/Finagle)在解析 DNS 名称时存在问题。我检查了 kube-system 命名空间中的 coredns 部署日志,发现 java.net.InetAddress.getAllByName() 正在查询 任何记录类型。
如果我通过 nslookup 检查名称解析,我可以确认 ANY 记录类型不可解析,但 A 或 AAAA 记录是:
# 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 发送 A 或 AAAA 查询?
编辑: 事实证明,我们使用了 Java SE 8 附带的旧 NS 提供程序 (sun.net.spi.nameservice.provider.1=dns,sun),请参阅我的答案了解详细信息。
请您参考如下方法:
我找到了两种可能的解决方案:
<强> 1。使用CoreDNS重写插件 强>
将查询类型从 ANY 重写为 A。以下是文档的链接: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 提供程序 default 和 dns,sun。 default 提供程序使用系统的 NS 提供程序,而 dns,sun 使用一些旧的 NS 实现。
要使用默认 NS 提供程序,只需设置以下属性:
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




