Nginx入口控制器WebSocket支持

ewm0tg9j  于 2023-02-11  发布在  Nginx
关注(0)|答案(3)|浏览(163)

最近我用Kubernetes开发了一个玩具应用程序。这个应用程序的一部分是需要支持WebSockets的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注解,但似乎也不起作用。
有人遇到过类似的情况吗?
干杯

t3irkdon

t3irkdon1#

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

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

72qzrwbm

72qzrwbm2#

通过查看nginx入口控制器文档和nginx 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
编辑:
根据要点和Nginx入口文档,看起来这个注解修复了这个问题:📄, it seems like this annotation fixed the problem:

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

wwtsj6pe3#

他们为我工作。
他们似乎通过注解(example in docs)添加了支持:

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

我用telsocket测试了我的连接,telsocket是一个连接WS/WSS套接字的小工具。
有各种不同的客户端,这也可能有助于找到连接的罪魁祸首。

**重要提示:**有两个nginx入口控制器可用,更多信息here

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

相关问题