Nginx入口控制器Websocket支持

时间:2018-10-18 22:53:06

标签: nginx websocket kubernetes kubernetes-ingress nginx-ingress

最近我一直在使用Kubernetes开发一个玩具应用程序。该应用程序的一部分是需要支持WebSocket的Web服务器。目前,我正在使用端口转发来访问Web服务器,并且一切正常。

我想切换为使用Ingress和IngressController以避免使用端口转发。

这是我的Ingress配置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/secure-backends: "true"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
spec:
  rules:
  - http:
      paths:
      - path: /app
        backend:
          serviceName: web-svc
          servicePort: 3030
      - path: /ws
        backend:
          serviceName: web-svc
          servicePort: 3030

现在可以通过$(minikube ip)/app访问该应用程序,但是WebSocket请求全部失败,因为nginx返回200,而不是101。

我尝试添加nginx.org/websocket-services批注,但这似乎也不起作用。

有人遇到过类似情况吗?

欢呼

2 个答案:

答案 0 :(得分:4)

通过查看nginx ingress controller docsnginx docs,您可能需要这样的内容作为Kubernetes Ingress上的注释:

nginx.ingress.kubernetes.io/configuration-snippet: |
   proxy_http_version 1.1;
   proxy_set_header Upgrade "websocket";
   proxy_set_header Connection "Upgrade";

请注意,一旦添加了注释,您所有的Ingress规则都将在nginx配置的location块中包含该代码段。因此,如果您想忽略其他规则,则必须创建一个单独的Kubernetes Ingress

答案 1 :(得分:0)

这些对我有用。

似乎他们通过注释 (example in docs) 添加了支持:

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

我使用 telsocket 测试了我的连接,这是连接到 WS/WSS 套接字的小工具。

有各种不同的客户端,这也可能有助于找到连接的罪魁祸首。