Проблемы, возникающие при вызове службы gRPC в GKE (облачные конечные точки и ESP) из браузера (grpc-web) - PullRequest
0 голосов
/ 10 июля 2019

Введение в проблему
У меня есть служба gRPC, которая работает в GKE.Я использую облачные конечные точки и имею ESP (Extensible Service Proxy) перед ним, который я хочу использовать для обработки аутентификации (токены 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, но решил, что мне нужны функции конечных точек.С этим и множеством ошибок я получил все аргументы Cors для ESP.

А вот конфиг с настройками аутентификации

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 голосов
/ 10 июля 2019

Не уверен, почему вы использовали очень старую версию ESP. В файле yaml для развертывания GKE вы использовали 1.16.0. Если вы удалите «.16.0», используя только «gcr.io/endpoints-release/endpoints-runtime:1», он подберет последнюю версию ESP, которая на данный момент составляет 1.35.0.

Я могу помочь вам отладить его, если вы используете последнюю версию ESP с флагом --enable_debug. Журнал отладки ESP будет находиться внутри контейнера ESP в /var/log/nginx/error.log

Не могли бы вы открыть номер здесь ? пост отладочный журнал там. Спасибо.

Также опубликуйте свой сервисный конфиг тоже. (вы можете получить конфигурацию службы с помощью "описания конфигураций конечных точек gcloud")

...