我有一个由kubernetes集群管理的基于Java的服务器。在分布式环境中,实例数设置为4,以每分钟处理数百万个请求。
我遇到的问题是kubernetes试图平衡群集,并在此过程中杀死了pod并将其带到另一个节点,但是有待处理的HTTP请求 GET和POST迷路了。
kubernetes的解决方案或体系结构解决方案是什么,如果请求卡住/失败,我可以重试吗?
更新:
我对kubernetes服务有两种配置:
答案 0 :(得分:0)
Kubernetes为您提供了一种通过SIGTERM和preStop挂钩优雅地处理pod终端的方法。关于此有几篇文章,例如Graceful shutdown of pods with Kubernetes。在Java应用程序中,您应该侦听SIGTERM并正常关闭服务器(大多数http框架都内置了“关闭”功能)。
我面临的问题是kubernetes试图平衡集群,并在此过程中杀死了pod并将其带到另一个节点
现在,这听起来有点可疑-通常,K8仅在特定情况下(例如,当某个节点用尽资源来服务Pod时)才将不同节点上的Pod逐出并重新计划。如果您的Pod经常被重新安排,这通常表明其他事情正在发生,因此您应该确定根本原因(如果在部署规范中设置了资源限制,请确保您的服务容器没有超出这些限制-这是JVM容器的常见问题。
最后,HTTP重试对于非幂等请求(POST / PUT)本质上是不安全的,因此,您不能不知道逻辑含义就重试任何失败的请求。无论如何,重试通常发生在客户端,而不是服务器,因此这不是可以在K8中设置以启用它们的标志。