Minikube 的 CoreDNS 无法从 JVM 解析名称
Minikube's CoreDNS fails to resolve names from JVM
我们的 JVM 服务(基于 Java SE 8/Scala/Finagle)在解析 DNS 名称时遇到问题。我检查了 kube-system
命名空间中的 coredns
部署日志,发现 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 提供程序,详情请参阅我的答案。
我找到了两个可能的解决方案:
1.使用 CoreDNS 重写插件
将查询类型从 ANY
重写为 A
。这是文档的 link: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
我们的 JVM 服务(基于 Java SE 8/Scala/Finagle)在解析 DNS 名称时遇到问题。我检查了 kube-system
命名空间中的 coredns
部署日志,发现 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 提供程序,详情请参阅我的答案。
我找到了两个可能的解决方案:
1.使用 CoreDNS 重写插件
将查询类型从 ANY
重写为 A
。这是文档的 link: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