Ядрам Minikube не удается разрешить имена из JVM

#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