使用自動 Envoy 部署設定 Compute Engine VM

本文適用於舊版 API。如果您使用新服務路由 API (目前處於預先發布階段) 進行部署,請參閱「為使用 HTTP 服務的 Envoy Proxy 設定 Cloud Service Mesh」一文。

請先完成「準備使用 Envoy 和無 Proxy 工作負載設定服務路由 API」一文中所述的先決作業,再按照本指南中的說明操作。

本指南說明如何自動部署包含 Envoy 附屬 Proxy 的資料層,並使用 Cloud Service Mesh 進行設定,然後驗證設定是否正常運作。這項程序涉及以下事項:

  1. 啟用 Cloud OS Config API。
  2. 建立測試服務。
  3. 使用 Envoy 代理程式 (Envoy 1.18.4 版,僅支援 xDS 3.0) 在 Compute Engine 上部署簡單的資料層。
  4. 使用 Compute Engine API 設定 Cloud Service Mesh,讓 Cloud Service Mesh 設定 Envoy 副車 Proxy。
  5. 登入執行 Envoy Proxy 的 VM,並透過 Envoy Proxy 將要求傳送至負載平衡的後端。

本文件中的設定範例僅供示範。對於正式環境,您可能需要根據環境和需求部署其他元件。

啟用 Cloud OS Config API

請務必啟用 Cloud OS Config API。否則,您無法在 VM 上安裝必要元件。

現在說明一下操作方式:

控制台

  1. 在 Google Cloud 控制台中,前往「API 和服務」。
    前往「API Library」(API 程式庫) 頁面
  2. 選取正確的專案。
  3. 在搜尋框中輸入「Cloud OS Config API」,然後按下 Enter 鍵。
  4. 選取「Cloud OS Config API」
  5. 按一下「啟用」

gcloud

gcloud services enable osconfig.googleapis.com

建立 Hello World 測試服務

本節說明如何建立簡單的測試服務,以便傳回為用戶端提供要求的 VM 主機名稱。測試服務很簡單,它是部署在 Compute Engine 代管執行個體群組中的網路伺服器。

Hello World 測試服務建立執行個體範本

您建立的執行個體範本會使用 startup-script 參數設定範例 apache2 網路伺服器。

主控台

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

    前往「Instance Templates」(執行個體範本)

  2. 點選「建立執行個體範本」
  3. 在欄位中輸入下列資訊:
    • Name (名稱):td-demo-hello-world-template
    • 開機磁碟:選擇作業系統和版本。
    • 服務帳戶:Compute Engine 預設服務帳戶
    • 存取權範圍:允許所有 Cloud API 的完整存取權
  4. 按一下「管理、安全性、磁碟、網路、單獨租用」。1 在「Networking」(網路) 分頁的「Network tags」(網路標記) 欄位中,新增 td-http-server 標記。
  5. 在「Management」(管理) 分頁中,將下列指令碼複製到「Startup script」(開機指令碼) 欄位。

    #!/bin/bash
    sudo apt-get update -y
    sudo apt-get install apache2 -y
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>'\`/bin/hostname\`'</h1></body></html>' | sudo tee /var/www/html/index.html
    
  6. 按一下 [建立]。

gcloud

您可以選擇多個作業系統版本。本範例使用預設值 Debian 10。

如要建立執行個體範本,請按照下列步驟操作:

gcloud compute instance-templates create td-demo-hello-world-template \
  --machine-type=n1-standard-1 \
  --boot-disk-size=20GB \
  --image-family=debian-10  \
  --image-project=debian-cloud \
  --scopes=https://www.googleapis.com/auth/cloud-platform \
  --tags=td-http-server \
  --metadata=startup-script="#! /bin/bash
sudo apt-get update -y
sudo apt-get install apache2 -y
sudo service apache2 restart
sudo mkdir -p /var/www/html/
echo '<!doctype html><html><body><h1>'\`/bin/hostname\`'</h1></body></html>' | sudo tee /var/www/html/index.html"

Hello World 服務建立代管執行個體群組

在本節中,您會指定代管執行個體群組一律要有兩個測試服務例項。這只是為了示範。Cloud Service Mesh 支援自動調度資源的代管執行個體群組。

主控台

  1. 前往 Google Cloud 控制台的「Instance Groups」(執行個體群組) 頁面。

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

  2. 點選「建立執行個體群組」
  3. 選取「New managed instance group (stateless)」(新增代管執行個體群組 (無狀態))。詳情請參閱「無狀態或有狀態的 MIG」。
  4. 輸入 td-demo-hello-world-mig 做為代管執行個體群組的名稱,然後選取 us-central1-a 區域。
  5. 在「Instance template」(執行個體範本) 下方,選取您建立的執行個體範本 td-demo-hello-world-template
  6. 在「Autoscaling mode」(自動調度資源模式) 下方,選取 Off:do not autoscale
  7. 在「Maximum number of instances」(執行個體數量上限) 底下,指定要在群組中建立的執行個體數量,至少為兩個。
  8. 按一下 [建立]。

gcloud

使用 gcloud CLI 搭配先前建立的執行個體範本,建立代管執行個體群組。

gcloud compute instance-groups managed create td-demo-hello-world-mig \
  --zone us-central1-a \
  --size=2 \
  --template=td-demo-hello-world-template

建立 Envoy 部署所在的執行個體範本和代管執行個體群組

請按照本節的操作說明,為 Cloud Service Mesh 建立執行個體範本和代管執行個體群組,並自動部署 Envoy 代理程式。代管執行個體群組會使用自動調度資源建立新後端 VM。

在 VM 上執行的軟體元件

使用 --service-proxy=enabled 建立執行個體範本時,系統會在 VM 上安裝下列元件。

  • 由 Cloud Service Mesh 設定的 Envoy 代理程式會從專屬 Cloud Storage 值區下載。這個值區包含 Google 提供的 Envoy Proxy 版本。
  • 服務 Proxy 代理程式,可初始化 Envoy Proxy 和 Proxy 的元件。服務 Proxy 代理程式會在 VM 執行時設定流量攔截,並監控 Envoy Proxy 的健康狀態。服務 Proxy 代理程式也會從 Cloud Storage 值區下載。

目前唯一可用的 Envoy 版本,是託管在專屬 Cloud Storage 位置的最新 Envoy 二進位檔。這個 Envoy 版本支援 Compute Engine Debian、CentOS 7/8 和 RHEL 7/8。在自動修復和擴充期間,代管執行個體群組會在 VM 上安裝 Envoy 最新版本。在某些情況下,這個版本可能比先前部署至 VM 執行個體的 Envoy 更新。這可能會導致代管執行個體群組中 VM 安裝的版本不一致。不相容的版本可以正常搭配運作。如果 Envoy 有安全性更新,建議您使用滾動式取代升級代管執行個體群組。

建立執行個體範本

執行個體範本可指定在代管執行個體群組中建立的 VM 執行個體設定。您傳遞至執行個體範本的旗標會安裝 Envoy,並設定 VM 執行個體,以便使用 Cloud Service Mesh。

您可以使用 Debian 10/11、CentOS 7/8 或 RHEL 7/8 做為執行個體範本中的開機磁碟映像檔。

如要建立這類執行個體範本,請按照下列步驟操作:

  gcloud compute instance-templates create td-vm-template-auto \
    --image-family=[ debian-10 | centos-7 | centos-8 | rhel-7 | rhel-8 ]  \
    --image-project=[ debian-cloud | centos-cloud |rhel-cloud ] \
    --service-proxy=enabled
 

如要自訂 Envoy 部署作業,請參閱 自動化 Envoy 部署參考指南

建立代管執行個體群組

主控台

  1. 前往 Google Cloud 控制台的「Instance Groups」(執行個體群組) 頁面。

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

  2. 按一下 [Create an instance group] (建立執行個體群組)
  3. 輸入 td-vm-mig-us-central1 做為代管執行個體群組的名稱,然後選取 us-central1-a 區域。
  4. 在「Group type」(群組類型) 底下,選取 [Managed instance group] (代管執行個體群組)
  5. 在「Instance template」(執行個體範本) 底下,選取您建立的執行個體範本 td-vm-template-auto
  6. 2 指定為要在群組中建立的執行個體數量。
  7. 按一下 [Create] (建立) 來建立新群組。

gcloud

使用 gcloud CLI 搭配先前建立的執行個體範本,建立代管執行個體群組。

 gcloud compute instance-groups managed create td-vm-mig-us-central1 \
    --zone us-central1-a --size=2 --template=td-vm-template-auto

使用 Google Cloud 負載平衡器元件設定 Cloud Service Mesh

本節的操作說明會說明如何設定 Cloud Service Mesh,讓 Envoy 代理程式在兩個後端執行個體之間負載平衡傳出流量。您需要設定下列元件:

建立健康狀態檢查

請按照下列操作說明建立健康狀態檢查。詳情請參閱「建立健康狀態檢查」一文。

主控台

  1. 前往 Google Cloud 控制台的「Health checks」(健康狀態檢查) 頁面。
    前往「Health checks」(健康狀態檢查) 頁面
  2. 按一下 [Create Health Check] (建立健康狀態檢查)
  3. 輸入 td-vm-health-check 做為名稱。
  4. 選取 [HTTP] 做為通訊協定。
  5. 按一下 [建立]。

gcloud

  1. 建立健康狀態檢查。

    gcloud compute health-checks create http td-vm-health-check
    

建立防火牆規則

請按照下列操作說明建立健康狀態檢查探測器所需的防火牆規則。詳情請參閱「健康狀態檢查的防火牆規則」。

主控台

  1. 前往 Google Cloud 控制台的「防火牆政策」頁面。
    前往「防火牆政策」頁面
  2. 點按「建立防火牆規則」
  3. 在「Create a firewall rule」(建立防火牆規則) 頁面上,提供下列資訊:
    • Name (名稱):fw-allow-health-checks
    • Network:選擇虛擬私有雲網路。
    • 優先順序:輸入代表優先順序的數字,預設值為 1000。
    • 「Direction of traffic」(流量方向):選擇 [ingress] (輸入)
    • 「Action on match」(相符時執行的動作):選擇 [allow] (允許)
    • 「Targets」(目標):選擇「Specified target tags」(指定的目標標記),然後在「Target tags」(目標標記) 文字方塊中輸入 td-http-server
    • 來源篩選器:選擇正確的 IP 範圍類型。
    • Source IP ranges (來源 IP 範圍):35.191.0.0/16,130.211.0.0/22
    • 目的地篩選器:選取 IP 類型。
    • 「Protocols and ports」(通訊協定和通訊埠):按一下「Specified ports and protocols」(指定的通訊埠和通訊協定),然後勾選「port 80」中的 tcp 類型

gcloud

  1. 建立健康狀態檢查的防火牆規則。

    gcloud compute firewall-rules create fw-allow-health-checks \
      --action ALLOW \
      --direction INGRESS \
      --source-ranges 35.191.0.0/16,130.211.0.0/22 \
      --target-tags td-http-server \
      --rules tcp:80
    

建立後端服務

建立後端服務。如果您使用 Google Cloud CLI,則必須將其指定為負載平衡機制為 INTERNAL_SELF_MANAGED 的全球後端服務。將健康狀態檢查和代管或非代管執行個體群組新增至後端服務。請注意,這個範例會使用代管執行個體群組和 Compute Engine VM 範本,執行在「建立代管執行個體群組」一文中建立的範例 HTTP 服務。

主控台

  1. 前往 Google Cloud 控制台的「Cloud Service Mesh」頁面。

    前往「Cloud Service Mesh」頁面

  2. 在「Services」(服務) 分頁中,按一下 [Create Service] (建立服務)

  3. 按一下「繼續」

  4. 輸入 td-vm-service 做為服務名稱。

  5. 選取正確的 VPC 網路。

  6. 請確認「後端類型」(Backend type) 為「Instance groups」(執行個體群組)

  7. 選取 td-demo-hello-world-mig,這是您建立的代管執行個體群組,其中包含 Hello World 測試服務的後端。

  8. 輸入正確的通訊埠編號

  9. 選擇「Utilization」(使用率)或「Rate」(比率)做為「Balancing mode」(平衡模式)。預設值為「Rate」

  10. 按一下 [完成]

  11. 選取您建立的健康狀態檢查,或按一下「Create another health check」(建立另一個健康狀態檢查),並確認選取「HTTP」做為通訊協定。

  12. 在「Connection draining timeout」(連線排除逾時) 中,將值設為 30 秒或更長。

  13. 按一下「繼續」

  14. 按一下 [建立]。

gcloud

  1. 建立後端服務。

    gcloud compute backend-services create td-vm-service \
     --global \
     --load-balancing-scheme=INTERNAL_SELF_MANAGED \
     --connection-draining-timeout=30s \
     --health-checks td-vm-health-check
    
  2. 將後端新增至後端服務。

    gcloud compute backend-services add-backend td-vm-service \
      --instance-group td-demo-hello-world-mig \
      --instance-group-zone us-central1-a \
      --global
    

建立轉送規則對應關係

轉送規則對應關係會定義 Cloud Service Mesh 如何在網狀結構中轉送流量。您可以設定虛擬 IP (VIP) 位址和一組相關的流量管理規則 (例如以主機為基礎的轉送),做為轉送規則對應關係的一部分。當應用程式向 VIP 傳送要求時,Envoy Proxy 會執行以下操作:

  1. 攔截要求。
  2. 根據網址對應中的流量管理規則進行評估。
  3. 根據要求中的主機名稱選取後端服務。
  4. 選擇與所選後端服務相關聯的後端或端點。
  5. 將流量傳送至該後端或端點。

如要進一步瞭解流量管理,請參閱「進階流量管理」。

主控台

在 Google Cloud 主控台中,建立目標 Proxy 會搭配建立轉送規則。建立轉寄規則時, Google Cloud會自動建立目標 HTTP Proxy,並將 Proxy 附加至網址對應。

  1. 前往 Google Cloud 控制台的「Cloud Service Mesh」頁面。

    前往「Cloud Service Mesh」頁面

  2. 在「Routing rule maps」分頁中,按一下「Create Routing Rule Map」

  3. 輸入名稱。

  4. 按一下 [Add Forwarding Rule] (新增轉寄規則)

  5. 針對轉寄規則名稱,請輸入 td-vm-forwarding-rule

  6. 選取網路。

  7. 選取「內部 IP」。傳送至這個 IP 位址的流量會由 Envoy Proxy 攔截,並根據主機和路徑規則傳送至相關的服務。

    轉送規則會以通用轉送規則的形式建立,並將 load-balancing-scheme 設為 INTERNAL_SELF_MANAGED

  8. 在「Custom IP」欄位中輸入 10.0.0.1。當您的 VM 傳送至這個 IP 位址時,Envoy Proxy 會攔截該流量,並根據網址對應中定義的流量管理規則,將其傳送至適當的後端服務端點。

    虛擬私有雲網路中的每個轉送規則都必須有專屬的 IP 位址和通訊埠。如果您在特定虛擬私人雲端網路中,使用相同的 IP 位址和通訊埠建立多個轉送規則,只有第一個轉送規則有效。系統會忽略其他內容。如果網路中沒有 10.0.0.1,請選擇其他 IP 位址。

  9. 確認「Port」已設為 80

  10. 按一下 [儲存]

  11. 在「Routing rules」部分,選取「Simple host and path rule」

  12. 在「主機與路徑規則」部分,選取「td-vm-service」做為服務。

  13. 按一下「Add host and path rule」(新增主機與路徑規則)。

  14. 在「Hosts」中輸入 hello-world

  15. 在「Service」中選取 td-vm-service

  16. 按一下 [儲存]

gcloud

  1. 建立使用後端服務 td-vm-service 做為預設的網址對應。

    gcloud compute url-maps create td-vm-url-map \
       --default-service td-vm-service
    
  2. 建立路徑比對器和主機規則,根據主機名稱和路徑為服務轉送流量。這個範例使用 td-vm-service 做為服務名稱,以及與此主機 (/*) 的所有路徑要求相符的預設路徑比對器。

    gcloud compute url-maps add-path-matcher td-vm-url-map \
       --default-service td-vm-service \
       --path-matcher-name td-vm-path-matcher
    
    gcloud compute url-maps add-host-rule td-vm-url-map \
       --path-matcher-name=td-vm-path-matcher \
       --hosts=hello-world
    
  3. 建立目標 HTTP Proxy。

    gcloud compute target-http-proxies create td-vm-proxy \
       --url-map=td-vm-url-map
    
  4. 建立轉寄規則。

    轉送規則必須是全域規則,且必須以 load-balancing-scheme 設為 INTERNAL_SELF_MANAGED 的值建立。

    gcloud compute forwarding-rules create td-vm-forwarding-rule \
       --global \
       --load-balancing-scheme=INTERNAL_SELF_MANAGED \
       --address=10.0.0.1 \
       --target-http-proxy=td-vm-proxy \
       --ports=80 \
       --network=default
    

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

驗證設定

在 Compute Engine VM 的 Cloud Service Mesh 設定指南最後一節中,您將測試從用戶端 VM 傳送至轉送規則 VIP 的流量,並攔截並重新導向至 Envoy 代理程式,然後將要求轉送至代管 Hello World 服務的 VM。

為此,您必須登入用戶端 VM,該 VM 已設定為攔截流量並將其重新導向至 Envoy。您會將 curl 要求傳送至與轉送規則對應關係相關聯的 VIP。Envoy 會檢查 curl 要求,判斷應解析至哪項服務,並將要求傳送至與該服務相關聯的後端。

  1. 前往 Google Cloud 控制台的「Instance Groups」(執行個體群組) 頁面。

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

  2. 選取 td-vm-mig-us-central1 執行個體群組。
  3. 在 VM 摘要部分的「連線」下方,按一下「SSH」
  4. 登入用戶端 VM 後,請使用 curl 工具透過 Envoy 向 Hello World 服務傳送要求:
curl -H "Host: hello-world" http://10.0.0.1/

重複執行這項指令時,您應該會看到不同的 HTML 回應,其中包含 Hello World 受管理執行個體群組中後端的主機名稱。這是因為 Envoy 在將流量傳送至 Hello World 服務的後端時,會使用輪替負載平衡功能 (預設負載平衡演算法)。

後續步驟