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