2016-01-22 3 views
0

У меня есть кластер kubernetes, где одна служба (приложение java) подключается к другой службе для записи данных (elasticsearch).Служба Kubernetes в java не разрешает перезапущенный сервисный/репликационный контроллер

Когда elasticsearch (служба & replicationcontroller) перезапускается/перераспределяется, java-приложение теряет свое соединение, которое может быть восстановлено только путем перезапуска java-приложения (rc). Это не желаемое поведение и должно быть разрешено.

Использование curl из kubernetes pod приложения для запроса elasticsearch отлично работает после перезагрузки, поэтому должно быть, вероятно, что-то, что делает java.

Он работает, когда затрагивается только репликационный контроллер для elasticsearch, оставляя сервис таким, какой он есть. Но почему скручивание работает в этом случае, однако это не должно быть решением.

Использование той же конфигурации в локальной настройке докеры без кубернетов также не приводит к проблемам.

перспективные решения, которые не работали:

  • Установка networkaddress.cache.ttl или networkaddress.cache.negative.ttl к нулю (или других малых положительных значений)
  • хакерство /etc/nsswitch.conf, как описано в https://stackoverflow.com/a/32550032/363281

Я использую kubernetes 1.1.3, OpenJDK 8u66, служебный файл докеров основан на java:8

+0

Это немного удар в темноте, но, возможно, попробуйте что-то вроде функции getSeeds() здесь https://github.com/kubernetes/kubernetes/blob/master/examples/cassandra/java/src/ io/k8s/cassandra/KubernetesSeedProvider.java в вашем приложении Java? – DavidO

ответ

0

Одним из решений является не перезапуск службы: служба разрешает Pods по IP-адресам и наблюдает за Pods с помощью селекторов, поэтому вам не нужно перезапускать Сервис при перезагрузке ваших Pods.

Теперь, вероятно, происходит то, что ваше приложение разрешает Службу при запуске, а затем кэширует IP-адрес. При перезапуске службы он, скорее всего, получает новый IP-адрес, который нарушает поведение вашего приложения. Вам нужно проверить, как вы можете сбросить этот кеш или инициировать перезагрузку этого приложения, когда изменения в pods/services.

Если вы не перезапустите службу, IP-адрес не изменится, но он все равно будет прокси-сервером для перезапущенных устройств.

+0

Кажется единственным действующим способом на данный момент – Dag

0

Попробуйте java.security.Security.setProperty("networkaddress.cache.ttl" , "60");

Это означает, что шестьдесят секунд, и вы должны адаптироваться к вашим потребностям.

Смежные вопросы