【问题标题】:Google Cloud Run custom domains do not work with web socketsGoogle Cloud Run 自定义域不适用于网络套接字
【发布时间】:2020-11-24 19:21:26
【问题描述】:

我使用 Google Cloud Run for Anthos 成功部署了一个简单的 Voila 仪表板。但是,由于我使用 GitLab CI 管道创建了部署,因此默认情况下,该服务被分配了一个长而晦涩的域名(例如 http://sudoku.dashboards-19751688-sudoku.k8s.proteinsolver.org/)。

我按照mapping custom domains 中的说明将较短的自定义域映射到上述服务(例如http://sudoku.k8s.proteinsolver.org)。然而,虽然静态资产可以从这个新的自定义域中正常加载,但交互式仪表板不会加载,并且 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
[...]

有没有办法让 Web 套接字与自定义域一起工作?我做错了吗?

【问题讨论】:

  • 我知道这是一个已知问题,但我无法找到它的确认。也许 Google 员工(Steren 或 Ahmet)能够证实这一点。
  • 您是否确认它在 Knative 分配的外部域上工作(显示在 Cloud Console 中),但不知何故它在自定义域上被破坏了?
  • @AhmetB-Google 是的,我的问题中的 http://sudoku... url 对应于部署在 Google Cloud Run for Anthos 上的实际服务,第一个 url 是 Knative 分配的域,第二个 url 是自定义域。

标签: google-cloud-platform google-cloud-run


【解决方案1】:

TLDR,需要应用以下 yaml 才能使 websocket 工作:

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.

专门针对websocket请求,需要cluster-local-gateway envoy pods来支持extended CONNECT功能。

EnvoyFilter yaml 通过在 cluster-local-gateway pod 中将 allow_connect 设置为 true 来启用 extended CONNECT 功能。

我自己试过了,对我有用。

【讨论】:

  • 这很有效,但还必须确保Enable HTTP/2 connections(在连接下)被禁用
【解决方案2】:

我对您的 GitLab CI 管道一无所知。默认情况下,Knative (Cloud Run for Anthos) 会分配外部域名,例如 {name}.{namespace}.example.com,其中 example.com 可以根据您的域进行自定义。

您可以在 Cloud Console 或 kubectl get ksvc 找到此域。

首先尝试此域是否与 websockets 一起正常工作。如果是这样,确实是“自定义域”问题。 (如果您不确定,请编辑您的标题/问题,不要提及“自定义域”。)

此外,您需要在 Knative 上明确将您的容器端口标记为 h2c,以便 websockets 正常工作。请参阅下面的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,这可能表示服务器错误。请检查您的应用程序的日志。

【讨论】:

    猜你喜欢
    • 2021-10-03
    • 2021-11-10
    • 1970-01-01
    • 2021-01-10
    • 2017-09-30
    • 2019-11-13
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多