GCE Ingress暴露WebSocket服务超时问题求助
GCE Ingress暴露WebSocket服务超时问题求助
大家好,我最近在使用GCE Ingress暴露Kubernetes集群里的服务时遇到了一个棘手的问题,想请各位帮忙排查下哪里配置出错了。
我的需求是暴露两个服务:
- Web应用:通过
example.com的80端口访问 - WebSocket服务:通过
example.com/app/ws的8000端口访问
下面是我当前的Kubernetes配置:
apiVersion: "v1" kind: "Service" metadata: name: "web-app-service" annotations: cloud.google.com/load-balancer-type: "Internal" spec: type: "LoadBalancer" selector: app.kubernetes.io/instance: "web-app" ports: - protocol: "TCP" port: 80 targetPort: 80 name: "http" --- apiVersion: "v1" kind: "Service" metadata: name: "web-sockets-service" spec: type: "NodePort" selector: app.kubernetes.io/instance: "web-sockets" ports: - protocol: "TCP" port: 8000 targetPort: 8000 name: "http" --- apiVersion: "networking.k8s.io/v1" kind: "Ingress" metadata: name: "web-app-ingress" annotations: kubernetes.io/ingress.class: "gce" spec: rules: - host: "example.com" http: paths: - path: "/app/ws" pathType: "Prefix" backend: service: name: "web-sockets-service" port: number: 8000 - path: "/" pathType: "Prefix" backend: service: name: "web-app-service" port: number: 80
目前的问题表现:
- Web应用
example.com可以正常访问,完全没问题 - 但尝试连接WebSocket服务
example.com/app/ws时,一直出现超时错误,不管用curl还是websocat都无法建立连接 - 直接在集群内部(从其他Pod发起请求)调用WebSocket服务的IP是正常的,能成功建立连接并收到服务器响应,说明服务本身是没问题的,问题应该出在Ingress层面
我做了以下测试:
外部调用测试(超时)
curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" example.com/app/ws:8000
结果:请求超时
集群内部调用测试(成功)
curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" <web-sockets-service ip>/app/ws:8000
结果:成功收到WebSocket服务器的响应
Websocat测试
- 内部调用(成功):
websocat ws://<web-sockets-service ip>:8000/app/ws
返回:
{"event":"connection_established","data":"{\"socket_id\":\"620572367.722478523\",\"activity_timeout\":30}"}
- 外部通过Ingress调用(失败):
websocat ws://example.com:8000/app/ws
返回:
websocat: WebSocketError: I/O Failure websocat: error running
我怀疑是不是GCE Ingress需要额外的注解来支持WebSocket的连接升级?或者我的Ingress路径配置有问题?希望有经验的朋友能帮我看看,谢谢!
备注:内容来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

