websocket - WebSocket 握手:意外的响应代码:kubernetes-ingress 中的 400
问题描述
如果我连接到 Web 套接字服务的入口失败,则面临此问题:WebSocket 握手期间出错:意外响应代码:400
入口 YAML
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: websocket-producer-cdph
spec:
rules:
host: some.domain.com
http:
paths:
path: "/"
backend:
serviceName: websocket-producer-cdph
servicePort: 8183
status:
loadBalancer:
ingress:
{}
服务 YAML
kind: Service
apiVersion: v1
metadata:
name: websocket-producer-cdph
spec:
ports:
name: ws
protocol: TCP
port: 8183
targetPort: 8183
selector:
app: websocket-producer-cdph
clusterIP: 10.100.254.99
type: ClusterIP
sessionAffinity: None
status:
loadBalancer:
{}
当我尝试收听 ws://some.domain.com/ws 时,它在 WebSocket 握手期间显示错误:意外响应代码:400
/ws 是路径
但是,如果将服务中的规范类型更新为 LoadBalancer,它将生成一个 IP 192.168.1.17:8183 并监听 ws://192.168.1.17:8183/ws 它的工作,但我需要使用入口公开 URL 所以它可以在网络之外使用。
我将以下图像用于入口控制器:
quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.19.0
如何为 web-socket 服务创建入口?
解决方案
如nginx-ingress 文档中所述,要代理 WebSocket 流量,您应该使用带有 websocket 服务名称的注释。不要忘记使用引号:
nginx.org/websocket-services: "service1[,service2,...]"
在文档中的这个示例中,WebSocket 仅对三个服务之一启用 ( ws-svc
):
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
nginx.org/websocket-services: "ws-svc"
spec:
rules:
- host: cafe.example.com
http:
paths:
- path: /tea
backend:
serviceName: tea-svc
servicePort: 80
- path: /coffee
backend:
serviceName: coffee-svc
servicePort: 80
- path: /ws
backend:
serviceName: ws-svc
servicePort: 8008
推荐阅读
- r - 如何在 R 的剪影图中更改集群名称
- c++ - 为什么这个打印 1 而不是周三?
- python - IndexError:在从 matlab 转换为 python 期间,索引 2 超出轴 1 的范围,大小为 2
- java - Hamcrest 使用 List 成员断言复杂对象
- javascript - 处理 React 和 Stripe 注册流程的最佳方式
- unity3d - 如何在 Unity 中为飞行的 3D 鸟添加对撞机?
- javascript - 如何使用数组值更新样式层权重
- excel - VBA中的COUNTIFS用于多列和多行
- django - Django:无法通过流程实例访问管理器
- sql-server - SQL Server group by 内联 SQL