我有一个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是否变得无响应。
我已经使用路径映射将高超时设置隔离到特定的后端设置,但希望能够找到问题的真正解决方案。