配置 Cloud Run on Anthos 以转发 HTTP2

Posted

技术标签:

【中文标题】配置 Cloud Run on Anthos 以转发 HTTP2【英文标题】:Configure Cloud Run on Anthos to forward HTTP2 【发布时间】:2020-04-26 17:39:18 【问题描述】:

如何让 Cloud Run for Anthos 将传入的 HTTP2 请求作为 HTTP2 而不是 HTTP/1.1 转发到 Cloud Run 服务?

我正在使用 GCP 和 Cloud Run for Anthos 来部署运行 GRPC 服务器的 Java 应用程序。 Cloud Run 应用程序是公开的。我还使用 SSL 证书配置了 Cloud Run for Anthos。当我尝试使用 GRPC 客户端调用我的服务时,客户端通过负载均衡器接受的 HTTP2 发送请求,但是当请求被转发到我的 Cloud Run 服务(运行 GRPC 服务器的 Java 应用程序)时,它以 HTTP/ 的形式出现1.1 并被 GRPC 服务器拒绝。我假设在 k8 负载均衡器和我的 k8 pod 之间的某个地方,请求被转发为 HTTP/1.1,但我不知道如何解决这个问题。

【问题讨论】:

【参考方案1】:

结合@whlee 的回答和他非常重要的后续评论,这正是我必须做的才能让它发挥作用。

您必须使用 gcloud cli 进行部署才能更改命名端口。 UI 不允许您配置端口名称。从服务 yaml 部署当前是一个 beta 功能。要部署,请运行:gcloud beta run services replace /path/to/service.yaml

在我的例子中,我的服务最初是使用 GCP 云控制台 UI 部署的,所以这里是我运行以导出和替换的步骤。

    将我现有的服务(名为 hermes-grpc)导出到 yaml 文件:
gcloud beta run services describe hermes-grpc --format yaml > hermes-grpc.yaml
    编辑我的导出 yaml 并进行以下编辑:

替换:

        ports:
        - containerPort: 6565

与:

        ports:
          - name: h2c
            containerPort: 6565

删除了以下几行:

          tcpSocket:
            port: 0

从该部分中删除了name:

spec:
  template:
    metadata:
...
      name:
    最后,从编辑的 yaml 重新部署服务:
gcloud beta run services replace hermes-grpc.yaml

最后我编辑的服务 yaml 看起来像这样:

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  annotations:
    client.knative.dev/user-image: interledger4j/hermes-server:latest
    run.googleapis.com/client-name: cloud-console
  creationTimestamp: '2020-01-09T00:02:29Z'
  generation: 3
  name: hermes-grpc
  namespace: default
  selfLink: /apis/serving.knative.dev/v1alpha1/namespaces/default/services/hermes-grpc
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/maxScale: '2'
        autoscaling.knative.dev/minScale: '1'
        run.googleapis.com/client-name: cloud-console
    spec:
      containerConcurrency: 80
      containers:
        image: interledger4j/hermes-server:latest
        name: user-container
        ports:
          - name: h2c
            containerPort: 6565
        readinessProbe:
          successThreshold: 1
        resources:
          limits:
            cpu: 500m
            memory: 384Mi
      timeoutSeconds: 300
  traffic:
  - latestRevision: true
    percent: 100

【讨论】:

【参考方案2】:

https://github.com/knative/docs/blob/master/docs/serving/samples/grpc-ping-go/README.md

描述如何配置命名端口以使 HTTP/2 工作

【讨论】:

这并没有描述如何在 Cloud Run 上或者甚至在 GCP 上使用负载均衡器来做到这一点。 Cloud Run on Anthos 会生成所有 K8 部署内容,您无法手动对其进行编辑。 @wlhee 链接的示例有一个示例 YAML 文件,您可以在其中使用 name: h2c 编辑 ports 部分。另一个例子在这里:knative.tips/networking/http2 你们不明白。 Cloud Run 会生成 k8 文件。没有编辑 k8 yaml 文件。甚至不可能。这个问题专门针对 CLOUD RUN。 您的意思是无法使用 yank 文件部署到 Cloud Run 吗? Cloud Run Anthos 和完全托管都接受 yaml 规范 gcloud beta 运行服务替换 cloud.google.com/sdk/gcloud/reference/beta/run/services/replace

以上是关于配置 Cloud Run on Anthos 以转发 HTTP2的主要内容,如果未能解决你的问题,请参考以下文章

Docker 映像在本地部署,但在 Google Cloud Run 上失败

如何在 Cloud Run 中使用环境变量进行持续实施?

Google Cloud Run - 域映射卡在证书配置中

SAP Analytics Cloud和Cloud for Customer之间的Single Sign on配置

Cloud Scheduler 调用 Cloud Run 服务的身份验证

具有 Cloud Run 和 Cloud Firestore 的 Spring Boot 应用程序