11

最近我一直在使用 Kubernetes 开发一个玩具应用程序。该应用程序的一部分是需要支持 WebSockets 的 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注释,但这似乎也不起作用。

有没有人遇到过类似的情况?

干杯

4

2 回答 2

12

通过查看nginx 入口控制器文档nginx 文档,您可能需要这样的内容作为 Kubernetes 上的注释Ingress

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

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

编辑:

根据gistNginx ingress docs,这个注释似乎解决了这个问题:

nginx.ingress.kubernetes.io/proxy-read-timeout: 3600
nginx.ingress.kubernetes.io/proxy-send-timeout: 3600
于 2018-10-18T23:51:09.900 回答
3

Theese 为我工作。

似乎他们通过注释添加了支持(文档中的示例):

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

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

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

需要注意的重要一点:有两个 nginx 入口控制器可用,更多信息在这里

此答案仅限于 nginxinc 版本,与问题中使用的不同,接受的答案是目前唯一的解决方案。

于 2021-05-24T19:06:57.357 回答