GKE + WebSocket + NodePort 30s断开连接

时间:2017-05-17 19:23:39

标签: go websocket google-cloud-platform kubernetes google-kubernetes-engine

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

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

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

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

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

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

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

感谢阅读!

- 更新 -

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

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

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

虽然因为负载均衡器会继续不当地提供实际无响应的服务流量,但感觉不是真正的修复,不管介意WebSocket 是否无响应。< / p>

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

2 个答案:

答案 0 :(得分:1)

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

LB Proxy Support docs

Backend Service Components docs

干杯,

马特

答案 1 :(得分:-1)