我们的JVM服务(基于Java SE 8 / Scala / Finagle)在解析DNS名称时遇到问题。我检查了coredns
名称空间中的kube-system
部署日志,发现java.net.InetAddress.getAllByName()
正在查询ANY
记录类型。
如果我通过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(sun.net.spi.nameservice.provider.1=dns,sun
)附带的旧NS提供程序,有关详细信息,请参见我的答案。
答案 0 :(得分:1)
我找到了两种可能的解决方案:
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实现。
要使用default
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