web-dev-qa-db-ja.com

Nginx Ingress Controller WebSocketサポート

最近、私はKubernetesを使用しておもちゃのアプリに取り組んでいます。アプリの一部は、WebSocketをサポートする必要がある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を介してアプリにアクセスすると問題なく動作しますが、nginxが101ではなく200を返すため、WebSocketリクエストはすべて失敗します。

_nginx.org/websocket-services_アノテーションを追加しようとしましたが、機能していないようです。

誰かが同様の状況に遭遇しましたか?

乾杯

6
Kit Freddura

nginx ingress controller docs および 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を作成する必要があります。

5
Rico