设置 Compute Engine 虚拟机和无代理 gRPC 服务
本指南介绍了如何配置 Compute Engine 虚拟机主机、gRPC 应用以及 Cloud Service Mesh 所需的负载均衡组件。
在按照本指南中的说明执行操作之前,请参阅准备使用无代理 gRPC 服务设置 Cloud Service Mesh
概览
使用 Compute Engine 虚拟机 (VM) 和无代理 gRPC 服务设置 Cloud Service Mesh 涉及以下内容:
- 设置托管后端的代管实例组。
- 将后端配置为运行 gRPC 服务器,以返回
hello world
来响应来自客户端的请求。 - 使用代管式实例组和其他 Google Cloud 负载均衡组件配置 Cloud Service Mesh。
- 使用无代理 gRPC 客户端应用向 gRPC 服务器应用发送流量,以验证部署是否正常运行。
无代理 gRPC 客户端使用 xDS 连接到 Cloud Service Mesh。当客户端连接到 Cloud Service Mesh 时,Cloud Service Mesh 会向客户端发送与 hello world
服务关联的后端的信息。利用该信息,无代理 gRPC 客户端将请求发送到 hello world
gRPC 服务器。
为 Cloud Service Mesh 配置代管式实例组
根据部署需要,代管实例组使用自动扩缩来创建新的后端虚拟机。以下示例展示了如何执行以下操作:
- 使用通过 gRPC 协议提供
hello world
服务的示例服务来创建实例模板。 - 使用模板配置代管实例组。
创建实例模板
本部分介绍如何创建实例模板。在示例中,您将部署一个在端口 50051 上公开的 helloworld
gRPC 服务。
控制台
- 在 Google Cloud 控制台中,转到“实例模板”页面。
- 点击创建实例模板。
填写各个字段,如下所示:
- 名称:grpc-td-vm-template
- 启动磁盘版本:Debian/Linux 10
- 服务账号:Compute Engine 默认服务账号
- 访问权限范围:允许全面访问所有 Google Cloud API
在防火墙下方,选中允许 HTTP 流量和允许 HTTPS 流量旁边的复选框。
点击管理、安全、磁盘、网络、单独租用。
在管理标签页中,将以下脚本复制到启动脚本字段中。
#! /bin/bash set -e cd /root sudo apt-get update -y sudo apt-get install -y openjdk-11-jdk-headless curl -L https://github.com/grpc/grpc-java/archive/v1.37.0.tar.gz | tar -xz cd grpc-java-1.37.0/examples/example-hostname ../gradlew --no-daemon installDist # Server listens on 50051 sudo systemd-run ./build/install/hostname-server/bin/hostname-server
点击创建。
gcloud
创建实例模板。
gcloud compute instance-templates create grpc-td-vm-template \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=allow-health-checks \ --image-family=debian-10 \ --image-project=debian-cloud \ --metadata-from-file=startup-script=<(echo '#! /bin/bash set -e cd /root sudo apt-get update -y sudo apt-get install -y openjdk-11-jdk-headless curl -L https://github.com/grpc/grpc-java/archive/v1.37.0.tar.gz | tar -xz cd grpc-java-1.37.0/examples/example-hostname ../gradlew --no-daemon installDist # Server listens on 50051 sudo systemd-run ./build/install/hostname-server/bin/hostname-server')
创建代管实例组
在本部分中,您将使用在上一部分中创建的实例模板创建代管实例组。
控制台
- 转到 Google Cloud 控制台中的“实例组”页面。
- 点击创建实例组。默认情况下,您会看到用于创建代管实例组的页面。
- 输入
grpc-td-mig-us-central1
作为代管实例组的名称,然后选择us-central1-a
区域。 - 在实例模板下,选择您创建的实例模板
grpc-td-vm-template
。 - 将 2 指定为要在组中创建的实例数下限和上限。
- 点击创建。
gcloud
创建代管实例组。
gcloud compute instance-groups managed create grpc-td-mig-us-central1 \ --zone us-central1-a \ --size=2 \ --template=grpc-td-vm-template
配置已命名端口
在本部分中,您将为 gRPC 服务配置已命名端口。已命名端口是 gRPC 服务在其中侦听请求的端口。在此示例中,已命名端口是端口 50051。
控制台
- 转到 Google Cloud 控制台中的“实例组”页面。
- 点击您创建的实例组
grpc-td-mig-us-central1
的名称。 - 点击修改群组。
- 在端口名称字段中,输入
grpc-helloworld-port
。 - 在端口号字段中,输入
50051
。 - 点击保存。
gcloud
配置已命名端口。
gcloud compute instance-groups set-named-ports grpc-td-mig-us-central1 \ --named-ports=grpc-helloworld-port:50051 \ --zone us-central1-a
使用 Google Cloud 负载均衡组件配置 Cloud Service Mesh
本部分介绍如何使用适用于您的服务的 Google Cloud 负载均衡组件配置 Cloud Service Mesh。
创建健康检查、防火墙规则和后端服务
在本部分中,您将创建一个后端服务,其中使用负载均衡方案 INTERNAL_SELF_MANAGED
和协议 GRPC
,然后将健康检查和实例组与后端服务相关联。在此示例中,您将使用在创建代管实例组中创建的代管实例组。此代管实例组运行示例 gRPC 服务。--port-name
标志中的端口是您在配置已命名端口中创建的已命名端口。
gcloud
创建健康检查。
gcloud compute health-checks create grpc grpc-helloworld-health-check \ --use-serving-port
创建健康检查防火墙规则。
gcloud compute firewall-rules create grpc-vm-allow-health-checks \ --network default --action allow --direction INGRESS \ --source-ranges=35.191.0.0/16,130.211.0.0/22 \ --target-tags allow-health-checks \ --rules tcp:50051
创建后端服务。
gcloud compute backend-services create grpc-helloworld-service \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --protocol=GRPC \ --port-name=grpc-helloworld-port \ --health-checks=grpc-helloworld-health-check
将代管实例组添加到后端服务。
gcloud compute backend-services add-backend grpc-helloworld-service \ --instance-group grpc-td-mig-us-central1 \ --instance-group-zone us-central1-a \ --global
创建路由规则映射、目标代理和转发规则
在本部分中,您将创建网址映射、路径匹配器和主机规则,以根据主机名和路径路由服务的流量。以下示例使用 helloworld-gce
作为服务名称。gRPC 应用在连接到此服务时会在目标 URI 中使用此服务名称。默认情况下,路径匹配器会匹配此主机的所有路径请求 (/*
)。您还将创建目标 gRPC 代理和转发规则。
如需了解详情,请参阅路由规则映射。
在以下示例中,端口 80 是指定的端口。
gcloud
创建网址映射。
gcloud compute url-maps create grpc-vm-url-map \ --default-service grpc-helloworld-service
创建路径匹配器。
gcloud compute url-maps add-path-matcher grpc-vm-url-map \ --default-service grpc-helloworld-service \ --path-matcher-name grpc-vm-path-matcher \ --new-hosts helloworld-gce
创建目标 gRPC 代理。
gcloud compute target-grpc-proxies create grpc-vm-proxy \ --url-map grpc-vm-url-map \ --validate-for-proxyless
创建转发规则。
gcloud compute forwarding-rules create grpc-vm-forwarding-rule \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --address=0.0.0.0 --address-region=us-central1 \ --target-grpc-proxy=grpc-vm-proxy \ --ports 80 \ --network default
Cloud Service Mesh 现已配置为在网址映射中指定的服务中为代管式实例组中的后端进行流量负载均衡。
验证配置
配置过程完成后,验证您是否可以建立与先前创建的 Cloud Service Mesh 负载均衡服务的 gRPC 连接。
如需验证服务是否可用,请执行以下操作之一:
- 登录其中一个虚拟机主机(gRPC 服务后端),并验证 gRPC 服务是否正在侦听端口上运行。在本示例中,端口为 50051。
- 请查看 Cloud 控制台中的 Cloud Service Mesh 页面,获取已配置服务
helloworld-gce
的相关信息,并确认后端已报告为运行状况良好。 - 利用以下说明使用 Compute Engine gRPC 客户端进行验证。
使用 gRPC 客户端应用验证服务
在以下示例中,您使用所选语言的 gRPC 客户端或 grpcurl
工具测试 gRPC 服务。
首先,创建一个运行 gRPC 客户端以测试服务的客户端虚拟机。
gcloud compute instances create grpc-client \ --zone us-central1-a \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --image-family=debian-10 \ --image-project=debian-cloud \ --metadata-from-file=startup-script=<(echo '#! /bin/bash set -e export GRPC_XDS_BOOTSTRAP=/run/td-grpc-bootstrap.json # Expose bootstrap variable to SSH connections echo export GRPC_XDS_BOOTSTRAP=$GRPC_XDS_BOOTSTRAP | sudo tee /etc/profile.d/grpc-xds-bootstrap.sh # Create the bootstrap file curl -L https://storage.googleapis.com/traffic-director/td-grpc-bootstrap-0.16.0.tar.gz | tar -xz ./td-grpc-bootstrap-0.16.0/td-grpc-bootstrap | tee $GRPC_XDS_BOOTSTRAP')
设置环境变量和引导文件
客户端应用需要引导配置文件。上一部分中的启动脚本会设置 GRPC_XDS_BOOTSTRAP
环境变量,并使用帮助程序脚本生成引导文件。所生成引导文件中 TRAFFICDIRECTOR_GCP_PROJECT_NUMBER
、TRAFFICDIRECTOR_NETWORK_NAME
和 zone
的值将从知道 Compute Engine 虚拟机实例这些详细信息的元数据服务器获取。您可以使用 -gcp-project-number
和 -vpc-network-name
选项手动将这些值提供给帮助程序脚本。
如需验证配置,请登录客户端虚拟机并运行以下示例。
Java
如需使用 gRPC Java 客户端验证服务,请执行以下操作:
下载最新版本的 gRPC Java,然后使用最新的补丁程序并构建
xds-hello-world
客户端应用。sudo apt-get update -y sudo apt-get install -y openjdk-11-jdk-headless curl -L https://github.com/grpc/grpc-java/archive/v1.37.0.tar.gz | tar -xz cd grpc-java-1.37.0/examples/example-xds ../gradlew --no-daemon installDist
运行客户端,其中
world
是名称,xds:///helloworld-gce
是服务 URI。./build/install/example-xds/bin/xds-hello-world-client "world" \ xds:///helloworld-gce
Go
如需使用 gRPC Go 客户端验证服务,请执行以下操作:
下载最新版本的 gRPC Go,然后使用最新的补丁程序并构建
xds-hello-world
客户端应用。sudo apt-get update -y sudo apt-get install -y golang git curl -L https://github.com/grpc/grpc-go/archive/v1.37.0.tar.gz | tar -xz cd grpc-go-1.37.0/examples/features/xds/client go get google.golang.org/grpc@v1.37.0 go build .
运行客户端,其中
world
是名称,xds:///helloworld-gce
是服务 URI。./client "world" xds:///helloworld-gce
C++
如需使用 gRPC C++ 客户端验证服务,请执行以下操作:
下载最新版本的 gRPC C++ 以及最近的补丁程序,然后构建
helloworld
客户端示例。sudo apt-get update -y sudo apt-get install -y build-essential cmake git git clone --recurse-submodules -b v1.37.1 https://github.com/grpc/grpc cd grpc mkdir -p cmake/build pushd cmake/build cmake ../.. make sudo make install popd mkdir -p third_party/abseil-cpp/cmake/build pushd third_party/abseil-cpp/cmake/build cmake ../.. make sudo make install popd cd examples/cpp/helloworld mkdir -p cmake/build cd cmake/build/ cmake ../.. make
使用“xds:///helloworld-gce”作为服务 URI 运行客户端。
./greeter_client --target=xds:///helloworld-gce
grpcurl
如需使用 grpcurl
工具验证服务,请执行以下操作:
下载并安装
grpcurl
工具。curl -L https://github.com/fullstorydev/grpcurl/releases/download/v1.8.1/grpcurl_1.8.1_linux_x86_64.tar.gz | tar -xz
运行
grpcurl
工具,将“xds:///helloworld-gce”作为服务 URI,将helloworld.Greeter/SayHello
作为服务名称和要调用的方法。使用-d
选项传递SayHello
方法的参数。./grpcurl --plaintext \ -d '{"name": "world"}' \ xds:///helloworld-gce helloworld.Greeter/SayHello
Python
如需使用 gRPC Python 客户端验证服务,请运行以下命令。使用包含最新补丁程序的最新版 gRPC。
sudo apt-get update sudo apt-get -y install python3-pip sudo pip3 install virtualenv curl -L https://github.com/grpc/grpc/archive/v1.37.1.tar.gz | tar -xz cd grpc-1.37.1/examples/python/xds virtualenv venv -p python3 source venv/bin/activate pip install -r requirements.txt python client.py xds:///helloworld-gce
Ruby
如需使用 gRPC Ruby 客户端验证服务,请运行以下命令。使用包含最新补丁程序的最新版 gRPC。
sudo apt-get update sudo apt-get install -y ruby-full sudo gem install grpc curl -L https://github.com/grpc/grpc/archive/v1.37.1.tar.gz | tar -xz cd grpc-1.37.1/examples/ruby ruby greeter_client.rb john xds:///helloworld-gce
PHP
如需使用 gRPC PHP 客户端验证服务,请运行以下命令。使用包含最新补丁程序的最新版 gRPC。
sudo apt-get update sudo apt-get install -y php7.3 php7.3-dev php-pear phpunit python-all zlib1g-dev git sudo pecl install grpc curl -sS https://getcomposer.org/installer | php sudo mv composer.phar /usr/local/bin/composer curl -L https://github.com/grpc/grpc/archive/v1.37.1.tar.gz | tar -xz cd grpc-1.37.1 export CC=/usr/bin/gcc ./tools/bazel build @com_google_protobuf//:protoc ./tools/bazel build src/compiler:grpc_php_plugin cd examples/php composer install ./../../bazel-bin/external/com_google_protobuf/protoc --proto_path=../protos \ --php_out=. --grpc_out=. \ --plugin=protoc-gen-grpc=../../bazel-bin/src/compiler/grpc_php_plugin \ ../protos/helloworld.proto php -d extension=grpc.so greeter_client.php john xds:///helloworld-gce
Node.js
如需使用 gRPC Node.js 客户端验证服务,请运行以下命令。使用包含最新补丁程序的最新版 gRPC。
sudo apt-get update sudo apt-get install -y nodejs npm curl -L https://github.com/grpc/grpc/archive/v1.34.0.tar.gz | tar -xz cd grpc-1.34.0/examples/node/xds npm install node ./greeter_client.js --target=xds:///helloworld-gce
您应该会看到如下所示的输出,其中 INSTANCE_NAME
是虚拟机实例的名称:
Greeting: Hello world, from INSTANCE_HOSTNAME
这将验证无代理 gRPC 客户端是否已成功连接到 Cloud Service Mesh,并使用 xds
名称解析器了解 helloworld-gce
服务的后端。客户端向服务的其中一个后端发送请求,无需了解 IP 地址或执行 DNS 解析。
后续步骤
- 了解高级流量管理。
- 了解如何设置可观测性。
- 了解如何排查无代理 Cloud Service Mesh 部署的问题。