本页介绍如何将 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 文档执行以下操作:
- 整理您的配置文件。
- 创建
app.yaml
配置文件 - 如果您的应用基于微服务,请参阅部署多个服务应用文档,以了解如何为每项服务配置
app.yaml
文件。
您可以使用 gcloud app deploy
命令将 API 部署到 App Engine。此命令会使用 Container Builder 服务自动构建容器映像,然后将该映像部署到 App Engine 柔性环境。
部署之前,请做好以下准备工作:
- Google Cloud 项目的所有者必须创建 App Engine 应用。
- 确保您的用户账号包含所需的权限。
Compute Engine
要让 Endpoints 管理您的 API,您必须为您的 API 安装和配置 ESP 以及后端服务器代码。您需要在 Compute Engine 虚拟机实例上安装 Docker,以便运行 Artifact Registry 中免费提供的 ESP Docker 映像。
部署之前,请做好以下准备工作:
下方概述了在将 API 和 ESP 部署到 Compute Engine 之前,您必须采取的步骤。一般来说,您需要执行在 Compute Engine 上运行后端服务器代码通常所需的全部步骤。
- 创建、配置并启动虚拟机实例。请参阅 Compute Engine 文档。
- 在虚拟机实例上安装 Docker 企业版 (EE) 或 Docker 社区版 (CE)。请参阅安装 Docker。
- 为后端服务器代码创建 Docker 容器。请参阅 Cloud Build 文档。
- 将容器推送到 Artifact Registry 或其他注册表。
- 确保您可以成功地执行以下操作:
- 连接到虚拟机实例。
- 运行 Docker 映像,以便在虚拟机实例上启动后端服务器。请参阅 Docker 运行参考。
- 向您的 API 发送请求。
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 上运行后端服务器代码通常所需的全部步骤。
- 将容器化应用部署到容器集群。GKE 文档中介绍的常规步骤包括:
- 将您的应用封装到 Docker 映像中。
- 将该映像上传到注册表。
- 创建容器集群。
- 将应用部署到集群。
- 在互联网上公开您的应用。
- 确保您可以成功地执行以下操作:
- 启动 API 的服务器。
- 向您的 API 发送请求。
部署 API 和 ESP
App Engine
要将 API 和 ESP 部署到 App Engine,请执行以下操作:
- 获取 API 的服务名称。这是您在 OpenAPI 文档的
host
字段中指定的名称。 - 修改
app.yaml
文件,并添加一个名为endpoints_api_service
的部分,该部分包含服务名称。您可以使用教程中的app.yaml
文件作为范本:Java Python Go PHP Ruby NodeJS 将
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
部分。 - 保存
app.yaml
文件。 - 将后端代码和 ESP 部署到 App Engine:
gcloud app deploy
由于您为 app.yaml
文件添加了 endpoints_api_service
部分,因此 gcloud app deploy
命令会将独立容器中的 ESP 部署到 App Engine 柔性环境中,并对 ESP 进行配置。所有请求流量均通过 ESP 路由。ESP 会将请求和响应代理到运行后端服务器代码的容器,或从运行后端服务器代码的容器代理请求和响应。
如果您需要将 ESP 配置为使用特定的配置 ID,请执行以下操作:
- 在
app.yaml
文件的endpoints_api_service
部分中,添加config_id
字段,并将其设置为特定的配置 ID。 - 移除
rollout_strategy: managed
,或者将rollout_strategy
设置为fixed
。fixed
选项可将 ESP 配置为使用您在config_id
中指定的服务配置。 - 重新部署您的 API 和 ESP:
gcloud app deploy
我们建议您不要将 ESP 配置为长期使用一个特定的配置 ID,因为如果您部署更新后的服务配置,则必须重启 ESP 才能使用新配置。
要移除特定的配置 ID,请执行以下操作:
- 从
app.yaml
文件中移除config_id
选项。 - 添加
rollout_strategy: managed
选项。 - 发出
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,请执行以下操作:
- 连接到虚拟机实例。将
INSTANCE_NAME
替换为虚拟机实例的名称。gcloud compute ssh INSTANCE_NAME
- 自行创建名为
esp_net
的容器网络:sudo docker network create --driver bridge esp_net
- 运行后端服务器代码的映像实例,并将其连接到
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
替换为映像名称。
- 将
- 获取 API 的服务名称。这是您在 OpenAPI 文档的
host
字段中指定的名称。 - 运行 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,请执行以下操作:
- 添加
--version
选项,并将其设置为特定的配置 ID。 - 移除
--rollout_strategy=managed
选项,或者将--rollout_strategy
设置为fixed
。fixed
选项可将 ESP 配置为使用您在--version
中指定的服务配置。 - 再次发出
docker run
命令。
如果您同时指定 --rollout_strategy=managed
和 --version
选项,ESP 会以您在 --version
中指定的配置启动,但之后会在托管模式下运行并获取最新配置。
我们建议您不要将 ESP 配置为长期使用一个特定的配置 ID,因为如果您部署更新后的服务配置,则必须重启 ESP 才能使用新配置。
要移除特定的配置 ID,请执行以下操作:
- 在
docker run
的 ESP 标志中,移除--version
选项。 - 添加
--rollout_strategy=managed
选项。 - 发出
docker run
命令以重启 ESP。
如需查看在启动 ESP 时可以指定的选项的完整列表,请参阅 ESP 启动选项。
GKE
要将 ESP 部署到 GKE,请执行以下操作:
- 获取 API 的服务名称(这是您在 OpenAPI 文档的
host
字段中指定的名称)。 - 打开您的部署清单文件(即
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 使用。 - 使用 kubectl create 命令启动 Kubernetes 服务:
kubectl create -f deployment.yaml
如果您需要将 ESP 配置为使用特定的配置 ID,请执行以下操作:
- 在部署清单文件中,添加
--version
选项,并将其设置为特定的配置 ID。 - 移除
--rollout_strategy=managed
,或者将--rollout_strategy
设置为fixed
。fixed
选项可将 ESP 配置为使用您在--version
中指定的服务配置。 - 启动 Kubernetes 服务:
kubectl create -f deployment.yaml
如果您同时指定 --rollout_strategy=managed
和 --version
选项,ESP 会以您在 --version
中指定的配置启动,但之后会在托管模式下运行并获取最新配置。
我们建议您不要将 ESP 配置为长期使用一个特定的配置 ID,因为如果您部署更新后的服务配置,则必须重启 ESP 才能使用新配置。
要移除特定的配置 ID,请执行以下操作:
- 在部署清单文件中,移除
--version
选项。 - 添加
--rollout_strategy=managed
。 - 启动 Kubernetes 服务:
kubectl create -f deployment.yaml
如需查看在启动 ESP 时可以指定的选项的完整列表,请参阅 ESP 启动选项。
跟踪 API 活动
在部署 ESP 和 API 后端后,您可以使用 curl
或 Postman 等工具向 API 发送请求。如果未成功收到响应,请参阅排查响应错误。
在发送一些请求后,您可以:
在 Endpoints > 服务中查看 API 的活动图表。
请求可能需要一些时间才能体现在图表中。在 Cloud Logging 页面中查看您的 API 的请求日志。
后续步骤
- 排查 App Engine 柔性环境部署问题。
- 排查 Compute Engine 上的 Endpoints 问题。
- 排查 Google Kubernetes Engine 中的 Endpoints 问题。