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

如果我通过 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),请参阅我的答案了解详细信息。

请您参考如下方法:

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

<强> 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 提供程序 defaultdns,sundefault 提供程序使用系统的 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


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!