2016-01-22 66 views
0

我有一個kubernetes集羣,其中一個服務(java應用程序)連接到另一個服務來寫入數據(elasticsearch)。java中的Kubernetes服務不能解決重啓服務/複製控制器

當elasticsearch(服務& replicationcontroller)重新啓動/重新部署時,java應用程序失去了它的連接,只能通過重新啓動java應用程序(rc)來恢復它。這不是理想的行爲,應該解決。

從應用程序的kubernetes窗格使用curl查詢elasticsearch在重新啓動後可以正常工作,所以它肯定可能是java正在做的事情。

當只有elasticsearch的複製控制器被觸摸時,它才能工作,使服務保持原樣。但爲什麼curl在這種情況下工作,但這不應該是解決方案。

在沒有kubernetes的本地docker設置中使用相同的konfiguration也不會導致問題。

未曾希望的解決方案:

描述我使用kubernetes 1.1.3,OpenJDK 8u66,服務Dockerfile源自java:8

+0

這是一個黑暗中的刺,但也許嘗試像這裏的getSeeds()函數 https://github.com/kubernetes/kubernetes/blob/master/examples/cassandra/java/src/ io/k8s/cassandra/KubernetesSeedProvider.java 在您的Java應用程序中? – DavidO

回答

0

一種解決方案不是重新啓動服務:服務通過IP解析Pod並通過選擇器監視Pod,因此在重新啓動Pod時不需要重新啓動服務。

現在可能發生的情況是您的應用程序在啓動時解析服務,然後緩存IP。當你重新啓動服務時,它可能會得到一個新的IP,它會弄亂你的應用程序的行爲。您需要檢查如何重置此緩存或在Pod /服務發生更改時啓動該應用的某種重新啓動。

如果您未重新啓動服務,IP將不會更改,但它仍將代理到重新啓動的Pod。

+0

似乎是目前唯一有效的方法 – Dag

0

嘗試java.security.Security.setProperty("networkaddress.cache.ttl" , "60");

這意味着60秒,你應該適應您的需求。