部署 API 后端

本页介绍如何将 API 的后端代码和 Extensible Service Proxy (ESP) 部署到 Google Kubernetes Engine、Compute Engine 和 App Engine 柔性环境。

尽管部署步骤因托管 API 的平台而异,但您始终需要执行的一个步骤是为 ESP 提供服务名称和一个可将 ESP 配置为使用最新部署的 Cloud Endpoints 服务配置的选项。通过此信息,ESP 可以获取 API 的 Endpoints 配置,这使得 ESP 可以代理请求和响应,从而让 Endpoints 能够管理您的 API。

前提条件

首先,本页假定您已完成以下操作:

部署前的准备工作

App Engine

在额外执行少许配置步骤(如以下步骤中所述)后,部署 API(以使其由 Endpoints 管理)的方法与向 App Engine 柔性环境部署任何应用的方法是相同的。请按照 App Engine 文档执行以下操作:

您可以使用 gcloud app deploy 命令将 API 部署到 App Engine。此命令会使用 Container Builder 服务自动构建容器映像,然后将该映像部署到 App Engine 柔性环境。

部署之前,请做好以下准备工作:

Compute Engine

要让 Endpoints 管理您的 API,您必须为您的 API 安装和配置 ESP 以及后端服务器代码。您需要在 Compute Engine 虚拟机实例上安装 Docker,以便运行 Artifact Registry 中免费提供的 ESP Docker 映像。

部署之前,请做好以下准备工作:

下方概述了在将 API 和 ESP 部署到 Compute Engine 之前,您必须采取的步骤。一般来说,您需要执行在 Compute Engine 上运行后端服务器代码通常所需的全部步骤。

  1. 创建、配置并启动虚拟机实例。请参阅 Compute Engine 文档
  2. 在虚拟机实例上安装 Docker 企业版 (EE) 或 Docker 社区版 (CE)。请参阅安装 Docker
  3. 为后端服务器代码创建 Docker 容器。请参阅 Cloud Build 文档
  4. 将容器推送到 Artifact Registry 或其他注册表。
  5. 确保您可以成功地执行以下操作:

GKE

在 Google Cloud 控制台中创建集群时,向集群服务账号授予的 OAuth 范围默认包含 Endpoints 所需的范围:

  • Service Control:已启用
  • Service Management:只读

使用 gcloud container clusters create 命令或第三方配置文件创建集群时,请务必指定以下范围:

  • "https://www.googleapis.com/auth/servicecontrol"
  • "https://www.googleapis.com/auth/service.management.readonly"

如需了解详情,请参阅什么是访问范围?

部署之前,请做好以下准备工作:

在向部署清单文件添加一小部分内容后,您可以运行容器集群上的 ESP Docker 映像以及您的容器化应用。下面概述了在将 API 和 ESP 部署到 GKE 之前必须执行的步骤。一般来说,您需要执行在 GKE 上运行后端服务器代码通常所需的全部步骤。

  1. 将容器化应用部署到容器集群。GKE 文档中介绍的常规步骤包括:
    1. 将您的应用封装到 Docker 映像中。
    2. 将该映像上传到注册表。
    3. 创建容器集群。
    4. 将应用部署到集群。
    5. 在互联网上公开您的应用。
  2. 确保您可以成功地执行以下操作:
    • 启动 API 的服务器。
    • 向您的 API 发送请求。

部署 API 和 ESP

App Engine

要将 API 和 ESP 部署到 App Engine,请执行以下操作:

  1. 获取 API 的服务名称。这是您在 OpenAPI 文档的 host 字段中指定的名称。
  2. 修改 app.yaml 文件,并添加一个名为 endpoints_api_service 的部分,该部分包含服务名称。您可以使用教程中的 app.yaml 文件作为范本:
    Java
    endpoints_api_service:
      # The following values are to be replaced by information from the output of
      # 'gcloud endpoints services deploy openapi-appengine.yaml' command.
      name: ENDPOINTS-SERVICE-NAME
      rollout_strategy: managed
    Python
    endpoints_api_service:
      # The following values are to be replaced by information from the output of
      # 'gcloud endpoints services deploy openapi-appengine.yaml' command.
      name: ENDPOINTS-SERVICE-NAME
      rollout_strategy: managed
    Go
    endpoints_api_service:
      # The following values are to be replaced by information from the output of
      # 'gcloud endpoints services deploy openapi-appengine.yaml' command.
      name: ENDPOINTS-SERVICE-NAME
      rollout_strategy: managed
    PHP
    endpoints_api_service:
      # The following values are to be replaced by information from the output of
      # 'gcloud endpoints services deploy openapi-appengine.yaml' command. If you have
      # previously run the deploy command, you can list your existing configuration
      # ids using the 'configs list' command as follows:
      #
      #     gcloud endpoints configs list --service=YOUR-PROJECT-ID.appspot.com
      #
      name: ENDPOINTS-SERVICE-NAME
      rollout_strategy: managed
    Ruby
    endpoints_api_service:
      # The following values are to be replaced by information from the output of
      # 'gcloud endpoints services deploy openapi-appengine.yaml' command.
      name: ENDPOINTS-SERVICE-NAME
      rollout_strategy: managed
    NodeJS
    endpoints_api_service:
      # The following values are to be replaced by information from the output of
      # 'gcloud endpoints services deploy openapi-appengine.yaml' command.
      name: ENDPOINTS-SERVICE-NAME
      rollout_strategy: managed

    ENDPOINTS-SERVICE-NAME 替换为 API 的服务名称。 例如:

    endpoints_api_service:
      name: example-project-12345.appspot.com
      rollout_strategy: managed
      

    rollout_strategy: managed 选项可将 ESP 配置为使用最新部署的服务配置。指定此选项后,在部署新的服务配置后,ESP 最多会在 5 分钟内检测到更改并自动开始使用该服务配置。建议您指定此选项,而非让 ESP 使用特定的配置 ID。

    如果您的应用基于微服务,您必须在每个 app.yaml 文件中添加 endpoints_api_service 部分。

  3. 保存 app.yaml 文件。
  4. 将后端代码和 ESP 部署到 App Engine:
    gcloud app deploy

由于您为 app.yaml 文件添加了 endpoints_api_service 部分,因此 gcloud app deploy 命令会将独立容器中的 ESP 部署到 App Engine 柔性环境中,并对 ESP 进行配置。所有请求流量均通过 ESP 路由。ESP 会将请求和响应代理到运行后端服务器代码的容器,或从运行后端服务器代码的容器代理请求和响应。

如果您需要将 ESP 配置为使用特定的配置 ID,请执行以下操作:

  1. app.yaml 文件的 endpoints_api_service 部分中,添加 config_id 字段,并将其设置为特定的配置 ID
  2. 移除 rollout_strategy: managed,或者将 rollout_strategy 设置为 fixedfixed 选项可将 ESP 配置为使用您在 config_id 中指定的服务配置。
  3. 重新部署您的 API 和 ESP:gcloud app deploy

我们建议您不要将 ESP 配置为长期使用一个特定的配置 ID,因为如果您部署更新后的服务配置,则必须重启 ESP 才能使用新配置。

要移除特定的配置 ID,请执行以下操作:

  1. app.yaml 文件中移除 config_id 选项。
  2. 添加 rollout_strategy: managed 选项。
  3. 发出 gcloud app deploy 命令

使用 rollout_strategy: managed 选项时,请勿在 app.yaml 文件中添加 config_id: YOUR_SERVICE_CONFIG_ID。如果添加,gcloud app deploy 将失败并显示以下错误消息:

config_id is forbidden when rollout_strategy is set to "managed".

当您首次将 API 部署到 App Engine 柔性环境时,由于需要设置虚拟机和其他基础架构,因此可能会出现延迟。如需了解其他信息,请参阅 App Engine 文档中的确保成功部署

Compute Engine

要通过 Docker 将 API 与 ESP 部署到 Compute Engine,请执行以下操作:

  1. 连接到虚拟机实例。将 INSTANCE_NAME 替换为虚拟机实例的名称。
    gcloud compute ssh INSTANCE_NAME
  2. 自行创建名为 esp_net 的容器网络:
    sudo docker network create --driver bridge esp_net
  3. 运行后端服务器代码的映像实例,并将其连接到 esp_net 容器网络:
    sudo docker run \
        --detach \
        --name=YOUR_API_CONTAINER_NAME \
        --net=esp_net \
        gcr.io/YOUR_PROJECT_ID/YOUR_IMAGE:1.0
    • YOUR_API_CONTAINER_NAME 替换为容器名称。
    • YOUR_PROJECT_ID 替换为您在推送映像时使用的 Google Cloud 项目 ID。
    • YOUR_IMAGE 替换为映像名称。
  4. 获取 API 的服务名称。这是您在 OpenAPI 文档的 host 字段中指定的名称。
  5. 运行 ESP Docker 映像的实例:
    sudo docker run \
        --name=esp \
        --detach \
        --publish=80:8080 \
        --net=esp_net \
        gcr.io/endpoints-release/endpoints-runtime:1 \
        --service=SERVICE_NAME \
        --rollout_strategy=managed \
        --backend=YOUR_API_CONTAINER_NAME:8080
    • SERVICE_NAME 替换为服务的名称。
    • YOUR_API_CONTAINER_NAME 替换为 API 的容器名称。

    --rollout_strategy=managed 选项可将 ESP 配置为使用最新部署的服务配置。指定此选项后,在部署新的服务配置后,ESP 最多会在 5 分钟内检测到更改并自动开始使用该服务配置。建议您指定此选项,而非让 ESP 使用特定的配置 ID。

如果您需要将 ESP 配置为使用特定的配置 ID,请执行以下操作:

  1. 添加 --version 选项,并将其设置为特定的配置 ID
  2. 移除 --rollout_strategy=managed 选项,或者将 --rollout_strategy 设置为 fixedfixed 选项可将 ESP 配置为使用您在 --version 中指定的服务配置。
  3. 再次发出 docker run 命令。

如果您同时指定 --rollout_strategy=managed--version 选项,ESP 会以您在 --version 中指定的配置启动,但之后会在托管模式下运行并获取最新配置。

我们建议您不要将 ESP 配置为长期使用一个特定的配置 ID,因为如果您部署更新后的服务配置,则必须重启 ESP 才能使用新配置。

要移除特定的配置 ID,请执行以下操作:

  1. docker run 的 ESP 标志中,移除 --version 选项。
  2. 添加 --rollout_strategy=managed 选项。
  3. 发出 docker run 命令以重启 ESP。

如需查看在启动 ESP 时可以指定的选项的完整列表,请参阅 ESP 启动选项

GKE

要将 ESP 部署到 GKE,请执行以下操作:

  1. 获取 API 的服务名称(这是您在 OpenAPI 文档的 host 字段中指定的名称)。
  2. 打开您的部署清单文件(即 deployment.yaml 文件),并将以下代码添加到 containers 部分:
    containers:
    - name: esp
      image: gcr.io/endpoints-release/endpoints-runtime:1
      args: [
        "--http_port=8081",
        "--backend=127.0.0.1:8080",
        "--service=SERVICE_NAME",
        "--rollout_strategy=managed"
      ]

    SERVICE_NAME 替换为 API 的服务名称。

    --rollout_strategy=managed" 选项可将 ESP 配置为使用最新部署的服务配置。指定此选项后,在部署新的服务配置后,ESP 最多会在 5 分钟内检测到更改并自动开始使用该服务配置。建议您指定此选项,而不是指定特定配置 ID 供 ESP 使用。

  3. 使用 kubectl create 命令启动 Kubernetes 服务:
    kubectl create -f deployment.yaml

如果您需要将 ESP 配置为使用特定的配置 ID,请执行以下操作:

  1. 在部署清单文件中,添加 --version 选项,并将其设置为特定的配置 ID
  2. 移除 --rollout_strategy=managed,或者将 --rollout_strategy 设置为 fixedfixed 选项可将 ESP 配置为使用您在 --version 中指定的服务配置。
  3. 启动 Kubernetes 服务:kubectl create -f deployment.yaml

如果您同时指定 --rollout_strategy=managed--version 选项,ESP 会以您在 --version 中指定的配置启动,但之后会在托管模式下运行并获取最新配置。

我们建议您不要将 ESP 配置为长期使用一个特定的配置 ID,因为如果您部署更新后的服务配置,则必须重启 ESP 才能使用新配置。

要移除特定的配置 ID,请执行以下操作:

  1. 在部署清单文件中,移除 --version 选项。
  2. 添加 --rollout_strategy=managed
  3. 启动 Kubernetes 服务:kubectl create -f deployment.yaml

如需查看在启动 ESP 时可以指定的选项的完整列表,请参阅 ESP 启动选项

跟踪 API 活动

在部署 ESP 和 API 后端后,您可以使用 curl 或 Postman 等工具向 API 发送请求。如果未成功收到响应,请参阅排查响应错误

在发送一些请求后,您可以:

后续步骤