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

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

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

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

本指南說明如何手動部署資料層,其中包含 Envoy 附屬 Proxy 和 Compute Engine 虛擬機器 (VM),並使用 Cloud Service Mesh 進行設定,最後驗證設定是否正常運作。這項程序包括:

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

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

設定程序總覽

本節說明在 Compute Engine VM 上執行服務的手動設定程序。用戶端 VM 的設定程序包括在 Compute Engine VM 主機上設定補充 Proxy 和流量攔截。接著,您可以使用Google Cloud 負載平衡 API 設定負載平衡。

本節提供如何從非 Google 管理的第三方來源取得及插入 Envoy 代理伺服器的相關資訊。

當應用程式將流量傳送至 Cloud Service Mesh 中設定的服務時,系統會攔截並將流量重新導向至 xDS API 相容的補充 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) 連線,如此一來,補充 Proxy 可透過 gRPC 連線至 Cloud Service Mesh 控制層。根據預設,系統會啟用通訊埠 443 的傳出連線。

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

  5. 將目的地為服務的 IP 流量重新導向至補充 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. 在「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
    
  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 補充 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. 在「Management」(管理) 分頁中,將下列指令碼複製到「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}"
    
  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. 在「執行個體範本」下方,選取您建立的執行個體範本。
  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 代理程式在兩個後端執行個體之間負載平衡傳出流量。您需要設定下列元件:

建立健康狀態檢查

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

主控台

  1. 在 Google Cloud 控制台中,前往「Health checks」(健康狀態檢查) 頁面。

    前往「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. 選取正確的 VPC 網路。
  6. 請確認「後端類型」(Backend type) 為「Instance groups」(執行個體群組)
  7. 選取您建立的代管執行個體群組。
  8. 輸入正確的通訊埠編號
  9. 選擇「Utilization」(使用率)或「Rate」(比率)做為「Balancing mode」(平衡模式)。預設值為「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,並將 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. 在「Host and path rules」(主機與路徑規則) 部分,選取 td-vm-service 做為服務。

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

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

  15. 在「Service」中選取 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 代理程式,然後將要求轉送至代管 Hello World 服務的 VM。

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

主控台

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

    前往 Cloud Service Mesh

    摘要會顯示服務的健康狀態。

  2. 按一下服務名稱。「服務詳細資料」頁面提供後端健康狀況的相關資訊。
  3. 如果後端處於不健康狀態,請按一下後端名稱,然後在「VM instance details」頁面上按一下「Reset」,即可重設後端。

gcloud

使用 compute backend-services get-health 指令驗證後端是否正常運作:

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

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

主控台

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

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

  2. 選取 td-vm-mig-us-central1 執行個體群組。
  3. 在「Connect」下方,點選「SSH」
  4. 登入用戶端 VM 後,請使用 curl 工具透過 Envoy 向 Hello World 服務傳送要求:

    curl -H "Host: hello-world" http://10.0.0.1/
    

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

設定完成後,每個具有附屬 Proxy 的 Compute Engine VM 都能使用 HTTP 通訊協定存取在 Cloud Service Mesh 中設定的服務。

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

  1. 登入已安裝補充 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

後續步驟