设置 Compute Engine 虚拟机和无代理 gRPC 服务

本指南介绍如何配置 Compute Engine 虚拟机主机、gRPC 应用以及 Traffic Director 所需的负载均衡组件。

在按照本指南中的说明执行操作之前,请参阅准备使用无代理 gRPC 服务设置 Traffic Director

概览

使用 Compute Engine 虚拟机 (VM) 和无代理 gRPC 服务设置 Traffic Director 涉及以下内容:

  1. 设置托管后端的代管实例组。
  2. 将后端配置为运行 gRPC 服务器,以返回 hello world 来响应来自客户端的请求。
  3. 使用代管实例组和其他 Google Cloud 负载均衡组件配置 Traffic Director。
  4. 使用无代理 gRPC 客户端应用向 gRPC 服务器应用发送流量,以验证部署是否正常运行。

无代理 gRPC 客户端使用 xDS 连接到 Traffic Director。当客户端连接到 Traffic Director 时,Traffic Director 会向客户端发送与 hello world 服务关联的后端的信息。利用该信息,无代理 gRPC 客户端将请求发送到 hello world gRPC 服务器。

为 Traffic Director 配置代管实例组

根据部署需要,代管实例组使用自动扩缩来创建新的后端虚拟机。以下示例展示了如何执行以下操作:

  • 使用通过 gRPC 协议提供 hello world 服务的示例服务来创建实例模板。
  • 使用模板配置代管实例组。

创建实例模板

本部分介绍如何创建实例模板。在示例中,您将部署一个在端口 50051 上公开的 helloworld gRPC 服务。

控制台

  1. 在 Google Cloud 控制台中,转到“实例模板”页面。

    转到“实例模板”页面

  2. 点击创建实例模板
  3. 填写各个字段,如下所示:

    • 名称:grpc-td-vm-template
    • 启动磁盘版本:Debian/Linux 10
    • 服务账号:Compute Engine 默认服务账号
    • 访问权限范围:允许全面访问所有 Google Cloud API
  4. 防火墙下方,选中允许 HTTP 流量允许 HTTPS 流量旁边的复选框。

  5. 点击管理、安全、磁盘、网络、单独租用

  6. 管理标签页中,将以下脚本复制到启动脚本字段中。

    #! /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
    
  7. 点击创建

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')

创建代管实例组

在本部分中,您将使用在上一部分中创建的实例模板创建代管实例组。

控制台

  1. 转到 Google Cloud 控制台中的“实例组”页面。

    转到“实例组”页面

  2. 点击创建实例组。默认情况下,您会看到用于创建代管实例组的页面。
  3. 输入 grpc-td-mig-us-central1 作为代管实例组的名称,然后选择 us-central1-a 区域。
  4. 实例模板下,选择您创建的实例模板 grpc-td-vm-template
  5. 将 2 指定为要在组中创建的实例数下限和上限。
  6. 点击创建

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。

控制台

  1. 转到 Google Cloud 控制台中的“实例组”页面。

    转到“实例组”页面

  2. 点击您创建的实例组 grpc-td-mig-us-central1 的名称。
  3. 点击修改群组
  4. 端口名称字段中,输入 grpc-helloworld-port
  5. 端口号字段中,输入 50051
  6. 点击保存

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 负载均衡组件配置 Traffic Director

本部分介绍如何使用适用于您的服务的 Google Cloud 负载均衡组件配置 Traffic Director。

创建健康检查、防火墙规则和后端服务

在本部分中,您将创建一个后端服务,其中使用负载均衡方案 INTERNAL_SELF_MANAGED 和协议 GRPC,然后将健康检查和实例组与后端服务相关联。在此示例中,您将使用在创建代管实例组中创建的代管实例组。此代管实例组运行示例 gRPC 服务。--port-name 标志中的端口是您在配置已命名端口中创建的已命名端口。

gcloud

  1. 创建健康检查。

    gcloud compute health-checks create grpc grpc-helloworld-health-check \
     --use-serving-port
    
  2. 创建健康检查防火墙规则。

    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
    
  3. 创建后端服务。

    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
    
  4. 将代管实例组添加到后端服务。

    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

  1. 创建网址映射。

    gcloud compute url-maps create grpc-vm-url-map \
      --default-service grpc-helloworld-service
    
  2. 创建路径匹配器。

    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
    
  3. 创建目标 gRPC 代理。

    gcloud compute target-grpc-proxies create grpc-vm-proxy \
     --url-map grpc-vm-url-map \
     --validate-for-proxyless
    
  4. 创建转发规则。

    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
    

Traffic Director 现已配置为在网址映射中指定的服务中为代管实例组中的后端进行流量负载平衡。

验证配置

配置过程完成后,验证您是否可以建立与先前创建的 Traffic Director 负载平衡服务的 gRPC 连接。

如需验证服务是否可用,请执行以下操作之一:

  • 登录其中一个虚拟机主机(gRPC 服务后端),并验证 gRPC 服务是否正在侦听端口上运行。在本示例中,端口为 50051。
  • 请查看 Console 中的 Traffic Director 页面,获取已配置服务 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.11.0.tar.gz | tar -xz
./td-grpc-bootstrap-0.11.0/td-grpc-bootstrap | tee $GRPC_XDS_BOOTSTRAP')

设置环境变量和引导文件

客户端应用需要引导配置文件。上一部分中的启动脚本会设置 GRPC_XDS_BOOTSTRAP 环境变量,并使用帮助程序脚本生成引导文件。所生成引导文件中 TRAFFICDIRECTOR_GCP_PROJECT_NUMBERTRAFFICDIRECTOR_NETWORK_NAMEzone 的值将从知道 Compute Engine 虚拟机实例这些详细信息的元数据服务器获取。您可以使用 -gcp-project-number-vpc-network-name 选项手动将这些值提供给帮助程序脚本。

如需验证配置,请登录客户端虚拟机并运行以下示例。

Java

如需使用 gRPC Java 客户端验证服务,请执行以下操作:

  1. 下载最新版本的 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
    
  2. 运行客户端,其中 world 是名称,xds:///helloworld-gce 是服务 URI。

    ./build/install/example-xds/bin/xds-hello-world-client "world" \
       xds:///helloworld-gce
    

Go

如需使用 gRPC Go 客户端验证服务,请执行以下操作:

  1. 下载最新版本的 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 .
    
  2. 运行客户端,其中 world 是名称,xds:///helloworld-gce 是服务 URI。

    ./client "world" xds:///helloworld-gce
    

C++

如需使用 gRPC C++ 客户端验证服务,请执行以下操作:

  1. 下载最新版本的 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
    
  2. 使用“xds:///helloworld-gce”作为服务 URI 运行客户端。

    ./greeter_client --target=xds:///helloworld-gce
    

grpcurl

如需使用 grpcurl 工具验证服务,请执行以下操作:

  1. 下载并安装 grpcurl 工具。

    curl -L https://github.com/fullstorydev/grpcurl/releases/download/v1.8.1/grpcurl_1.8.1_linux_x86_64.tar.gz | tar -xz
    
  2. 运行 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 客户端是否已成功连接到 Traffic Director,并使用 xds 名称解析器了解 helloworld-gce 服务的后端。客户端向服务的其中一个后端发送请求,无需了解 IP 地址或执行 DNS 解析。

后续步骤