Minikube的CoreDNS无法从JVM解析名称

时间:2020-08-14 12:44:45

标签: kubernetes dns jvm minikube coredns

我们的JVM服务(基于Java SE 8 / Scala / Finagle)在解析DNS名称时遇到问题。我检查了coredns名称空间中的kube-system部署日志,发现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 个答案:

答案 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提供程序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