設定 Compute Engine VM 和無 Proxy gRPC 服務

本指南說明如何設定 Compute Engine VM 主機、gRPC 應用程式,以及 Cloud Service Mesh 負載平衡元件。

按照本指南中的說明操作之前,請先參閱「準備設定使用無 Proxy gRPC 服務的 Cloud Service Mesh」。

總覽

如要使用 Compute Engine 虛擬機器 (VM) 和無 Proxy 的 gRPC 服務設定 Cloud Service Mesh,請完成下列步驟:

  1. 設定代管執行個體群組,做為後端主機。
  2. 設定後端,執行 gRPC 伺服器,以回應用戶端的要求並傳回 hello world
  3. 使用代管執行個體群組和其他 Google Cloud 負載平衡元件設定 Cloud Service Mesh。
  4. 使用無 Proxy gRPC 用戶端應用程式將流量傳送至 gRPC 伺服器應用程式,確認部署作業正常運作。

無 Proxy gRPC 用戶端會使用 xDS 連線至 Cloud Service Mesh。當用戶端連線至 Cloud Service Mesh 時,Cloud Service Mesh 會將與 hello world 服務相關聯的後端資訊傳送給用戶端。無 Proxy 的 gRPC 用戶端會使用這項資訊,將要求傳送至 hello world gRPC 伺服器。

設定 Cloud Service Mesh 適用的代管執行個體群組

代管執行個體群組會視部署作業需求,使用自動調度資源功能建立新的後端 VM。這個範例說明如何執行下列操作:

  • 建立執行個體範本,其中包含使用 gRPC 通訊協定提供 hello world 服務的範例服務。
  • 使用範本設定代管執行個體群組。

建立執行個體範本

本節說明如何建立執行個體範本。在本範例中,您部署的 helloworld gRPC 服務會公開在通訊埠 50051 上。

控制台

  1. 前往 Google Cloud 控制台的「Instance Templates」(執行個體範本) 頁面。

    前往「Instance templates」(執行個體範本) 頁面

  2. 點選 [建立執行個體範本]
  3. 按照下方指示填入欄位:

    • 名稱:grpc-td-vm-template
    • 開機磁碟版本:Debian / Linux 10
    • 服務帳戶:Compute Engine 預設服務帳戶
    • 存取權範圍:允許所有 API 的完整存取權 Google Cloud
  4. 在 [Firewall] (防火牆) 下方,勾選 [Allow HTTP traffic] (允許 HTTP 流量) 和 [Allow HTTPS traffic] (允許 HTTPS 流量) 的方塊。

  5. 按一下 [Management, security, disks, networking, sole tenancy] (管理、安全性、磁碟、網路、單獨租用)。

  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 控制台的「Instance Groups」(執行個體群組) 頁面。

    前往「Instance Groups」(執行個體群組) 頁面

  2. 按一下「建立執行個體群組」。根據預設,系統會顯示建立代管執行個體群組的頁面。
  3. 輸入 grpc-td-mig-us-central1 做為代管執行個體群組的名稱,然後選取 us-central1-a 區域。
  4. 在「Instance template」(執行個體範本) 下方,選取您建立的執行個體範本 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 控制台的「Instance Groups」(執行個體群組) 頁面。

    前往「Instance Groups」(執行個體群組) 頁面

  2. 按一下您建立的執行個體群組名稱 grpc-td-mig-us-central1
  3. 按一下「編輯群組」
  4. 在「Port name」(通訊埠名稱) 欄位中輸入 grpc-helloworld-port
  5. 在「Port number」(通訊埠編號) 欄位中,輸入 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 負載平衡元件設定 Cloud Service Mesh

本節說明如何為服務設定 Cloud Service Mesh 和Google Cloud 負載平衡元件。

建立健康狀態檢查、防火牆規則和後端服務

在本節中,您將建立負載平衡機制為 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
    

建立轉送規則對應、目標 Proxy 和轉送規則

在本節中,您將建立網址對應、路徑比對器和主機規則,根據主機名稱和路徑轉送服務流量。以下範例使用 helloworld-gce 做為服務名稱。gRPC 應用程式連線至這項服務時,會在目標 URI 中使用這個服務名稱。根據預設,路徑比對器會比對這個主機的所有路徑要求 (/*)。您也會建立目標 gRPC Proxy 和轉送規則。

詳情請參閱轉送規則對應

在以下範例中,通訊埠 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 Proxy。

    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
    

Cloud Service Mesh 現在已設定為在代管執行個體群組的後端之間,為網址對應中指定的服務進行負載平衡。

驗證設定

設定程序完成後,請確認您可建立 gRPC 連線至先前建立的 Cloud Service Mesh 負載平衡服務。

如要確認服務是否可用,請採取下列其中一項做法:

  • 登入其中一個 VM 主機 (gRPC 服務後端),並確認 gRPC 服務正在監聽通訊埠上執行。在本範例中,通訊埠為 50051。
  • 查看控制台中的 Cloud Service Mesh 頁面,瞭解已設定的服務 helloworld-gce 相關資訊,並確認後端回報為正常。
  • 請按照下列操作說明,使用 Compute Engine gRPC 用戶端進行驗證。

使用 gRPC 用戶端應用程式驗證服務

在下列範例中,您可以使用所選語言的 gRPC 用戶端或 grpcurl 工具,測試 gRPC 服務。

首先,請建立用戶端 VM,並在該 VM 上執行 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.19.0.tar.gz | tar -xz
./td-grpc-bootstrap-0.19.0/td-grpc-bootstrap | tee $GRPC_XDS_BOOTSTRAP')

設定環境變數和啟動檔案

用戶端應用程式需要啟動設定檔。上一節中的啟動指令碼會設定 GRPC_XDS_BOOTSTRAP 環境變數,並使用輔助指令碼產生啟動程序檔案。產生的啟動程序檔案中 TRAFFICDIRECTOR_GCP_PROJECT_NUMBERTRAFFICDIRECTOR_NETWORK_NAMEzone 的值,是從中繼資料伺服器取得,該伺服器瞭解 Compute Engine VM 執行個體的這些詳細資料。您可以使用 -gcp-project-number-vpc-network-name 選項,手動將這些值提供給輔助指令碼。

如要驗證設定,請登入用戶端 VM 並執行下列範例。

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. 使用「xds:///helloworld-gce」做為服務 URI,並以 helloworld.Greeter/SayHello 做為要叫用的服務名稱和方法,執行 grpcurl 工具。SayHello 方法的參數會透過 -d 選項傳遞。

    ./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 是 VM 執行個體的名稱:

Greeting: Hello world, from INSTANCE_HOSTNAME

這會驗證無 Proxy gRPC 用戶端是否已成功連線至 Cloud Service Mesh,並使用 xds 名稱解析器瞭解 helloworld-gce 服務的後端。用戶端將要求傳送至其中一個服務後端,不必瞭解 IP 位址或執行 DNS 解析。

後續步驟