我有以下设置: 客户端应用程序通过 nginx 代理连接到 websocket 应用程序 (ssl) 以检查标头。 websocket 已配置并在使用中正常工作。
本地闲置时,一切正常。 nginx 使用
proxy_read_timeout
转发 Websocket,并且连接保持正常。
但是当部署在 kubernetes 中时,我的 websocket 连接在 50 秒(50.29 +- 0.05 秒)后关闭
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
我尝试添加所有可能的 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。
我的同事发现了这个问题。
50 秒超时来自负载均衡器 (Octavia) 配置。 更新后连接稳定了。
希望可以帮助到大家