如果我连接到入口的Web套接字服务失败,则面临此问题:WebSocket握手期间出错:意外的响应代码:400
Ingress 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:
{}
Service 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但我需要使用ingress公开URL它可以在网络之外使用 .
我使用以下图像作为入口控制器:
quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.19.0
如何为Web套接字服务创建入口?
3 回答
尝试添加注释
nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_token"
https://github.com/kubernetes/ingress-nginx/issues/2097
您想要将
nginx.org/websocket-services
注释添加到入口资源定义中 . 反过来,这告诉nginx支持websockets(我相信它与升级/连接头有关吗?) .如nginx-ingress documentation中所述,要代理WebSocket流量,您应该使用websocket服务名称的注释 . 别忘了使用引号:
在documentation的此示例中,仅为三个服务之一启用WebSocket(
ws-svc
):