#kubernetes #dns #jvm #minikube #coredns
#kubernetes #dns #jvm #minikube #ядра
Вопрос:
У наших служб 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 отвечать на ANY
запрос или как я могу принудительно java.net.InetAddress
отправить A
или AAAA
запрос?
РЕДАКТИРОВАТЬ: Оказалось, что мы использовали старый поставщик NS, который поставляется с Java SE 8 ( sun.net.spi.nameservice.provider.1=dns,sun
) подробности см. в моем ответе.
Комментарии:
1. Я тестировал в своем minikube и не могу устранить эту проблему, я тестировал с внешним dns и внутренним (сервисом). Какая у вас версия minikube? Где находится DNS, к которому вы пытаетесь подключиться?
Ответ №1:
Я нашел два возможных решения:
1. Используйте плагин CoreDNS для перезаписи
Перепишите типы запросов с ANY
на A
. Вот ссылка на документацию:https://coredns.io/plugins/rewrite /
2. Используйте NS-провайдер по умолчанию внутри JVM
Это применимо, только если вы работаете на 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 provider, просто установите следующее свойство:
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