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 记录类型不可解析,但 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 (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 提供程序 defaultdns,sundefault 提供者使用系统的 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