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

Kar*_*hit 5 websocket kubernetes kubernetes-ingress

如果我连接到 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:
{}
Run Code Online (Sandbox Code Playgroud)

服务 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:
{}
Run Code Online (Sandbox Code Playgroud)

当我尝试收听 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-socket 服务创建入口?

VAS*_*VAS 6

nginx-ingress 文档中所述,要代理 WebSocket 流量,您应该使用带有 websocket 服务名称的注释。不要忘记使用引号:

nginx.org/websocket-services: "service1[,service2,...]"
Run Code Online (Sandbox Code Playgroud)

文档中的这个示例中,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
Run Code Online (Sandbox Code Playgroud)

  • 该存储库为 NGINX 和 NGINX Plus 提供了 Ingress 控制器的实现。此实现与 kubernetes/ingress-nginx 存储库中的 NGINX Ingress 控制器不同。请参阅此文档以了解主要差异。[https://github.com/nginxinc/kubernetes-ingress/blob/master/docs/nginx-ingress-controllers.md] **我正在使用 kubernetes/ingress-nginx 存储库** [https://github.com /kubernetes/ingress-nginx] 在 [https://github.com/nginxinc/kubernetes-ingress] 中,readme.md 他们明确指出,**两个控制器都是不同的。** (2认同)

小智 -1

您想要将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
Run Code Online (Sandbox Code Playgroud)