使用手動 Envoy 部署功能設定 VM

本文適用於想要手動設定 Cloud Service Mesh 的網路管理員。手動程序是舊版機制,僅適用於使用負載平衡 API 設定 Cloud Service Mesh 的進階使用者。

強烈建議您使用服務路徑 API 設定 Cloud Service Mesh,而非舊版負載平衡 API。如果必須使用負載平衡 API,建議您採用自動 Envoy 部署,而非本頁面所述的手動程序。

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

本指南說明如何手動部署資料層 (由 Envoy Sidecar Proxy 和 Compute Engine 虛擬機器 (VM) 組成)、使用 Cloud Service Mesh 進行設定,以及驗證設定是否正常運作。這項程序包括:

  1. 建立測試服務。
  2. 使用 Envoy 代理程式在 Compute Engine 上部署簡單的資料層。
  3. 使用 Compute Engine API 設定 Cloud Service Mesh,讓 Cloud Service Mesh 設定 Envoy Sidecar Proxy。
  4. 登入執行 Envoy Proxy 的 VM,並透過 Envoy Proxy 將要求傳送至負載平衡後端。

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

設定程序總覽

本節說明如何手動設定在 Compute Engine VM 上執行的服務。用戶端 VM 的設定程序包含在 Compute Engine VM 主機上設定 Sidecar Proxy 與流量攔截。然後使用Google Cloud 負載平衡 API 設定負載平衡。

本節提供相關資訊,說明如何從非 Google 管理的第三方來源取得及注入 Envoy Proxy。

當應用程式將流量傳送至 Cloud Service Mesh 中設定的服務時,流量會遭到攔截並重新導向至 xDS API 相容的 Sidecar Proxy,然後根據 Google Cloud 負載平衡元件中的設定,將負載平衡後的流量送至後端。如要進一步瞭解主機網路和流量攔截,請參閱「Cloud Service Mesh 中的 Sidecar Proxy 流量攔截」。

針對要求存取 Cloud Service Mesh 服務的每個 VM 主機,執行下列步驟:

  1. 將服務帳戶指派給 VM。

  2. 將 VM 的 API 存取權範圍設為允許所有Google Cloud API。

    • 建立 VM 時,請在「Identity and API access」(身分及 API 存取權) 下,按一下「Allow full access to all Cloud APIs」(允許所有 Cloud API 的完整存取權)

      前往「VM instances」(VM 執行個體) 頁面

    • 使用 gcloud CLI 時,請指定下列項目:

      --scopes=https://www.googleapis.com/auth/cloud-platform

  3. 允許從 VM 連出至 trafficdirector.googleapis.com (TCP、通訊埠 443) 的連線,如此一來,Sidecar Proxy 可透過 gRPC 連線至 Cloud Service Mesh 控制層。預設為啟用連出至通訊埠 443 的連線。

  4. 部署 xDS API 相容的 Sidecar Proxy (如 Envoy),並以自動啟動設定指向 trafficdirector.googleapis.com:443 做為該 Proxy 的 xDS 伺服器。如要取得範例啟動設定檔,請開啟壓縮檔 traffic-director-xdsv3.tar.gz,然後修改 bootstrap_template.yaml 檔案以符合您的需求。

  5. 將目的地為服務的 IP 流量,重新導向至 Sidecar Proxy 攔截事件監聽器通訊埠。

建立 Hello World 測試服務

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

建立執行個體範本

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

控制台

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

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

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

    #! /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
    
  7. 點選「建立」

gcloud

建立執行個體範本:

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"

建立代管執行個體群組

在本節中,您會指定代管執行個體群組一律有兩個測試服務執行個體。這僅供示範之用。 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」(自動調度資源模式) 下,選取「Don't autoscale」(不要自動調整資源配置)
  7. 在「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 的執行個體範本和代管執行個體群組。代管執行個體群組會使用自動調度資源建立新後端 VM。

這個範例說明如何執行下列操作:

  • 建立具有 Envoy 完整設定的 VM 範本,以及透過 HTTP 通訊協定將本身名稱做為主機名稱的範例服務。
  • 使用這個範本設定代管執行個體群組。

建立執行個體範本

首先,請建立 Compute Engine VM 執行個體範本。這個範本會透過 startup-script 參數,自動設定 Envoy Sidecar Proxy 和 Apache2 範例 Web 服務。

控制台

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

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

  2. 點選「建立執行個體範本」
  3. 如下填入欄位:

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

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

  6. 在「管理」分頁中,將下列指令碼複製到「開機指令碼」欄位。

    #! /usr/bin/env bash
    
    # Set variables
    export ENVOY_USER="envoy"
    export ENVOY_USER_UID="1337"
    export ENVOY_USER_GID="1337"
    export ENVOY_USER_HOME="/opt/envoy"
    export ENVOY_CONFIG="${ENVOY_USER_HOME}/config.yaml"
    export ENVOY_PORT="15001"
    export ENVOY_ADMIN_PORT="15000"
    export ENVOY_TRACING_ENABLED="false"
    export ENVOY_XDS_SERVER_CERT="/etc/ssl/certs/ca-certificates.crt"
    export ENVOY_ACCESS_LOG="/dev/stdout"
    export ENVOY_NODE_ID="$(cat /proc/sys/kernel/random/uuid)~$(hostname -i)"
    export BOOTSTRAP_TEMPLATE="${ENVOY_USER_HOME}/bootstrap_template.yaml"
    export GCE_METADATA_SERVER="169.254.169.254/32"
    export INTERCEPTED_CIDRS="*"
    export GCP_PROJECT_NUMBER=PROJECT_NUMBER
    export VPC_NETWORK_NAME=NETWORK_NAME
    export GCE_ZONE=$(curl -sS -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/zone | cut -d"/" -f4)
    
    # Create system user account for Envoy binary
    sudo groupadd ${ENVOY_USER} \
     --gid=${ENVOY_USER_GID} \
     --system
    sudo adduser ${ENVOY_USER} \
     --uid=${ENVOY_USER_UID} \
     --gid=${ENVOY_USER_GID} \
     --home=${ENVOY_USER_HOME} \
     --disabled-login \
     --system
    
    # Download and extract the Cloud Service Mesh tar.gz file
    cd ${ENVOY_USER_HOME}
    sudo curl -sL https://storage.googleapis.com/traffic-director/traffic-director-xdsv3.tar.gz -o traffic-director-xdsv3.tar.gz
    sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/bootstrap_template.yaml \
     -C bootstrap_template.yaml \
     --strip-components 1
    sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/iptables.sh \
     -C iptables.sh \
     --strip-components 1
    sudo rm traffic-director-xdsv3.tar.gz
    
    # Generate Envoy bootstrap configuration
    cat "${BOOTSTRAP_TEMPLATE}" \
     | sed -e "s|ENVOY_NODE_ID|${ENVOY_NODE_ID}|g" \
     | sed -e "s|ENVOY_ZONE|${GCE_ZONE}|g" \
     | sed -e "s|VPC_NETWORK_NAME|${VPC_NETWORK_NAME}|g" \
     | sed -e "s|CONFIG_PROJECT_NUMBER|${GCP_PROJECT_NUMBER}|g" \
     | sed -e "s|ENVOY_PORT|${ENVOY_PORT}|g" \
     | sed -e "s|ENVOY_ADMIN_PORT|${ENVOY_ADMIN_PORT}|g" \
     | sed -e "s|XDS_SERVER_CERT|${ENVOY_XDS_SERVER_CERT}|g" \
     | sed -e "s|TRACING_ENABLED|${ENVOY_TRACING_ENABLED}|g" \
     | sed -e "s|ACCESSLOG_PATH|${ENVOY_ACCESS_LOG}|g" \
     | sed -e "s|BACKEND_INBOUND_PORTS|${BACKEND_INBOUND_PORTS}|g" \
     | sudo tee "${ENVOY_CONFIG}"
    
    # Install Envoy binary
    curl -sL "https://deb.dl.getenvoy.io/public/gpg.8115BA8E629CC074.key" | sudo gpg --dearmor -o /usr/share/keyrings/getenvoy-keyring.gpg
    echo a077cb587a1b622e03aa4bf2f3689de14658a9497a9af2c427bba5f4cc3c4723 /usr/share/keyrings/getenvoy-keyring.gpg | sha256sum --check
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/getenvoy-keyring.gpg] https://deb.dl.getenvoy.io/public/deb/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/getenvoy.list
    sudo apt update
    sudo apt -y install getenvoy-envoy
    
    # Run Envoy as systemd service
    sudo systemd-run --uid=${ENVOY_USER_UID} --gid=${ENVOY_USER_GID} \
     --working-directory=${ENVOY_USER_HOME} --unit=envoy.service \
     bash -c "/usr/bin/envoy --config-path ${ENVOY_CONFIG} | tee"
    
    # Configure iptables for traffic interception and redirection
    sudo ${ENVOY_USER_HOME}/iptables.sh \
     -p "${ENVOY_PORT}" \
     -u "${ENVOY_USER_UID}" \
     -g "${ENVOY_USER_GID}" \
     -m "REDIRECT" \
     -i "${INTERCEPTED_CIDRS}" \
     -x "${GCE_METADATA_SERVER}"
    
  7. 按一下 [Create] (建立),建立範本。

gcloud

建立執行個體範本。

gcloud compute instance-templates create td-vm-template \
  --scopes=https://www.googleapis.com/auth/cloud-platform \
  --tags=http-td-tag,http-server,https-server \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --metadata=startup-script='#! /usr/bin/env bash

# Set variables
export ENVOY_USER="envoy"
export ENVOY_USER_UID="1337"
export ENVOY_USER_GID="1337"
export ENVOY_USER_HOME="/opt/envoy"
export ENVOY_CONFIG="${ENVOY_USER_HOME}/config.yaml"
export ENVOY_PORT="15001"
export ENVOY_ADMIN_PORT="15000"
export ENVOY_TRACING_ENABLED="false"
export ENVOY_XDS_SERVER_CERT="/etc/ssl/certs/ca-certificates.crt"
export ENVOY_ACCESS_LOG="/dev/stdout"
export ENVOY_NODE_ID="$(cat /proc/sys/kernel/random/uuid)~$(hostname -i)"
export BOOTSTRAP_TEMPLATE="${ENVOY_USER_HOME}/bootstrap_template.yaml"
export GCE_METADATA_SERVER="169.254.169.254/32"
export INTERCEPTED_CIDRS="*"
export GCP_PROJECT_NUMBER=PROJECT_NUMBER
export VPC_NETWORK_NAME=NETWORK_NAME
export GCE_ZONE=$(curl -sS -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/zone | cut -d"/" -f4)

# Create system user account for Envoy binary
sudo groupadd ${ENVOY_USER} \
  --gid=${ENVOY_USER_GID} \
  --system
sudo adduser ${ENVOY_USER} \
  --uid=${ENVOY_USER_UID} \
  --gid=${ENVOY_USER_GID} \
  --home=${ENVOY_USER_HOME} \
  --disabled-login \
  --system
# Download and extract the Cloud Service Mesh tar.gz file
cd ${ENVOY_USER_HOME}
sudo curl -sL https://storage.googleapis.com/traffic-director/traffic-director-xdsv3.tar.gz -o traffic-director-xdsv3.tar.gz
sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/bootstrap_template.yaml \
  -C bootstrap_template.yaml \
  --strip-components 1
sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/iptables.sh \
  -C iptables.sh \
  --strip-components 1
sudo rm traffic-director-xdsv3.tar.gz

# Generate Envoy bootstrap configuration
cat "${BOOTSTRAP_TEMPLATE}" \
  | sed -e "s|ENVOY_NODE_ID|${ENVOY_NODE_ID}|g" \
  | sed -e "s|ENVOY_ZONE|${GCE_ZONE}|g" \
  | sed -e "s|VPC_NETWORK_NAME|${VPC_NETWORK_NAME}|g" \
  | sed -e "s|CONFIG_PROJECT_NUMBER|${GCP_PROJECT_NUMBER}|g" \
  | sed -e "s|ENVOY_PORT|${ENVOY_PORT}|g" \
  | sed -e "s|ENVOY_ADMIN_PORT|${ENVOY_ADMIN_PORT}|g" \
  | sed -e "s|XDS_SERVER_CERT|${ENVOY_XDS_SERVER_CERT}|g" \
  | sed -e "s|TRACING_ENABLED|${ENVOY_TRACING_ENABLED}|g" \
  | sed -e "s|ACCESSLOG_PATH|${ENVOY_ACCESS_LOG}|g" \
  | sed -e "s|BACKEND_INBOUND_PORTS|${BACKEND_INBOUND_PORTS}|g" \
  | sudo tee "${ENVOY_CONFIG}"

# Install Envoy binary
curl -sL "https://deb.dl.getenvoy.io/public/gpg.8115BA8E629CC074.key" | sudo gpg --dearmor -o /usr/share/keyrings/getenvoy-keyring.gpg
echo a077cb587a1b622e03aa4bf2f3689de14658a9497a9af2c427bba5f4cc3c4723 /usr/share/keyrings/getenvoy-keyring.gpg | sha256sum --check
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/getenvoy-keyring.gpg] https://deb.dl.getenvoy.io/public/deb/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/getenvoy.list
sudo apt update
sudo apt -y install getenvoy-envoy

# Run Envoy as systemd service
sudo systemd-run --uid=${ENVOY_USER_UID} --gid=${ENVOY_USER_GID} \
  --working-directory=${ENVOY_USER_HOME} --unit=envoy.service \
  bash -c "/usr/bin/envoy --config-path ${ENVOY_CONFIG} | tee"

# Configure iptables for traffic interception and redirection
sudo ${ENVOY_USER_HOME}/iptables.sh \
  -p "${ENVOY_PORT}" \
  -u "${ENVOY_USER_UID}" \
  -g "${ENVOY_USER_GID}" \
  -m "REDIRECT" \
  -i "${INTERCEPTED_CIDRS}" \
  -x "${GCE_METADATA_SERVER}"
'

建立代管執行個體群組

如果您沒有具備執行服務的代管執行個體群組,請建立代管執行個體群組,可使用上一節顯示的 VM 範本。本範例會使用上一節建立的執行個體範本,示範相關功能。您不一定要使用執行個體範本。

控制台

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

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

  2. 按一下「建立執行個體群組」。根據預設,系統會顯示建立代管執行個體群組的頁面。
  3. 選擇「New managed instance group (stateless)」(新增代管執行個體群組 (無狀態))。詳情請參閱「無狀態或有狀態的 MIG」。
  4. 輸入 td-vm-mig-us-central1 做為代管執行個體群組的名稱,然後選取 us-central1-a 區域。
  5. 在「Instance template」(執行個體範本) 下方,選取您建立的執行個體範本。
  6. 指定要在群組中建立的執行個體數量為 2。
  7. 點選「建立」

gcloud

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

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

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

本節說明如何設定 Cloud Service Mesh,讓 Envoy Proxy 在兩個後端執行個體之間,對輸出流量進行負載平衡。您會設定下列元件:

建立健康狀態檢查

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

控制台

  1. 前往 Google Cloud 控制台的「健康狀態檢查」頁面。

    前往「Health checks」(健康狀態檢查) 頁面

  2. 按一下「建立健康狀態檢查」
  3. 輸入 td-vm-health-check 做為名稱。
  4. 選取 [HTTP] 做為通訊協定。
  5. 點選「建立」

gcloud

  1. 建立健康狀態檢查:

    gcloud compute health-checks create http td-vm-health-check
    
  2. 建立防火牆規則:

    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 http-td-tag,http-server,https-server \
      --rules tcp
    

建立後端服務

如果使用 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. 選取正確的虛擬私有雲網路。
  6. 請確定「Backend type」(後端類型) 為「Instance groups」(執行個體群組)
  7. 選取您建立的代管執行個體群組。
  8. 輸入正確的「通訊埠編號」
  9. 選擇「使用率」或「比率」做為「平衡模式」。預設值為「Rate」(費率)。
  10. 按一下 [完成]
  11. 選取您建立的健康狀態檢查。
  12. 按一下 [儲存並繼續]
  13. 點選「建立」

gcloud

  1. 建立後端服務:

    gcloud compute backend-services create td-vm-service \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED \
      --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 在網格中轉送流量的方式。

請按照下列操作說明,為 Cloud Service Mesh 設定建立路由規則、轉送規則、目標 Proxy 和內部 IP 位址。

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

轉送規則會建立為通用轉送規則,且 load-balancing-scheme 會設為 INTERNAL_SELF_MANAGED

您可以將轉送規則的地址設為 0.0.0.0。如果這麼做,系統會根據網址對應中設定的 HTTP 主機名稱和路徑資訊轉送流量,無論要求的實際目的地 IP 位址為何。在這種情況下,服務的主機名稱 (如主機規則中所設定) 在服務網格設定中不得重複。也就是說,您無法讓兩個不同的服務使用相同的主機名稱,即使這兩個服務使用不同的後端組合也一樣。

或者,您也可以根據服務的實際目的地 VIP 啟用轉送功能。如果您將服務的 VIP 設定為轉送規則的 address 參數,系統只會根據網址對應中指定的 HTTP 參數,轉送目的地為這個位址的要求。

這個範例使用 10.0.0.1 做為位址參數,表示系統會根據服務的實際目的地 VIP 執行服務的路由作業。

控制台

在 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. 在「Host and path rules」(主機與路徑規則) 部分,選取 td-vm-service 做為服務。

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

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

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

  16. 按一下 [儲存]

gcloud

  1. 建立使用後端服務的網址對應:

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

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

首先,請按照下列步驟確認後端是否正常運作:

控制台

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

    前往 Cloud Service Mesh

    「摘要」會顯示服務是否正常運作。

  2. 然後按一下所需服務的名稱。「服務詳細資料」頁面會顯示後端健康狀態的相關資訊。
  3. 如果後端狀態不佳,可以按一下後端名稱,然後在「VM instance details」(VM 執行個體詳細資料) 頁面上按一下「Reset」(重設),重設後端。

gcloud

使用 compute backend-services get-health 指令,確認後端健康狀態良好:

gcloud compute backend-services get-health td-vm-service \
    --global \
    --format=get(name, healthStatus)

確認後端健康狀態後,請登入已設定為攔截流量並將流量重新導向至 Envoy 的用戶端 VM。向與轉送規則對應關係相關聯的 VIP 傳送 curl 要求。Envoy 會檢查 curl 要求、判斷應解析為哪個服務,並將要求傳送至與該服務相關聯的後端。

控制台

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

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

  2. 選取 td-vm-mig-us-central1 執行個體群組。
  3. 在「連線」下方,按一下「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 負載平衡 (預設負載平衡演算法)。

設定完成後,每個有 Sidecar Proxy 的 Compute Engine VM 都可以使用 HTTP 通訊協定,存取 Cloud Service Mesh 中設定的服務。

如果您按照本指南中的特定範例,使用 Compute Engine VM 範本搭配示範 HTTP 伺服器和服務主機名稱 service-test,請按照下列步驟驗證設定:

  1. 登入已安裝 Sidecar Proxy 的其中一個 VM 主機。
  2. 執行 curl -H 'Host: service-test' 10.0.0.1 指令。 這項要求會傳回為要求提供服務的代管執行個體群組後端主機名稱。

請注意,步驟 2 中可以使用任何 IP 位址。舉例來說,指令 curl -I -H 'Host: service-test' 1.2.3.4 會在步驟 2 中運作。

這是因為轉送規則的位址參數設為 0.0.0.0,這會指示 Cloud Service Mesh 根據網址對應中定義的主機進行比對。在範例設定中,主機名稱為 service-test

後續步驟