我有一个接受TCP流量(不是HTTP)的应用程序,我希望能够使流量负载平衡到它。然而,有一个要求是,当客户端建立连接时,我们在任何情况下(理想情况下)都不会关闭该连接,因为我们正在处理一些使用旧技术的客户端。
我已经设置了kubernetes nginx入口控制器,但它的行为不像我希望的那样。我想要的是:如果与上游服务器之一的连接关闭,那么客户端连接保持打开一段时间,而nginx选择一个新的上游服务器并开始向它发送数据。我不关心流的数据在不同的上游服务器上被分割,我只需要在重新部署期间从客户端的角度保持连接打开。
实际发生的情况是,从我的客户端的角度来看,目前当上游服务器应用程序关闭连接时,我的连接被关闭,我必须重新连接。
入口控制器有这个配置,我认为它会完成我想要的,但它似乎没有像预期的那样工作:
server {
preread_by_lua_block {
ngx.var.proxy_upstream_name="tcp-my-namespace-my-service-7550";
}
listen 7550;
proxy_timeout 600s;
proxy_next_upstream on;
proxy_next_upstream_timeout 600s;
proxy_next_upstream_tries 3;
proxy_pass upstream_balancer;
}
非常感谢您的帮助,我很乐意提供更多信息。
你所描述的是nginx如何使用http开箱即用的。然而
- Nginx详细了解http
- HTTP是基于消息的协议,即使用请求和应答
因为nginx不知道你正在使用的协议,即使它使用没有隐含状态的请求/回复机制,nginx也不知道它是否收到了一个请求,而不是在其他地方重放它。
你需要实现一个protol-aware mitm。
不幸的是,我还没有能够得到这个功能与nginx工作。我最终做的是编写我自己的基本TCP反向代理,它可以完成我需要的工作——如果与后端实例的连接丢失,它会尝试在不中断前端连接的情况下获得一个新的连接。我们收到的流量是相当可预测的,因为我不希望移动连接会中断任何"逻辑"。99%的时间流上的消息
我仍然很想知道是否有人知道现有的工具具有此功能,但目前我确信没有现成的工具可用。
我认为您需要配置您的Nginx Ingress
以启用此处文档中列出的keepalive
选项。例如,在您的nginx
配置为:
...
keepalive 32;
...
这将激活保持连接功能,一次最多可激活32个连接的缓存。