Nginx 入口控制器 websocket 支持



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

我想切换到使用入口和入口控制器以避免使用端口转发。

这是我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注释,但这似乎也不起作用。

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

干杯

通过查看nginx入口控制器文档和nginx文档,您可能需要这样的东西作为KubernetesIngress的注释:

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

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

编辑:

根据要点和 Nginx 入口文档 📄 ,似乎这个注释解决了问题:

nginx.ingress.kubernetes.io/proxy-read-timeout: 3600
nginx.ingress.kubernetes.io/proxy-send-timeout: 3600

Theese为我工作。

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

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

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

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

重要提示:有两个nginx入口控制器可用,更多信息在这里。

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

我使用过的解决方案(请检查注释区域(:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tornado-socket
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
nginx.ingress.kubernetes.io/server-snippets: |
location / {
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_set_header Connection "upgrade";
proxy_cache_bypass $http_upgrade;
}
spec:....

似乎免费版本的Ingress-NgInx需要此注释。 全文: https://www.civo.com/learn/using-websockets-with-ingress-controller

适用于使用nginx 入口控制器使用经典 ELB 的用户。 不支持 Websocket。 不要花更多的时间. https://aws.amazon.com/elasticloadbalancing/features/

最新更新