為傳統版應用程式負載平衡器設定標頭和查詢參數式轉送

本頁提供傳統版應用程式負載平衡器的兩個範例:

如要設定全域外部應用程式負載平衡器和區域外部應用程式負載平衡器的流量管理,請參閱下列頁面:

事前準備

設定查詢參數型轉送

這個範例示範如何使用查詢參數,透過比對查詢字串進行 A/B 測試。

新增兩個後端執行個體群組

如要讓路由發揮效用,您必須有多個後端。

如要設定兩個後端,VM 必須位於兩個執行個體群組中。本指南說明如何建立代管執行個體群組,其中包含執行 Apache 的 Linux VM,然後設定負載平衡。

代管執行個體群組提供的 VM 會執行外部 HTTP 負載平衡器的後端伺服器。為示範之用,後端會提供自己的主機名稱。

為求簡便,後端位於相同區域。如要設定多區域,您必須為第二個區域設定執行個體範本。

控制台

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

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

    1. 按一下「Create instance template」(建立執行個體範本)
    2. 在「Name」(名稱) 中輸入 lb-backend-template
    3. 確認「開機磁碟」設為 Debian 映像檔,例如「Debian GNU/Linux 12 (bookworm)」。這些操作說明中的指令僅適用於 Debian,例如 apt-get
    4. 點選「進階選項」
    5. 按一下「網路」,然後設定下列欄位:
      1. 在「Network tags」(網路標記) 部分,輸入 allow-health-check
    6. 按一下 [Management] (管理)。在「Startup script」(開機指令碼) 欄位中,輸入下列指令碼。

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://metadata.google.internal/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2
      
    7. 點選「建立」

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

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

    1. 點選「建立執行個體群組」
    2. 選取「New managed instance group (stateless)」(新增代管執行個體群組 (無狀態))。詳情請參閱「無狀態或有狀態的 MIG」。
    3. 在「Name」(名稱) 中輸入 first-example-ig
    4. 選取「Location」(位置) 下方的「Single zone」(單一可用區)
    5. 在「Region」(區域),選取偏好的區域。本範例使用 us-east1
    6. 在「Zone」(可用區) 中選取 us-east1-b
    7. 在「Instance template」(執行個體範本) 下方,選取執行個體範本 lb-backend-template
    8. 在「Maximum number of instances」(執行個體數量上限) 下方,輸入 2
    9. 在「Autoscaling mode」(自動調度資源模式) 下方,選取 Off:do not autoscale
    10. 點選「建立」

建立另一個類似的代管執行個體群組。將第二個命名為 second-example-ig,並以 lb-backend-template 範本為基礎。

gcloud

  1. 建立執行個體範本。

    gcloud compute instance-templates create lb-backend-template \
       --region=us-east1 \
       --network=default \
       --subnet=default \
       --tags=allow-health-check \
       --image-family=debian-12 \
       --image-project=debian-cloud \
       --metadata=startup-script='#! /bin/bash
         apt-get update
         apt-get install apache2 -y
         a2ensite default-ssl
         a2enmod ssl
         vm_hostname="$(curl -H "Metadata-Flavor:Google" \
         http://metadata.google.internal/computeMetadata/v1/instance/name)"
         echo "Page served from: $vm_hostname" | \
         tee /var/www/html/index.html
         systemctl restart apache2'
    
  2. 依據範本建立第一個代管執行個體群組。

    gcloud compute instance-groups managed create first-example-ig \
       --template=lb-backend-template --size=2 --zone=us-east1-b
    
  3. 依據範本建立第二個代管執行個體群組。

    gcloud compute instance-groups managed create second-example-ig \
       --template=lb-backend-template --size=2 --zone=us-east1-c
    

設定防火牆規則

在本範例中,您會建立 fw-allow-health-check 防火牆規則。這是輸入規則,允許來自 Google Cloud 健康狀態檢查系統 (130.211.0.0/2235.191.0.0/16) 的流量。本範例使用目標標記 allow-health-check 識別 VM。

控制台

  1. 前往 Google Cloud 控制台的「Firewall policies」(防火牆政策) 頁面。
    前往「Firewall policies」(防火牆政策)
  2. 按一下「Create firewall rule」(建立防火牆規則),建立第二個防火牆規則:
  3. 輸入 fw-allow-health-check 的「Name」(名稱)
  4. 在「Network」(網路) 下方選取 Default
  5. 在「Targets」(目標) 下方,選取「Specified target tags」(指定的目標標記)
  6. 在「Target tags」(目標標記) 欄位填入 allow-health-check
  7. 將「Source filter」(來源篩選器) 設為「IPv4 ranges」(IPv4 範圍)
  8. 將「Source IPv4 ranges」(來源 IPv4 範圍) 設為 130.211.0.0/2235.191.0.0/16
  9. 在「Protocols and ports」(通訊協定和通訊埠) 下方,選取「Specified protocols and ports」(指定的通訊協定和通訊埠)
  10. 勾選「TCP」TCP核取方塊,然後輸入 80 做為通訊埠編號。
  11. 點選「建立」

gcloud

gcloud compute firewall-rules create fw-allow-health-check \
    --network=default \
    --action=allow \
    --direction=ingress \
    --source-ranges=130.211.0.0/22,35.191.0.0/16 \
    --target-tags=allow-health-check \
    --rules=tcp

保留外部 IP 位址

現在執行個體已開始執行,請設定全域靜態外部 IP 位址,客戶即可透過該位址連線至您的負載平衡器。

控制台

  1. 前往 Google Cloud 控制台的「External IP addresses」(外部 IP 位址) 頁面。
    前往「External IP addresses」(外部 IP 位址) 頁面
  2. 按一下「Reserve static address」(預留靜態位址) 以預留 IPv4 位址。
  3. 將「Name」(名稱) 指派為 lb-ipv4-1
  4. 將「Network tier」(網路級別) 設為「Standard」(標準)
  5. 將「IP version」(IP 版本) 設為「IPv4」
  6. 將「Type」(類型) 設為「Global」(通用)
  7. 按一下「保留」
  8. 確定「Type」(類型) 已設為「Global」(通用)。
  9. 按一下「保留」

gcloud

gcloud compute addresses create lb-ipv4-1 \
    --ip-version=IPV4 \
    --network-tier=PREMIUM \
    --global

請記下預留的 IPv4 位址:

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

設定負載平衡器後端

控制台

Google Cloud 控制台目前不支援設定標頭式和參數式轉送。請改用 gcloud 或 API。

gcloud

  1. 建立健康狀態檢查
        gcloud compute health-checks create http http-basic-check \
            --port 80
        
  2. 建立第一個後端服務
    • 如果採用全域外部應用程式負載平衡器,請使用 gcloud CLI 指令搭配 load-balancing-scheme=EXTERNAL_MANAGED。這項設定提供進階流量管理功能
    • 如果採用傳統版應用程式負載平衡器,請使用 load-balancing-scheme=EXTERNAL
        gcloud compute backend-services create service-a \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  3. 建立第二個後端服務
        gcloud compute backend-services create service-b \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  4. 將第一個執行個體群組新增至第一個後端服務,做為後端。
        gcloud compute backend-services add-backend service-a \
            --balancing-mode=UTILIZATION \
            --max-utilization=0.8 \
            --capacity-scaler=1 \
            --instance-group=first-example-ig \
            --instance-group-zone=us-east1-b \
            --global
        
  5. 將第二個執行個體群組新增至第二個後端服務,做為後端。
        gcloud compute backend-services add-backend service-b \
            --balancing-mode=UTILIZATION \
            --max-utilization=0.8 \
            --capacity-scaler=1 \
            --instance-group=second-example-ig \
            --instance-group-zone=us-east1-c \
            --global
        

建立網址對應

控制台

Google Cloud 控制台目前不支援設定標頭式和參數式轉送。請改用 gcloud 或 API。

gcloud

  1. 建立 YAML 檔案 /tmp/web-map-http.yaml。並將 PROJECT_ID 替換成您的專案 ID。

    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    hostRules:
    - hosts:
      - '*'
      pathMatcher: path-matcher-1
    name: web-map-http
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      name: path-matcher-1
      routeRules:
        - matchRules:
            - prefixMatch: /
              queryParameterMatches:
                - name: ABTest
                  exactMatch: A
          priority: 0
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
        - matchRules:
            - prefixMatch: /
              queryParameterMatches:
                - name: ABTest
                  exactMatch: B
          priority: 1
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    tests:
    - description: Test routing for query ABTest with A
      host: example.com
      path: /?ABTest=A
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      expectedOutputUrl: http://example.com/?ABTest=A
    - description: Test routing for query ABTest with B
      host: example.com
      path: /?ABTest=B
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
      expectedOutputUrl: http://example.com/?ABTest=B
    
  2. 驗證網址對應。

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    如果測試通過且指令輸出成功訊息,請將變更儲存至網址對應。

  3. 更新網址對應。

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

建立目標 Proxy 和轉送規則

控制台

Google Cloud 控制台目前不支援設定標頭式和參數式轉送。請改用 gcloud 或 API。

gcloud

  1. 建立目標 HTTP Proxy,將要求轉送至網址對應。
        gcloud compute target-http-proxies create http-lb-proxy \
            --url-map web-map-http
        
  2. 建立全域轉送規則,將連入要求轉送至 Proxy。
    • 如果採用全域外部應用程式負載平衡器,請使用 gcloud CLI 指令搭配 load-balancing-scheme=EXTERNAL_MANAGED。這項設定提供進階流量管理功能
    • 如果採用傳統版應用程式負載平衡器,請使用 load-balancing-scheme=EXTERNAL
        gcloud compute forwarding-rules create http-content-rule \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --network-tier=PREMIUM \
            --address=lb-ipv4-1 \
            --global \
            --target-http-proxy=http-lb-proxy \
            --ports=80
        

測試

請記下預留的 IPv4 位址:

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

執行下列指令,測試這項設定:

curl http://IP_ADDRESS?ABTest=A
curl http://IP_ADDRESS?ABTest=B

在瀏覽器中開啟 http://IP_ADDRESS?ABTest=Ahttp://IP_ADDRESS?ABTest=B

設定以 HTTP 標頭為準的路由

這個範例示範如何新增及移除 HTTP 標頭,以執行智慧型路由。

事前準備

您可以使用現有的外部應用程式負載平衡器,也可以建立新的負載平衡器。

這項功能適用於任何支援的後端類型。這個範例假設您使用的是執行個體群組中的 VM。

如要設定簡易的負載平衡器,請參閱上方的查詢參數範例。

更新網址對應

控制台

Google Cloud 控制台目前不支援設定標頭式和參數式轉送。請改用 gcloud 或 API。

gcloud

  1. 這個範例說明如何使用 HTTP 要求標頭,根據要求 HTTP 標頭中的值進行比對,藉此執行 A/B 測試。

    建立 YAML 檔案 /tmp/web-map-http.yaml。並將 PROJECT_ID 替換成您的專案 ID。

    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    kind: compute#urlMap
    name: web-map-http
    hostRules:
    - hosts:
      - '*'
      pathMatcher: path-matcher-1
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      name: path-matcher-1
      routeRules:
        - matchRules:
            - prefixMatch: /
              headerMatches:
                - headerName: ABTest
                  exactMatch: A
          priority: 0
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
        - matchRules:
            - prefixMatch: /
              headerMatches:
                - headerName: ABTest
                  exactMatch: B
          priority: 1
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    tests:
    - description: Test routing for query ABTest with A
      host: example.com
      path: /
      headers:
      - name: ABTest
        value: A
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    - description: Test routing for query ABTest with B
      host: example.com
      path: /
      headers:
      - name: ABTest
        value: B
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    
  2. 驗證網址對應。

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    如果測試通過且指令輸出成功訊息,請將變更儲存至網址對應。

  3. 更新網址對應。

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

測試

使用相關聯負載平衡器的 IPv4 位址,執行下列指令來測試這項設定:

curl http://IP_ADDRESS -H "ABTest: A"
curl http://IP_ADDRESS -H "ABTest: B"

後續步驟