java中的Kubernetes服务无法解析重新启动的服务/ replicationcontroller

时间:2016-01-22 15:07:56

标签: java dns docker kubernetes

我有一个kubernetes集群,其中一个服务(java应用程序)连接到另一个服务来写入数据(elasticsearch)。

当重新启动/重新部署elasticsearch(service& replicationcontroller)时,java-application会丢失它的连接,只能通过重新启动java-application(rc)来恢复它。这不是理想的行为,应该解决。

使用应用程序的kubernetes pod中的curl来查询elasticsearch在重启后确实可以正常工作,所以它一定是java正在做的事情。

当只触摸elasticsearch的replicationcontroller时,它会工作,保持服务不变。但是为什么卷曲在这种情况下起作用,但这不应该是解决方案。

在没有kubernetes的本地docker设置中使用相同的配置也不会导致问题。

无效的解决方案:

我正在使用kubernetes 1.1.3,OpenJDK 8u66,服务Dockerfile派生自java:8

2 个答案:

答案 0 :(得分:0)

一种解决方案不是重新启动您的服务:服务通过IP解析Pod并通过选择器监视Pods,因此您在重新启动Pod时无需重新启动服务。

现在可能发生的事情是您的应用程序在启动时解析服务,然后缓存IP。当您重新启动服务时,它可能会获得一个新IP,这会破坏您的应用程序的行为。当pod /服务发生变化时,您需要检查如何重置此缓存或启动该应用程序的某种重启。

如果您不重启服务,IP将不会更改,但它仍会代理重启的Pod。

答案 1 :(得分:0)

尝试java.security.Security.setProperty("networkaddress.cache.ttl" , "60");

这意味着六十秒,你应该适应你的需要。