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