从浏览器(grpc-web)对GKE(云端点和ESP)上的gRPC服务进行调用时遇到的问题

时间:2019-07-09 21:06:20

标签: google-kubernetes-engine google-cloud-endpoints grpc-web

问题简介
我有一个在GKE中运行的gRPC服务。我正在使用Cloud Endpoints,并且在它前面有一个ESP(可扩展服务代理),我想使用它来处理身份验证(JWT令牌)。

这听起来是将所有这些工具集成在一起的一种非常不错的方法,但是在过去的两天里,我一直无法正常工作。在本地运行时,我可以完美连接并拨打电话,但是事实证明,通过ESP进行设置非常困难。

注意:我最终想打开http2端口,但是现在我的重点是获取浏览器支持,所以我只打开http端口

K8s部署和服务配置
我的服务正在运行并且正在运行,我正在使用此清单进行部署

apiVersion: v1
kind: Service
metadata:
  name: esp-grpc-environment
spec:
  ports:
  # Port that accepts gRPC and JSON/HTTP2 requests over HTTP.
  - port: 80
    targetPort: 9090
    protocol: TCP
    name: http2
  selector:
    app: esp-grpc-environment
  type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: esp-grpc-environment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: esp-grpc-environment
    spec:
      containers:
      - name: esp
        image: gcr.io/endpoints-release/endpoints-runtime:1.16.0
        args: [
          "--http_port=9090",
          "--service=environment.endpoints.olamai-d64a7.cloud.goog",
          "--rollout_strategy=managed",
          "--backend=grpc://127.0.0.1:8000",
          "--cors_preset=basic",
          "--cors_allow_headers=Keep-Alive,User-Agent,Cache-Control,Content-Type,Content-Transfer-Encoding,X-Accept-Content-Transfer-Encoding,X-Accept-Response-Streaming,X-User-Agent,X-Grpc-Web,Grpc-Timeout,Authorization,authorization",
          "--cors_expose_headers=grpc-status,grpc-message,authorization"
        ]
        ports:
          - containerPort: 9090
      - name: environment
        image: terrariumai/environment:0.0.1
        imagePullPolicy: Always
        ports:
          - containerPort: 8000

因此,我最初只是使用自己的nginx代理,但决定使用Endpoints的功能。有了这个和很多错误,我得到了ESP的所有Cors参数。

这是具有身份验证设置的配置

type: google.api.Service
config_version: 3

name: environment.endpoints.<project id>.cloud.goog
title: Environment gRPC API

apis:
  - name: endpoints.terrariumai.environment.Environment

authentication:
  providers:
    - id: firebase
      jwks_uri: https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com
      issuer: https://securetoken.google.com/<project-id>
  rules:
    - selector: "*"
      requirements:
        - provider_id: firebase

usage:
  rules:
    - selector: endpoints.terrariumai.environment.Environment.CreateEntity
      allow_unregistered_calls: true

使用Node / React拨打服务电话
因此,一旦运行并部署了该应用程序,我就可以使用我的React应用程序来运行该服务

import {
  CreateEntityRequest
} from "../api/environment_pb";

this.props.firebase
      .auth()
      .currentUser.getIdToken(/* forceRefresh */ true)
      .then(function(idToken) {
        var service = new EnvironmentClient(addr, null, null);
        var request = new CreateEntityRequest();
        var metadata = {
          authorization: `Bearer ${idToken}`
        };
        console.log(idToken);
        service.createEntity(request, metadata, (err, resp) => {
          if (err) {
            console.log("Got error: ", err);
          }
          console.log("Resp: ", resp);
        });
      })

然后,我得到这个错误

POST http://<external-ip>/endpoints.terrariumai.environment.Environment/CreateEntity 403 (Forbidden)

但是现在我很困惑。这是ESP窗格中的日志(我在阅读时遇到困难)

[09/Jul/2019:20:40:49 +0000] "POST /endpoints.terrariumai.environment.Environment/CreateEntity HTTP/1.1" 403 210 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"

在我看来,ESP似乎拒绝了呼叫并说它们被禁止(也许未通过身份验证?)。但是在这一点上,我很沮丧。我真的不知道在哪里进一步寻找。如有任何帮助,我们将不胜感激,如有必要,我们可以提供更多信息!

1 个答案:

答案 0 :(得分:0)

不知道为什么要使用非常老的ESP版本。在GKE部署yaml文件中,您使用的是1.16.0。如果您删除“ .16.0”,而仅使用“ gcr.io/endpoints-release/endpoints-runtime:1”,它将选择最新的ESP版本,目前为1.35.0。

如果您使用带有--enable_debug标志的最新ESP,我可以帮助您调试它。 ESP调试日志将位于/var/log/nginx/error.log

中的ESP容器内

您能打开一个问题here吗?在那边发布调试日志。谢谢。

也发布您的服务配置。 (您可以通过“ gcloud端点配置描述”获取服务配置)