設定 Compute Engine VM 和無 Proxy gRPC 服務

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

在按照本指南中的說明操作之前,請先參閱「準備設定使用無 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 服務。
  • 使用範本設定代管執行個體群組。

建立執行個體範本

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

主控台

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

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

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

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

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

  6. 在「Management」分頁中,將下列指令碼複製到「Startup script」欄位。

    #! /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 控制台中的 Cloud Service Mesh 頁面,瞭解已設定的服務 helloworld-gce 相關資訊,並確認後端是否已回報為正常。
  • 請按照下列操作說明,使用 Compute Engine gRPC 用戶端進行驗證。

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

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

首先,請建立用戶端 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.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_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 解析。

後續步驟