Minikube的CoreDNS无法从JVM解析名称

问题描述

我们的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。使用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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...