我有一个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>
我已经使用路径图将高超时设置隔离到特定的后端设置,但希望能够找到解决问题的真正方法。
答案 0 :(得分:1)
答案 1 :(得分:-1)