本教程将介绍如何利用 Google Kubernetes Engine (GKE) 上的 Extensible Service Proxy (ESP) 部署简单的示例 gRPC 服务。本教程使用 Python 版本的 bookstore-grpc 示例。如需其他语言的 gRPC 示例,请参阅后续步骤部分。
本教程使用了示例代码和 ESP 的预构建容器映像,这些映像存储在 Artifact Registry 中。如果您不熟悉容器,请参阅以下内容了解详情:
如需大致了解 Cloud Endpoints,请参阅 Endpoints 简介和 Endpoints 架构。
目标
学习本教程时,请使用以下概要任务列表。为确保请求成功发送到 API,您必须完成所有任务。
- 设置 Google Cloud 项目,然后下载所需的软件。请参阅准备工作。
- 复制并配置 bookstore-grpc示例中的文件。请参阅配置 Endpoints。
- 部署 Endpoints 配置以创建 Endpoints 服务。请参阅部署 Endpoints 配置。
- 创建后端,以提供 API 并部署 API。请参阅部署 API 后端。
- 获取服务的外部 IP 地址。请参阅获取服务的外部 IP 地址。
- 向 API 发送请求。请参阅向 API 发送请求。
- 避免您的 Google Cloud 账号产生费用。 请参阅清理。
费用
在本文档中,您将使用 Google Cloud的以下收费组件:
 
 
 
  如需根据您的预计使用量来估算费用,请使用价格计算器。
  
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- 
    
    
      In the Google Cloud console, on the project selector page, select or create a Google Cloud project. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 
    
    
      In the Google Cloud console, on the project selector page, select or create a Google Cloud project. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 记下 Google Cloud 项目 ID,稍后需要用到。
- 安装并初始化 Google Cloud CLI。
- 更新 gcloud CLI 并安装 Endpoints 组件。gcloud components update 
- 确保 Google Cloud CLI (gcloud) 有权访问您在 Google Cloud上的数据和服务:gcloud auth login 
- 将默认项目设置为您的项目 ID。gcloud config set project YOUR_PROJECT_ID 将 YOUR_PROJECT_ID 替换为您的项目 ID。 如果您有其他 Google Cloud 项目,并且想使用 gcloud来管理这些项目,请参阅管理 gcloud CLI 配置。
- 安装 kubectl:gcloud components install kubectl 
- 获取新用户凭据以用作应用的默认凭据。需要用户凭据才能授权 kubectl。gcloud auth application-default login 
- 按照 gRPC Python 快速入门中的步骤安装 gRPC 和 gRPC 工具。
配置 Endpoints
bookstore-grpc 示例包含您需要在本地复制和配置的文件。
- 通过服务 .proto文件创建一个独立的 protobuf 描述符文件:- 保存示例代码库中 bookstore.proto的副本。此文件用于定义 Bookstore 服务的 API。
- 创建以下目录:mkdir generated_pb2
- 使用 protocProtocol Buffers 编译器创建描述符文件api_descriptor.pb。在您保存了bookstore.proto的目录中运行以下命令:python -m grpc_tools.protoc \ --include_imports \ --include_source_info \ --proto_path=. \ --descriptor_set_out=api_descriptor.pb \ --python_out=generated_pb2 \ --grpc_python_out=generated_pb2 \ bookstore.proto 在前面的命令中, --proto_path设置为当前工作目录。在 gRPC 编译环境中,如果对.proto输入文件使用其他目录,请更改--proto_path,以便编译器搜索您保存了bookstore.proto文件的目录。
 
- 保存示例代码库中 
- 创建 gRPC API 配置 YAML 文件:- 保存 api_config.yaml文件的副本。此文件用于定义 Bookstore 服务的 gRPC API 配置。
- 将 api_config.yaml文件中的 MY_PROJECT_ID 替换为您的 Google Cloud 项目 ID。例如:# # Name of the service configuration. # name: bookstore.endpoints.example-project-12345.cloud.goog 请注意,此文件中 apis.name字段的值应该与.proto文件中的完全限定 API 名称完全匹配;否则部署将无法正常运行。Bookstore 服务是在endpoints.examples.bookstore包内的bookstore.proto中定义的。其完全限定的 API 名称为endpoints.examples.bookstore.Bookstore,与其在api_config.yaml文件中的名称相同。apis: - name: endpoints.examples.bookstore.Bookstore 
 
- 保存 
如需了解详情,请参阅配置 Endpoints。
部署 Endpoints 配置
如需部署 Endpoints 配置,请使用 gcloud endpoints services deploy 命令。此命令使用 Service Management 创建一项托管式服务。
- 确保您位于 api_descriptor.pb和api_config.yaml文件所在的目录中。
- 确认 gcloud命令行工具当前使用的默认项目是您要向其部署 Endpoints 配置的 Google Cloud 项目。验证从以下命令返回的项目 ID,以确保不会在错误的项目中创建服务。gcloud config list project 如果您需要更改默认项目,请运行以下命令: gcloud config set project YOUR_PROJECT_ID 
- 使用 Google Cloud CLI 部署 proto descriptor文件和配置文件:gcloud endpoints services deploy api_descriptor.pb api_config.yaml 在创建和配置服务时,Service Management 会向终端输出信息。部署完成后,系统将显示如下所示的消息: Service Configuration [CONFIG_ID] uploaded for service [bookstore.endpoints.example-project.cloud.goog] CONFIG_ID 是部署创建的唯一 Endpoints 服务配置 ID。例如: Service Configuration [2017-02-13r0] uploaded for service [bookstore.endpoints.example-project.cloud.goog] 在前面的示例中, 2017-02-13r0是服务配置 ID,bookstore.endpoints.example-project.cloud.goog是服务名称。服务配置 ID 由日期戳后跟一个修订版本号组成。如果您在同一天再次部署 Endpoints 配置,服务配置 ID 中的修订版本号将递增。
检查所需服务
Endpoints 和 ESP 至少需要启用以下 Google 服务:| 姓名 | 标题 | 
|---|---|
| servicemanagement.googleapis.com | Service Management API | 
| servicecontrol.googleapis.com | Service Control API | 
在大多数情况下,gcloud endpoints services deploy 命令会启用这些必需的服务。但在以下情况下,gcloud 命令会成功完成,但不启用必需的服务:
- 您使用了 Terraform 之类的第三方应用,但未添加这些服务。 
- 您将 Endpoints 配置部署到已明确停用这些服务的现有Google Cloud 项目。 
使用以下命令确认必需服务是否已启用:
gcloud services list
如果您没有看到列出的必需服务,请启用它们:
gcloud services enable servicemanagement.googleapis.com
gcloud services enable servicecontrol.googleapis.com同时启用 Endpoints 服务:
gcloud services enable ENDPOINTS_SERVICE_NAME
要确定 ENDPOINTS_SERVICE_NAME,您可以执行以下任一操作:
- 部署 Endpoints 配置后,前往 Cloud 控制台中的 Endpoints 页面。服务名称列下显示了可能的 ENDPOINTS_SERVICE_NAME 列表。 
- 对于 OpenAPI,ENDPOINTS_SERVICE_NAME 是您在 OpenAPI 规范的 - host字段中指定的值。对于 gRPC,ENDPOINTS_SERVICE_NAME 是您在 gRPC Endpoints 配置的- name字段中指定的值。
如需详细了解 gcloud 命令,请参阅 gcloud 服务。
如果您收到错误消息,请参阅排查 Endpoints 配置部署问题。
如需了解更多信息,请参阅部署 Endpoints 配置。
部署 API 后端
目前,您已将服务配置部署到 Service Management,但尚未部署将提供 API 后端的代码。本部分介绍了如何创建 GKE 集群以托管 API 后端,以及如何部署 API。
创建容器集群
要为我们的示例创建容器集群,请执行以下操作:
- 在 Google Cloud 控制台中,前往“Kubernetes 集群”页面。
 
- 点击创建集群。
- 接受默认设置,然后点击创建。请记下集群的名称和区域,本教程后面部分需要用到这些信息。
将 kubectl 向容器集群进行身份验证
要使用 kubectl 创建和管理集群资源,您需要获取集群凭据并将其提供给 kubectl。为此,请运行以下命令:将 NAME 替换为新的集群名称,将 ZONE 替换为其集群区域。
gcloud container clusters get-credentials NAME --zone ZONE
检查所需权限
ESP 和 ESPv2 会调用 Google 服务,这些服务使用 IAM 来验证调用身份是否具有足够的权限来访问使用的 IAM 资源。调用身份是部署 ESP 和 ESPv2 的关联服务账号。
部署在 GKE pod 中时,关联的服务账号是节点服务账号。它通常是 Compute Engine 默认服务账号。请按照此权限建议选择合适的节点服务账号。
如果使用 Workload Identity,则可以使用节点服务账号以外的其他服务账号来与 Google 服务通信。 您可以为 pod 创建一个 Kubernetes 服务账号以运行 ESP 和 ESPv2,创建一个 Google 服务账号并将 Kubernetes 服务账号与该 Google 服务账号相关联。
按照这些步骤将 Kubernetes 服务账号与 Google 服务账号相关联。 此 Google 服务账号是关联的服务账号。
如果关联的服务账号是项目的 Compute Engine 默认服务账号,并且端点服务配置部署在同一项目中,则服务账号应具有足够的权限来访问 IAM 资源,您可以跳过以下 IAM 角色设置步骤。否则,应将以下 IAM 角色添加到关联的服务账号。
添加所需的 IAM 角色:
本部分介绍 ESP 和 ESPv2 使用的 IAM 资源,以及关联的服务账号访问这些资源所需的 IAM 角色。
端点服务配置
ESP 和 ESPv2 调用使用端点服务配置的 Service Control。端点服务配置是 IAM 资源,ESP 和 ESPv2 需要 Service Controller 角色才能访问它。
IAM 角色属于端点服务配置,而非项目。一个项目可能有多个端点服务配置。
使用以下 gcloud 命令将角色添加到端点服务配置的关联服务账号。
gcloud endpoints services add-iam-policy-binding SERVICE_NAME \ --member serviceAccount:SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com \ --role roles/servicemanagement.serviceController
其中
* SERVICE_NAME 是端点服务名称
* SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com 是关联的服务账号。
Cloud Trace
ESP 和 ESPv2 调用 Cloud Trace 服务以将 Trace 导出到项目。此项目称为跟踪项目。在 ESP 中,跟踪项目和拥有端点服务配置的项目是相同的。在 ESPv2 中,跟踪项目可通过 --tracing_project_id 标志指定,默认为部署项目。
ESP 和 ESPv2 需要 Cloud Trace Agent 角色才能启用 Cloud Trace。
使用以下 gcloud 命令将该角色添加到关联的服务账号:
gcloud projects add-iam-policy-binding TRACING_PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtrace.agent
其中
* TRACING_PROJECT_ID 是跟踪项目 ID
* SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com是关联的服务账号。如需了解详情,请参阅
  什么是角色和权限?
将示例 API 和 ESP 部署到集群
如需将示例 gRPC 服务部署到集群,以便客户端能够使用该服务,请执行以下操作:
- 保存 grpc-bookstore.yaml 部署清单文件的副本,并打开进行修改。
- 将 SERVICE_NAME 替换为 Endpoints 服务的名称。此名称与您在 api_config.yaml文件的name字段中配置的名称相同。--rollout_strategy=managed选项可将 ESP 配置为使用最新部署的服务配置。指定此选项后,在部署新的服务配置后,ESP 最多会在 5 分钟内检测到更改并自动开始使用该服务配置。建议您指定此选项,而不是指定特定配置 ID 供 ESP 使用。如需详细了解 ESP 参数,请参阅 ESP 启动选项。例如: spec: containers: - name: esp image: gcr.io/endpoints-release/endpoints-runtime:1 args: [ "--http2_port=9000", "--service=bookstore.endpoints.example-project-12345.cloud.goog", "--rollout_strategy=managed", "--backend=grpc://127.0.0.1:8000" ]
- 启动服务:kubectl create -f grpc-bookstore.yaml 
如果收到错误消息,请参阅排查 GKE 中的 Endpoints 问题。
获取服务的外部 IP 地址
如需向示例 API 发送请求,您需要具备服务的外部 IP 地址。在容器中启动服务后,外部 IP 地址可能需要过几分钟才可以使用。
- 查看外部 IP 地址: - kubectl get service 
- 记下 - EXTERNAL-IP的值并将其保存在 SERVER_IP 环境变量中。外部 IP 地址用于将请求发送到示例 API。- export SERVER_IP=YOUR_EXTERNAL_IP 
向 API 发送请求
要向示例 API 发送请求,您可以使用以 Python 编写的示例 gRPC 客户端。
- 克隆托管 gRPC 客户端代码的 Git 代码库: - git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git 
- 切换您的工作目录: - cd python-docs-samples/endpoints/bookstore-grpc/ 
- 安装依赖项: - pip install virtualenv- virtualenv env- source env/bin/activate- python -m pip install -r requirements.txt
- 向示例 API 发送一个请求: - python bookstore_client.py --host SERVER_IP --port 80 - 在 Endpoints > 服务页面中查看 API 的活动图表。 
 - 请求可能需要一些时间才能体现在图表中。 
- 在“日志浏览器”页面中查看 API 的请求日志。 
 
 
如果未成功收到响应,请参阅排查响应错误。
您刚刚在 Endpoints 中部署并测试了一个 API!
清除数据
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
- 删除 API: - gcloud endpoints services delete SERVICE_NAME - 将 SERVICE_NAME 替换为您的 API 名称。 
- 删除 GKE 集群: - gcloud container clusters delete NAME --zone ZONE