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

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

按照本指南中的操作說明進行之前,請先完成「準備透過 Envoy 和無 Proxy 工作負載設定服務轉送 API」一文所述的必要工作。

本指南說明如何自動部署由 Envoy Sidecar Proxy 組成的資料層、使用 Cloud Service Mesh 設定資料層,以及驗證設定,確保資料層正常運作。這個程序包含下列步驟:

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

本文中的設定範例僅供示範。在正式環境中,您可能需要依據環境與需求部署附加元件。

啟用 Cloud OS Config API

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

現在說明一下操作方式:

控制台

  1. 在 Google Cloud 控制台中,前往「API 和服務」。
    前往「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」(執行個體範本) 頁面。

    前往「執行個體範本」

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

    #!/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. 在「執行個體範本」下方,選取您建立的執行個體範本 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 Proxy。代管執行個體群組會使用自動調度資源建立新後端 VM。

在 VM 上執行的軟體元件

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

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

唯一可用的 Envoy 版本是最近的 Envoy 二進位檔,該檔案會託管在專屬的 Cloud Storage 位置。這個 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 Proxy 在兩個後端執行個體之間,對輸出流量進行負載平衡。您會設定下列元件:

建立健康狀態檢查

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

控制台

  1. 前往 Google Cloud 控制台的「健康狀態檢查」頁面。
    前往「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 控制台的「Firewall policies」(防火牆政策) 頁面。
    前往「Firewall policies」(防火牆政策) 頁面
  2. 點按「建立防火牆規則」
  3. 在「Create a firewall rule」(建立防火牆規則) 頁面上,提供以下資訊:
    • Name (名稱):fw-allow-health-checks
    • 「Network」(網路):選擇虛擬私有雲網路。
    • 「Priority」(優先順序):輸入代表優先順序的數字,預設為 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」(指定的通訊埠和通訊協定),然後勾選 tcp,在通訊埠中輸入 80

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 的全球後端服務。將健康狀態檢查和代管或非代管執行個體群組新增至後端服務。請注意,本範例使用的代管執行個體群組,是透過執行範例 HTTP 服務的 Compute Engine VM 範本建立,如「建立代管執行個體群組」一文所述。

控制台

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

    前往 Cloud Service Mesh 頁面

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

  3. 按一下「繼續」

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

  5. 選取正確的虛擬私有雲網路。

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

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

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

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

  10. 按一下 [完成]

  11. 選取您建立的健康狀態檢查,或按一下「建立另一個健康狀態檢查」,並確認選取「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,並將其附加至網址對應。

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

    前往 Cloud Service Mesh 頁面

  2. 在「轉送規則對應」分頁中,按一下「建立轉送規則對應」

  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」(自訂 IP) 欄位中輸入 10.0.0.1。當 VM 傳送至這個 IP 位址時,Envoy Proxy 會攔截該 IP 位址,並根據網址對應中定義的流量管理規則,將其傳送至適當後端服務的端點。

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

  9. 確認「Port」(通訊埠) 已設為 80

  10. 按一下 [儲存]

  11. 在「Routing rules」(轉送規則) 區段中,選取「Simple host and path rule」(簡單主機與路徑規則)

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

  13. 按一下「新增主機與路徑規則」。

  14. 在「Hosts」(主機) 中輸入 hello-world

  15. 在「服務」中選取 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. 建立轉送規則。

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

    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 Proxy,然後 Envoy Proxy 會將要求轉送至代管 Hello World 服務的 VM。

如要執行這項操作,請登入已設定為攔截流量並將流量重新導向 Envoy 的用戶端 VM。您會將 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 服務的後端時,會使用 round robin 負載平衡 (預設負載平衡演算法)。

後續步驟