首页 文章

WebSocket握手:意外的响应代码:kubernetes-ingress中的400

提问于
浏览
4

如果我连接到入口的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 回答

  • 0

    尝试添加注释 nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_token"

    https://github.com/kubernetes/ingress-nginx/issues/2097

  • 0

    您想要将 nginx.org/websocket-services 注释添加到入口资源定义中 . 反过来,这告诉nginx支持websockets(我相信它与升级/连接头有关吗?) .

    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
    
  • 0

    nginx-ingress documentation中所述,要代理WebSocket流量,您应该使用websocket服务名称的注释 . 别忘了使用引号:

    nginx.org/websocket-services: "service1[,service2,...]"
    

    documentation的此示例中,仅为三个服务之一启用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
    

相关问题