Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go GKE+;WebSocket+;节点端口30s断开的连接_Go_Websocket_Google Cloud Platform_Kubernetes_Google Kubernetes Engine - Fatal编程技术网

Go GKE+;WebSocket+;节点端口30s断开的连接

Go GKE+;WebSocket+;节点端口30s断开的连接,go,websocket,google-cloud-platform,kubernetes,google-kubernetes-engine,Go,Websocket,Google Cloud Platform,Kubernetes,Google Kubernetes Engine,我有一个golang服务,它使用gorilla实现一个WebSocket客户端,gorilla通过一个NodePort(本例中为30002)暴露于Google容器引擎(GKE)/k8s集群 我有一个手动创建的负载平衡器(即不在k8s入口/负载平衡器处),带有HTTP/HTTPS前端(即80/443),将流量转发到端口30002上我的GKE/k8s集群中的节点 我可以在浏览器(OSX上的Chrome 58.0.3029.110)中获得JavaScript WebSocket实现,以连接、升级和发送

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

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

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

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

在本例中,我并不特别关心AFAIK中的会话关联性,但我已经在负载平衡器中使用长寿命cookie尝试了基于IP和cookie的关联性

此外,这套完全相同的k8s部署/吊舱/服务规范和golang服务代码通过AWS的ELBs在AWS上基于KOPS的k8s集群上运行良好

有没有关于30年代强制关闭的想法?这可能是GKE特有的k8s默认集群设置,还是GCE负载平衡器上的某个设置

谢谢你的阅读

--更新--

负载平衡器上有一个后端配置超时设置,即“在将后端服务视为失败请求之前,等待后端服务响应的时间”

WebSocket不是无响应的。它一直在发送乒乓球和其他消息,直到被杀,我可以通过console验证。浏览器中的日志和golang服务中的日志

也就是说,如果我将负载平衡器后端超时设置设为30000秒,事情就会“正常”

但这并不是一个真正的解决方案,因为负载平衡器将继续不适当地提供实际的无响应服务流量,不管WebSocket是否变得无响应


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

查看以下示例:

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

干杯


Matt

是否是负载平衡器在30秒后终止了连接?您的自定义入口控制器使用了什么?我不知道我怎么会错过它,但GCP负载平衡器的后端设置有一个超时,“等待后端服务响应多长时间才能将其视为失败请求”,默认为30秒。WebSocket不是无响应的。它发送/接收乒乓球和MSG直到30秒被杀,我在浏览器和golang日志中看到了这一点。如果我将负载平衡器超时设置为30000秒,事情就会“正常”。不是真正的解决方案,因为通过负载平衡器的其他通信永远不会变得无响应;负载平衡器将继续向他们发送流量。我们有完全相同的问题,可以确认这是负载平衡器的问题,而不是Kubernetes/GKE的问题。我们已经从TCP切换到HTTPS loadbalancer,并且刚刚注意到套接字连接在30秒时超时。已尝试更改上述设置,但仍看到连接断开感谢github讨论的链接!正如我在文章中提到的,我没有使用Kubernetes来实现负载平衡,所以除非我遗漏了什么,否则我不关心OnlyLocal提供的亲和力,但是的,根据我的更新,GCP负载平衡器上的超时是关键。这就是说,这不是一个“真正的”解决方案,因为它意味着它不会超时*实际上是“无响应的连接”。用一个示例更新了我的响应以更准确。@Chris我再次更新了链接()死链接:'(示例已删除,但这里是引用提交:也是原始PR: