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é
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.