如果我要连接到用于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
如何为网络套接字服务创建入口?
答案 0 :(得分:0)
您想将nginx.org/websocket-services
批注添加到入口资源定义中。反过来,这告诉nginx支持websocket(我认为这与Upgrade / Connection标头有关?)。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: websocket-producer-cdph
annotations:
nginx.org/websocket-services: "websocket-producer-cdph"
spec:
rules:
- host: some.domain.com
http:
paths:
- path: /
backend:
serviceName: websocket-producer-cdph
servicePort: 8183
答案 1 :(得分:0)
如nginx-ingress documentation中所述,要代理WebSocket通信,您应该使用带有websocket服务名称的注释。不要忘记使用引号:
nginx.org/websocket-services: "service1[,service2,...]"
在documentation中的此示例中,仅对以下三种服务之一(ws-svc
)启用了WebSocket:
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
答案 2 :(得分:0)
尝试添加注释nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_token"