kubernetes nginx websocket 在 50 秒后代理关闭连接,尽管超时配置

问题描述 投票:0回答:1

我有以下设置: 客户端应用程序通过 nginx 代理连接到 websocket 应用程序 (ssl) 以检查标头。 websocket 已配置并在使用中正常工作。

本地闲置时,一切正常。 nginx 使用

proxy_read_timeout
转发 Websocket,并且连接保持正常。

但是当部署在 kubernetes 中时,我的 websocket 连接在 50 秒(50.29 +- 0.05 秒)后关闭

  • 我使用以下 Kubernetes 服务器版本:
    version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.16", GitCommit:"51e33fadff13065ae5518db94e84598293965939", GitTreeState:"clean", BuildDate:"2023-07-19T12:19:24Z", GoVersion:"go1.20.6", Compiler:"gc", Platform:"linux/amd64"}
    
    它不是公共的 Google/AWS/等。设置.
  • 入口控制器是
    registry.k8s.io/ingress-nginx/controller:v1.9.3
  • 我正在使用 Octavia 负载均衡器。

我尝试添加所有可能的 nginx 相关参数(超时、工作线程超时、上游超时):

    upstream myUpstream {
        server myUpstream:443;
        keepalive 32;
    }

    location /ws {
            proxy_http_version 1.1;
            proxy_pass_request_headers on;

            proxy_set_header Connection 'Upgrade';
            proxy_set_header Upgrade $http_upgrade;

            proxy_read_timeout 1800s;
            proxy_connect_timeout 1800s;
            proxy_send_timeout 1800s;
            send_timeout 1800s;

            proxy_pass http://myUpstream/ws;
        }

我还尝试将相关参数添加到我的服务入口:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "16m"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"
    nginx.ingress.kubernetes.io/proxy-buffer-size: "256k"
  name: url-routing

我尝试将 nginx proxy_read_timeout 降低到 30 秒,在这种情况下,我确实让 websocket 在 30 秒(30.29 +- 0.05 秒)后正确关闭

我尝试在 k8 中编辑入口控制器,但似乎不起作用。

另一个 websocket 访问与 nginx 代理相同命名空间中的另一个服务,不会出现任何断开连接问题。

什么可能会强制默认 50 秒超时以及如何解决它?

我宁愿避免向我的 websocket 添加 keep-alive。

kubernetes nginx websocket reverse-proxy nginx-ingress
1个回答
0
投票

我的同事发现了这个问题。

50 秒超时来自负载均衡器 (Octavia) 配置。 更新后连接稳定了。

希望可以帮助到大家

© www.soinside.com 2019 - 2024. All rights reserved.