我有一个kubernetes集群,其中一个服务(java应用程序)连接到另一个服务来写入数据(elasticsearch)。
当重新启动/重新部署elasticsearch(service& replicationcontroller)时,java-application会丢失它的连接,只能通过重新启动java-application(rc)来恢复它。这不是理想的行为,应该解决。
使用应用程序的kubernetes pod中的curl来查询elasticsearch在重启后确实可以正常工作,所以它一定是java正在做的事情。
当只触摸elasticsearch的replicationcontroller时,它会工作,保持服务不变。但是为什么卷曲在这种情况下起作用,但这不应该是解决方案。
在没有kubernetes的本地docker设置中使用相同的配置也不会导致问题。
无效的解决方案:
networkaddress.cache.ttl
或networkaddress.cache.negative.ttl
设置为零(或其他小的正值)/etc/nsswitch.conf
我正在使用kubernetes 1.1.3,OpenJDK 8u66,服务Dockerfile派生自java:8
答案 0 :(得分:0)
一种解决方案不是重新启动您的服务:服务通过IP解析Pod并通过选择器监视Pods,因此您在重新启动Pod时无需重新启动服务。
现在可能发生的事情是您的应用程序在启动时解析服务,然后缓存IP。当您重新启动服务时,它可能会获得一个新IP,这会破坏您的应用程序的行为。当pod /服务发生变化时,您需要检查如何重置此缓存或启动该应用程序的某种重启。
如果您不重启服务,IP将不会更改,但它仍会代理重启的Pod。
答案 1 :(得分:0)
尝试java.security.Security.setProperty("networkaddress.cache.ttl" , "60");
这意味着六十秒,你应该适应你的需要。