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