Пользовательские домены Google Cloud Run не работают с веб-сокетами - PullRequest
0 голосов
/ 04 августа 2020

Я успешно развернул простую панель управления Voila, используя Google Cloud Run для Anthos . Однако, поскольку я создал развертывание с использованием конвейера GitLab CI, по умолчанию службе было присвоено длинное и непонятное доменное имя (например, http://sudoku.dashboards-19751688-sudoku.k8s.proteinsolver.org/).

Я выполнил инструкции в сопоставление пользовательских доменов для сопоставления более короткого личного домена с описанной выше службой (например, http://sudoku.k8s.proteinsolver.org). Однако, хотя ресурсы stati c загружаются из этого нового пользовательского домена нормально, интерактивная панель управления не загружается, а в консоли javascript появляются ошибки:

default.js:64 WebSocket connection to 'wss://sudoku.k8s.proteinsolver.org/api/kernels/5bcab8b9-11d5-4de0-8a64-399e35258aa1/channels?session_id=7a0eed38-77bb-40e8-ad77-d05632b5fa1b' failed: Error during WebSocket handshake: Unexpected response code: 503
_createSocket @ scheduler.production.min.js:10
[...]

Есть ли способ получить веб-сокеты для работы с пользовательскими доменами? Я что-то не так делаю?

Ответы [ 2 ]

1 голос
/ 14 августа 2020

TL; DR, для работы websocket необходимо применить следующий yaml:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: allowconnect-cluser-local-gateway
  namespace: gke-system
spec:
  workloadSelector:
    labels:
      app: cluster-local-gateway
  configPatches:
  - applyTo: NETWORK_FILTER
    match:
      listener:
        portNumber: 80
        filterChain:
          filter:
            name: "envoy.http_connection_manager"
    patch:
      operation: MERGE
      value:
        typed_config:
          "@type": "type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager"
          http2_protocol_options:
            allow_connect: true

Вот объяснение.

Для функции настраиваемого домена путь запроса -

client ---> istio-ingress envoy pods ---> cluster-local-gateway envoy pods ---> user's application.

Специально для запроса веб-сокета ему необходимы cluster-local-gateway модули envoy для поддержки расширенной функции CONNECT .

EnvoyFilter yaml включает функцию extended CONNECT путем установки * От 1016 * до true в модулях cluster-local-gateway.

Я пробовал сам, и он у меня работает.

1 голос
/ 07 августа 2020

Я ничего не знаю о вашем конвейере GitLab CI. По умолчанию Knative (Cloud Run для Anthos) назначает внешние доменные имена, например {name}.{namespace}.example.com, где example.com можно настроить в зависимости от вашего домена.

Вы можете найти этот домен в Cloud Console или kubectl get ksvc.

Сначала попробуйте, правильно ли этот домен работает с веб-сокетами. Если так, то это действительно проблема "личного домена". (Если вы не уверены, отредактируйте заголовок / вопрос, чтобы не упоминать «пользовательские домены».)

Кроме того, вам необходимо явно пометить порт вашего контейнера как h2c на Knative для работы веб-сокетов. См. Раздел ports ниже, в частности name: h2c:

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  name: hello
spec:
  template:
    spec:
      containers:
      - image: gcr.io/google-samples/hello-app:1.0
        ports:
        - name: h2c
          containerPort: 8080

Я также вижу, что код ответа на ваши запросы - HTTP 503, что, вероятно, указывает на ошибку сервера. Пожалуйста, проверьте логи вашего приложения.

...