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

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

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

事前準備

設定查詢參數式轉送

本例說明如何使用查詢參數,根據查詢字串進行 A/B 測試。

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

如要讓路由功能發揮作用,您必須擁有多個後端。

如要設定兩個後端,您的 VM 必須屬於兩個執行個體群組。本指南說明如何使用已啟動 Apache 的 Linux VM 建立代管執行個體群組,然後設定負載平衡。

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

為求簡單起見,後端會位於相同的區域。如果您想要設定多個區域,則必須為第二個區域設定執行個體範本。

主控台

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

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

    1. 點選「建立執行個體範本」
    2. 在「Name」(名稱) 中輸入 lb-backend-template
    3. 確認「開機磁碟」已設為 Debian 映像檔,例如「Debian GNU/Linux 12 (bookworm)」。這些操作說明使用僅在 Debian 上可用的指令,例如 apt-get
    4. 點選「進階選項」
    5. 按一下「網路」,然後設定下列欄位:
      1. 在「網路標記」中輸入 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. 在「區域��部分,選取偏好的區域。本範例使用 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」(防火牆政策) 頁面。
    前往「防火牆政策」頁面
  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. lb-ipv4-1 的「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"

後續步驟