GKE + WebSocket + NodePort 30s断开连接

问题描述 投票:6回答:2

我有一个golang服务,它使用gorilla实现一个WebSocket客户端,通过NodePort(在本例中为30002)暴露给Google容器引擎(GKE)/ k8s集群。

我有一个手动创建的负载均衡器(即不在k8s入口/负载均衡器)和HTTP / HTTPS前端(即80/443),它将流量转发到端口30002上我的GKE / k8s集群中的节点。

我可以在浏览器中使用我的JavaScript WebSocket实现(OSX上的Chrome 58.0.3029.110)来连接,升级和发送/接收消息。

我在golang WebSocket客户端中记录ping / pongs,所有看起来都很好,直到30s。连接后我的golang WebSocket客户端得到一个EOF /关闭1006(异常关闭),我的JavaScript代码得到一个关闭事件。据我所知,我的Golang或JavaScript代码都没有启动WebSocket闭包。

在这种情况下,我并不特别关心会话亲和力AFAIK,但我在负载均衡器中使用长期cookie尝试了基于IP和cookie的亲和力。

此外,这个完全相同的k8s部署/ pod /服务规范和golang服务代码在AWS上通过AWS'ELB在我的基于KOPS的k8s集群上运行良好。

30年代被迫关闭的任何想法都可能来自哪里?这可能是特定于GKE的k8s默认群集设置还是GCE负载均衡器上的某些设置?

谢谢阅读!

- 更新 -

负载均衡器上有一个后端配置超时设置,用于“在考虑失败请求之前等待后端服务响应多长时间”。

WebSocket没有反应迟钝。它正在发送ping / pong和其他消息直到被杀死,我可以通过浏览器中的console.log验证并登录golang服务。

也就是说,如果我将负载均衡器后端超时设置提高到30000秒,那么事情就会“起作用”。

虽然因为负载均衡器将继续不恰当地提供实际无响应的服务流量,所以感觉不是真正的修复,更不用说WebSocket是否变得无响应。

我已经使用路径映射将高超时设置隔离到特定的后端设置,但希望能够找到问题的真正解决方案。

go websocket google-cloud-platform kubernetes google-kubernetes-engine
2个回答
1
投票

我认为这可能是按预期工作的。谷歌今天刚刚更新了文档(大约一小时前)。

LB Proxy Support docs

Backend Service Components docs

干杯,

马特


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