您基本上可以按照Getting started with gRPC on Compute Engine 指南中几乎相同的说明在容器优化操作系统上使用 ESP 部署您的 gRPC 服务器。在您的情况下,只需将 Container-Optimized OS 视为预安装 Docker 的操作系统(还有更多功能,但在您的情况下,只有这一个是有趣的)。
如果您想在 VM 实例启动时自动启动 Docker 容器(gRPC 服务器 + ESP),则可以使用 cloud-init。以下cloud-init.cfg 文件自动启动文档示例中提供的相同容器(使用bookstore sample app)。您可以将 Creating a Compute Engine instance 部分替换为两个步骤。
创建一个cloud-init 配置文件
使用以下内容创建cloud-init.cfg:
#cloud-config
runcmd:
- docker network create --driver bridge esp_net
- docker run
--detach
--name=bookstore
--net=esp_net
gcr.io/endpointsv2/python-grpc-bookstore-server:1
- docker run
--detach
--name=esp
--net=esp_net
--publish=80:9000
gcr.io/endpoints-release/endpoints-runtime:1
--service=bookstore.endpoints.<YOUR_PROJECT_ID>.cloud.goog
--rollout_strategy=managed
--http2_port=9000
--backend=grpc://bookstore:8000
在启动实例后,cloud-init 将读取此配置并:
- 创建 Docker 网络 (
esp_net)
- 运行 bookstore 容器
- 运行 ESP 容器。在此容器启动命令中,将
<YOUR_PROJECT_ID> 替换为您的项目 ID(或根据您的服务名称替换整个 --service 选项)
使用 Container-Optimized OS 创建 Compute Engine 实例
您可以从控制台创建实例,也可以通过命令行:
gcloud compute instances create instance-1 \
--zone=us-east1-b \
--machine-type=n1-standard-1 \
--tags=http-server,https-server \
--image=cos-73-11647-267-0 \
--image-project=cos-cloud \
--metadata-from-file user-data=cloud-init.cfg
--metadata-from-file 将使用cloud-init.cfg 的内容填充user-data 元数据。实例启动时将考虑此 cloud-init 配置。
您可以通过以下方式验证此作品:
- 通过 SSH 连接到
instance-1,然后运行 docker ps 以查看正在运行的容器(gRPC 服务器 + ESP)。您可能会在实例启动和两个容器启动之间遇到一些延迟
- 使用客户端调用您的 gRPC 服务。例如(始终使用文档中提供的书店应用程序):
INSTANCE_IP=$(gcloud compute instances describe instance-1 --zone us-east1-b --format="value(network_interfaces[0].accessConfigs.natIP)")
python bookstore_client.py --host $INSTANCE_IP --port 80 # returns a valid response
请注意,您也可以选择不使用cloud-init。您可以在具有容器优化操作系统的 VM 上直接运行 docker run 命令(与 cloud-init.cfg 文件中的命令相同),就像在任何其他操作系统上一样。