kubernetes - Minikube 的 CoreDNS 无法从 JVM 解析名称
问题描述
我们的 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 () 附带的旧 NS 提供程序,sun.net.spi.nameservice.provider.1=dns,sun
有关详细信息,请参阅我的答案。
解决方案
我找到了两种可能的解决方案:
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
provider 使用系统的 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
推荐阅读
- ios - React Native 安装 Cocoapods 依赖项错误
- postgresql - PostgreSQL 版本兼容 Windows 7 32 位
- c - 在setjmp之前用局部变量的地址调用空函数,有什么用?
- c# - 如何验证/清理一个 int 以便 Checkmarx 注意到我验证/清理了它
- javascript - Javascript验证字符串正则表达式
- sql - API 仅从数据库调用返回一个结果
- r - 如何在数据框中的每一行中提取唯一值?
- video - 无法使用 FFmpeg 将 MP4 重新混合到 MP4 中(在流 #1 中找不到编解码器的标签)
- javascript - 我如何在不取消所有内容的情况下更新我的嵌套对象?
- matlab - 分段线性逼近