web-dev-qa-db-fra.com

Prise en charge Websocket du contrôleur d'entrée Nginx

Récemment, je travaille sur une application de jouets utilisant Kubernetes. Une partie de l'application est un serveur Web qui doit prendre en charge les WebSockets. Actuellement, j'utilise le transfert de port pour accéder au serveur Web et tout fonctionne très bien.

Je voudrais passer à l'utilisation d'Ingress et d'IngressController pour éviter d'utiliser la redirection de port.

Voici ma Ingress config:

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

Maintenant, l'accès à l'application via $(minikube ip)/app fonctionne très bien, mais les demandes WebSocket échouent toutes car nginx renvoie un 200 et non un 101.

J'ai essayé d'ajouter l'annotation nginx.org/websocket-services Mais cela ne semble pas fonctionner non plus.

Quelqu'un a-t-il rencontré une situation similaire?

À votre santé

6
Kit Freddura

En regardant les nginx ingress controller docs et les nginx docs vous avez probablement besoin de quelque chose comme ça comme une annotation sur votre Kubernetes Ingress:

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

Notez qu'une fois que vous avez ajouté cette annotation, toutes vos règles Ingress auront cet extrait dans le bloc location dans vos configurations nginx. Donc, si vous voulez l'ignorer pour d'autres règles, vous devrez créer un Kubernetes Ingress distinct.

5
Rico