nginx TCP流(k8s) -当上游关闭时保持客户端连接打开



我有一个接受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开箱即用的。然而

  1. Nginx详细了解http
  2. HTTP是基于消息的协议,即使用请求和应答

因为nginx不知道你正在使用的协议,即使它使用没有隐含状态的请求/回复机制,nginx也不知道它是否收到了一个请求,而不是在其他地方重放它。

你需要实现一个protol-aware mitm。

不幸的是,我还没有能够得到这个功能与nginx工作。我最终做的是编写我自己的基本TCP反向代理,它可以完成我需要的工作——如果与后端实例的连接丢失,它会尝试在不中断前端连接的情况下获得一个新的连接。我们收到的流量是相当可预测的,因为我不希望移动连接会中断任何"逻辑"。99%的时间流上的消息

我仍然很想知道是否有人知道现有的工具具有此功能,但目前我确信没有现成的工具可用。

我认为您需要配置您的Nginx Ingress以启用此处文档中列出的keepalive选项。例如,在您的nginx配置为:

...
keepalive 32;
...

这将激活保持连接功能,一次最多可激活32个连接的缓存。

最新更新