GKE + WebSocket + NodePort 30 秒掉线
GKE + WebSocket + NodePort 30s dropped connections
我有一个 golang 服务,它使用通过 NodePort(在本例中为 30002)暴露给 Google 容器引擎 (GKE)/k8s 集群的大猩猩实现 WebSocket 客户端。
我有一个手动创建的负载平衡器(即不在 k8s ingress/load 平衡器),带有 HTTP/HTTPS 前端(即 80/443),将流量转发到我 [=46= 中的节点] 端口 30002 上的集群。
我可以在浏览器(Chrome 58.0.3029.110 on OSX)中获取我的 JavaScript WebSocket 实现来连接、升级和发送/接收消息。
我在 golang WebSocket 客户端中登录 ping/pongs,在 30 秒之前一切看起来都很好。连接后 30 秒,我的 golang WebSocket 客户端收到 EOF / close 1006(异常关闭)和我的 JavaScript 代码得到一个关闭事件。据我所知,我的 Golang 或 JavaScript 代码都没有启动 WebSocket 关闭。
在这种情况下,我并不特别关心会话亲和力 AFAIK,但我已经在负载均衡器中使用长寿命 cookie 尝试了基于 IP 和 cookie 的亲和力。
此外,这组完全相同的 k8s deployment/pod/service 规范和 golang 服务代码通过 AWS 的 ELB 在 AWS 上基于 KOPS 的 k8s 集群上运行良好。
30 年代的强制关闭可能来自哪里?这可能是特定于 GKE 或 GCE 负载均衡器上的 k8s 默认集群设置吗?
感谢阅读!
-- 更新--
负载均衡器上有一个后端配置超时设置,用于 "How long to wait for the backend service to respond before considering it a failed request"。
WebSocket 并非无响应。它一直在发送 ping/pong 和其他消息,直到被杀死,我可以通过浏览器中的 console.log 验证并登录 golang 服务。
就是说,如果我将负载平衡器后端超时设置提高到 30000 秒,事情 "work"。
虽然感觉不是真正的修复,因为负载平衡器将继续不恰当地提供实际无响应的服务流量,不管 WebSocket 是否变得没有反应。
我已经使用路径映射将高超时设置隔离到特定的后端设置,但希望能够真正解决该问题。
查看以下示例:https://github.com/kubernetes/ingress-gce/tree/master/examples/websocket
我认为这可能符合预期。 Google 今天(大约一个小时前)刚刚更新了文档。
Backend Service Components docs
干杯,
马特
我有一个 golang 服务,它使用通过 NodePort(在本例中为 30002)暴露给 Google 容器引擎 (GKE)/k8s 集群的大猩猩实现 WebSocket 客户端。
我有一个手动创建的负载平衡器(即不在 k8s ingress/load 平衡器),带有 HTTP/HTTPS 前端(即 80/443),将流量转发到我 [=46= 中的节点] 端口 30002 上的集群。
我可以在浏览器(Chrome 58.0.3029.110 on OSX)中获取我的 JavaScript WebSocket 实现来连接、升级和发送/接收消息。
我在 golang WebSocket 客户端中登录 ping/pongs,在 30 秒之前一切看起来都很好。连接后 30 秒,我的 golang WebSocket 客户端收到 EOF / close 1006(异常关闭)和我的 JavaScript 代码得到一个关闭事件。据我所知,我的 Golang 或 JavaScript 代码都没有启动 WebSocket 关闭。
在这种情况下,我并不特别关心会话亲和力 AFAIK,但我已经在负载均衡器中使用长寿命 cookie 尝试了基于 IP 和 cookie 的亲和力。
此外,这组完全相同的 k8s deployment/pod/service 规范和 golang 服务代码通过 AWS 的 ELB 在 AWS 上基于 KOPS 的 k8s 集群上运行良好。
30 年代的强制关闭可能来自哪里?这可能是特定于 GKE 或 GCE 负载均衡器上的 k8s 默认集群设置吗?
感谢阅读!
-- 更新--
负载均衡器上有一个后端配置超时设置,用于 "How long to wait for the backend service to respond before considering it a failed request"。
WebSocket 并非无响应。它一直在发送 ping/pong 和其他消息,直到被杀死,我可以通过浏览器中的 console.log 验证并登录 golang 服务。
就是说,如果我将负载平衡器后端超时设置提高到 30000 秒,事情 "work"。
虽然感觉不是真正的修复,因为负载平衡器将继续不恰当地提供实际无响应的服务流量,不管 WebSocket 是否变得没有反应。
我已经使用路径映射将高超时设置隔离到特定的后端设置,但希望能够真正解决该问题。
查看以下示例:https://github.com/kubernetes/ingress-gce/tree/master/examples/websocket
我认为这可能符合预期。 Google 今天(大约一个小时前)刚刚更新了文档。
Backend Service Components docs
干杯,
马特