為全域外部應用程式負載平衡器設定流量管理

本文提供一些特定用途的流量管理範例,並使用 YAML 設定。還能用於許多其他用途。

這份文件包含全域外部應用程式負載平衡器的範例。全域外部應用程式負載平衡器使用 EXTERNAL_MANAGED 負載平衡架構和全域負載平衡元件,例如轉送規則、網址對應和後端服務。

如要瞭解如何使用傳統版應用程式負載平衡器管理流量,請參閱「傳統版應用程式負載平衡器的流量管理總覽」。

如要瞭解如何使用區域性外部應用程式負載平衡器進行流量管理,請參閱「區域性外部應用程式負載平衡器流量管理總覽」。

除了本頁面說明的進階轉送功能,支援的應用程式負載平衡器也整合了 Service Extensions,讓您將自訂邏輯插入負載平衡資料路徑。

事前準備

請務必瞭解流量管理的運作方式。 詳情請參閱「全域外部應用程式負載平衡器的流量管理總覽」。

設定及測試流量管理

在所選設定環境中,您可以使用 YAML 設定檔設定流量管理。網址對應和後端服務各有專屬的 YAML 檔案。視所選功能而定,您需要編寫網址對應 YAML 檔案、後端服務 YAML 檔案,或兩者皆是。

如需編寫這些 YAML 檔案的協助,請參閱本頁面的範例和 Cloud Load Balancing API 說明文件。

全球網址對應 API 全球後端服務 API 說明文件提供完整欄位清單,包括關係、限制和基數的語意。

您可以在網址對應中加入設定測試,確保網址對應會按照預期轉送要求。您可以嘗試不同的網址對應規則,並視需要執行多項測試,確保對應會將流量轉送至適當的後端服務或後端 bucket。詳情請參閱「在網址對應中加入測試」。如要測試網址對應的新變更,但不想實際部署對應,請參閱「驗證網址對應設定」。

使用 Google Cloud 控制台中的 YAML 範例

如要在 Google Cloud 控制台中使用 YAML 範例,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。

    前往「Load balancing」(負載平衡)

  2. 點選「建立負載平衡器」
  3. 完成精靈中的步驟,即可建立 global external Application Load Balancer。
  4. 在「轉送規則」設定中,選取「進階主機與路徑規則」
  5. 按一下「新增主機與路徑規則」
  6. 執行下列其中一個步驟:
    • 在「路徑比對器」方塊中,貼上這份文件中的 YAML 範例。
    • 按一下「代碼指引」連結。
    • 系統隨即會顯示「路徑比對器 YAML 範例」頁面。您可以從「路徑比對器 YAML 範例」頁面複製範例,然後貼到「路徑比對器」方塊中。
  7. 按一下 [完成]

將流量對應至單一服務

將所有流量傳送至單一服務。請務必替換預留位置。

    defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
    hostRules:
    - hosts:
      - '*'
      pathMatcher: matcher1
    name: URL_MAP_NAME
    pathMatchers:
    - defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
      name: matcher1
      routeRules:
      - matchRules:
        - prefixMatch: /PREFIX
        priority: PRIORITY  # 0 is highest
        routeAction:
          weightedBackendServices:
          - backendService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
            weight: 100

利用流量拆分技巧,將流量導向兩項服務

將流量拆分給兩項或多項服務。請務必替換預留位置。

   defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
   hostRules:
   - hosts:
     - '*'
     pathMatcher: matcher1
   name: URL_MAP_NAME
   pathMatchers:
   - defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
     name: matcher1
     routeRules:
     - matchRules:
       - prefixMatch: /PREFIX
       priority: 2
       routeAction:
         weightedBackendServices:
         - backendService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
           weight: 95
         - backendService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_2
           weight: 5

設定網址重新導向

下列範例會傳回可設定的 301 MOVED_PERMANENTLY_DEFAULT 回應代碼。範例也會使用適當的 URI 設定 Location 回應標頭,以取代重新導向動作中所指定的主機和路徑。

如要為後端 bucket 建立重新導向,請使用 defaultService 欄位的 projects/PROJECT_ID/global/backendBuckets/BACKEND_BUCKET

   defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
   name: <var>URL_MAP_NAME</var>
   hostRules:
   - hosts:
     - "HOST TO REDIRECT FROM" # Use * for all hosts
     pathMatcher: matcher1
   pathMatchers:
   - defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
     name: matcher1
     defaultUrlRedirect:
       hostRedirect: "HOST TO REDIRECT TO" # Omit to keep the requested host
       pathRedirect: "PATH TO REDIRECT TO" # Omit to keep the requested path
       redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
       stripQuery: True

建立流量鏡射

除了將要求轉送到所選的後端服務外,您也可以射後不理的模式將完全相同的要求傳送至設定的鏡射後端服務。也就是說,負載平衡器不會等待傳送鏡像要求後端的任何回應。要求鏡射很適合用來測試新版本的後端服務。您也可以使用這項功能,針對後端服務的偵錯版本 (而不是正式版本) 偵錯實際工作環境的錯誤。

根據預設,鏡像後端服務會收到所有要求,即使原始流量是拆分至多個加權後端服務也一樣。您可以設定鏡像後端服務,只接收一定比例的要求,方法是使用選用的 mirrorPercent 旗標,指定要鏡像處理的要求百分比 (以 0 到 100.0 之間的值表示)。

   defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
   name: global-lb-map
   hostRules:
   - hosts:
     - '*'
     pathMatcher: matcher1
   pathMatchers:
   - defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
     name: matcher1
     routeRules:
       - matchRules:
           - prefixMatch: /PREFIX
         priority: PRIORITY  # 0 is highest
         routeAction:
           weightedBackendServices:
             - backendService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
               weight: 100
           requestMirrorPolicy:
             backendService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_2
             mirrorPercent: 50.0

如果您有多個加權後端服務,並想記錄用於處理原始要求的後端服務,可以將包含這項資訊的自訂標頭新增至所有要求。以下範例會將名為 x-weighted-picked-backend 的自訂標頭新增至所有用戶端要求。標頭值請使用處理原始要求的後端服務名稱。

   defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
   name: global-lb-map
   hostRules:
   - hosts:
     - '*'
     pathMatcher: matcher1
   pathMatchers:
   - defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
     name: matcher1
     routeRules:
       - matchRules:
           - prefixMatch: /PREFIX
         priority: PRIORITY  # 0 is highest
         routeAction:
           weightedBackendServices:
            - backendService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
              weight: 95
              headerAction:
                requestHeadersToAdd:
                - headerName: x-weighted-picked-backend
                  headerValue: BACKEND_SERVICE_1
                  replace: True
            - backendService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_2
              weight: 5
              headerAction:
                requestHeadersToAdd:
                - headerName: x-weighted-picked-backend
                  headerValue: BACKEND_SERVICE_2
                  replace: True
           requestMirrorPolicy:
             backendService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_3

使用流量鏡像時,請注意下列限制:

  • 如果兩個後端服務都具有代管執行個體群組、區域性 NEG 或混合式 NEG 後端,則支援流量鏡射。不支援網際網路 NEG、無伺服器 NEG 和 Private Service Connect 後端。
  • 對鏡像後端服務的要求不會產生任何 Cloud Logging 和 Cloud Monitoring 的記錄或指標。

重新編寫要求的網址

重新編寫網址的主機名稱部分、網址的路徑部分或兩者均重新編寫,然後再傳送要求至選取的後端服務。請務必替換預留位置。

   defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
   name: global-lb-map
   hostRules:
   - hosts:
     - '*'
     pathMatcher: matcher1
   pathMatchers:
   - defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
     name: matcher1
     routeRules:
       - matchRules:
           - prefixMatch: /PREFIX
         priority: PRIORITY  # 0 is highest
         routeAction:
           weightedBackendServices:
             - backendService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
               weight: 100
           urlRewrite:
             hostRewrite: "new-host-name.com" # Omit to keep the requested host
             pathPrefixRewrite: "/new-path/" # Omit to keep the requested path

重試要求

設定負載平衡器重試失敗要求的條件、負載平衡器在重試前等待的時間,以及允許的重試次數上限。

   defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
   name: global-lb-map
   hostRules:
   - hosts:
     - '*'
     pathMatcher: matcher1
   pathMatchers:
   - defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
     name: matcher1
     routeRules:
       - matchRules:
           - prefixMatch: /PREFIX
         priority: PRIORITY  # 0 is highest
         routeAction:
           weightedBackendServices:
             - backendService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
               weight: 100
           retryPolicy:
             retryConditions: 502, 504
             numRetries: 3
             perTryTimeout:
               seconds: 1
               nanos: 500000000

指定路徑逾時

為所選路徑指定逾時時間。系統會從要求完全處理完畢到回應完全處理完畢的時間,計算逾時時間。逾時 包括所有重試。請務必替換預留位置。

   defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
   name: global-lb-map
   hostRules:
   - hosts:
     - '*'
     pathMatcher: matcher1
   pathMatchers:
   - defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
     name: matcher1
     routeRules:
       - matchRules:
           - prefixMatch: /PREFIX
         priority: PRIORITY  # 0 is highest
         routeAction:
           weightedBackendServices:
             - backendService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
               weight: 100
           timeout:
             seconds: 30
             nanos: 0

設定錯誤植入功能

處理模擬故障的要求時,產生高延遲、服務超載、服務故障和網路分區等錯誤。這項功能可用於測試服務對模擬故障的彈性。

   defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
   name: global-lb-map
   hostRules:
   - hosts:
     - '*'
     pathMatcher: matcher1
   pathMatchers:
   - defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
     name: matcher1
     routeRules:
       - matchRules:
           - prefixMatch: /PREFIX
         priority: PRIORITY  # 0 is highest
         routeAction:
           weightedBackendServices:
             - backendService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
               weight: 100
           faultInjectionPolicy:
             delay:
               fixedDelay:
                 seconds: 10
                 nanos: 0
               percentage: 25
             abort:
               httpStatus: 503
               percentage: 50

設定 Cloud CDN 快取政策

除了後端服務或後端 bucket,您還可以在網址對應的各個層級設定 Cloud CDN 快取政策。您可以根據主機名稱、網址路徑、HTTP 標頭和查詢參數等條件,精細控管快取政策。

您可以在網址對應中支援 routeActiondefaultRouteAction 的任何位置,設定一或多個快取政策。包括下列四個層級的網址對應:

網址對應層級 API 快取政策的套用時機
根層級 urlMap.defaultRouteAction.cachePolicy 如果要求的網址主機名稱與任何現有主機規則不符,就會套用這項規則。
路徑比對器 urlMap.pathMatchers[].defaultRouteAction.cachePolicy 當要求的主機名稱符合主機規則,但沒有任何路徑規則或路由規則相符時,就會套用這項規則。
路徑規則 urlMap.pathMatchers[].pathRules[].routeAction.cachePolicy 要求路徑符合路徑規則時套用。
轉送規則 urlMap.pathMatchers[].routeRules[].routeAction.cachePolicy 當要求的路徑符合轉送規則的路徑、標頭或查詢參數條件時,系統就會套用這項動作。

在網址對應中設定快取政策時,請注意下列事項:

  • 在網址對應的任何層級定義的快取政策,都會優先於特定路徑的後端 cdnPolicy

  • 快取政策不會回溯至網址對應檔較高層級定義的快取政策。舉例來說,如果要求符合特定 routeRule,但該要求缺少快取政策,負載平衡器不會回溯至較高 pathMatcher 層級或根 urlMap 層級定義的快取政策。而是套用 cdnPolicy 中定義的快取設定,該設定是在後端服務或後端 bucket 中設定。

  • 簽署網址動態壓縮只能在後端服務或後端 bucket 中啟用,無法在網址對應中定義。當要求抵達時,負載平衡器會套用網址對應中定義的 cachePolicy。如果該要求轉送至已設定簽署網址或動態壓縮的後端服務或後端 bucket,系統會自動套用這些功能。因此,系統會結合網址對應的快取政策,以及後端的壓縮和經簽署的網址設定,決定要求的最終轉送和快取行為。

在下列網址對應的 YAML 設定中,快取政策是在根層級 urlMappathMatchers 層級和 routeRules 層級設定。

網址對應層級 快取行為
routeRules

如果要求符合 www.example.com,且路徑符合 /users/{username=*}/carts/{cartid=**} 模式,就會轉送至 BACKEND_SERVICE_2

對於這類要求,快取政策會設為 CACHE_ALL_STATIC,也就是說,系統會自動快取圖片、CSS 和 JavaScript 等靜態內容 1 小時 (3600 秒)。此外,這個範例也會明確設定負面快取,將 404 Not Found 錯誤快取 5 分鐘 (300 秒)。

pathMatchers

如果要求符合 www.example.com,但路徑不符合 /users/{username=*}/carts/{cartid=**} 模式,要求就會轉送至 BACKEND_SERVICE_1

這裡的快取政策設為 USE_ORIGIN_HEADERS,表示 Cloud CDN 會依據來源伺服器的 Cache-Control 標頭,判斷要快取哪些內容。cacheKeyPolicy 可確保系統根據通訊協定 (HTTP 與 HTTPS) 和特定主機名稱,建立不同的快取項目。

urlMap

如果要求抵達時,主機名稱完全不相符,要求會轉送至網址對應的預設後端服務 (即 BACKEND_SERVICE_DEFAULT)。

快取政策設為 CACHE_ALL_STATIC,表示靜態內容會快取 1 小時 (3600 秒)。

defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_DEFAULT
# This cache policy is applied if the request hostname does not match
# any hosts specified in the hostRules
defaultRouteAction:
  cachePolicy:
    cacheMode: CACHE_ALL_STATIC
    defaultTtl:
      seconds: 3600
    negativeCaching: true
hostRules:
- hosts:
  - www.example.com
  pathMatcher: cart-matcher
pathMatchers:
- name: cart-matcher
  defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
  # This cache policy is applied if there is a host match but no specific route rule match.
  defaultRouteAction:
    cachePolicy:
      cacheMode: USE_ORIGIN_HEADERS
      cacheKeyPolicy:
        includeProtocol: true
        includeHost: true
  routeRules:
  - description: CartService
    matchRules:
      - pathTemplateMatch: '/users/{username=*}/carts/{cartid=**}'
    service: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_2
    priority: PRIORITY  # 0 is highest
    # This cache policy is applied if there is a route rule match.
    routeAction:
      cachePolicy:
        cacheMode: CACHE_ALL_STATIC
        defaultTtl:
          seconds: 3600
        negativeCaching: true
        negativeCachingPolicy:
          - code: 404
            ttl:
             seconds: 300

如要在網址對應的各個層級設定及管理快取政策,請參閱「設定 Cloud CDN 快取政策」。

設定 CORS

設定跨源資源共享 (CORS) 政策,控管負載平衡器處理跨源要求的方式。

在路徑比對器層級套用的 CORS 政策

在這項設定中,CORS 政策是在路徑比對器 (pathMatchers[].defaultRouteAction.corsPolicy) 的 defaultRouteAction 中定義。這表示無論特定路徑或路由為何,政策都會套用至透過預設路徑比對器路由的所有要求。

如果您希望路徑比對器管理的所有路徑都採用一致的單一 CORS 政策,就適合使用這個方法。

defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
name: global-lb-map
hostRules:
- hosts:
  - '*'
  pathMatcher: path-matcher-1
pathMatchers:
- defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
  name: path-matcher-1
- defaultRouteAction:
    corsPolicy:
      allowCredentials: true
      allowOrigins: [ "http://example.com" ]
      allowMethods: [ "GET", "POST" ]
      allowHeaders: [ "Authorization", "Content-Type" ]

運作方式

  • 負載平衡器會針對路徑比對器處理的所有要求,強制執行 CORS 政策。
  • 系統只允許來自主機 example.com 的要求,且要求必須使用 GET 或 POST 方法,並包含允許的標頭 (Authorization、Content-Type)。
  • 允許在跨來源要求中使用憑證 (例如 Cookie 或授權標頭)。
  • 後端服務只會收到符合這項 CORS 政策的要求。

在路由規則層級套用 CORS 政策

在這個設定中,CORS 政策是在特定路徑規則 (pathMatchers[].routeRules[].routeAction.corsPolicy) 的 routeAction 中定義。這樣一來,您就能對不同路徑或路徑前置碼套用不同的 CORS 政策。

如果您需要精細控管,例如對不同 API 端點或路徑套用不同的 CORS 政策,就適合採用這種做法。

   defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
   name: global-lb-map
   hostRules:
   - hosts:
     - '*'
     pathMatcher: matcher1
   pathMatchers:
   - defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
     name: matcher1
     routeRules:
       - matchRules:
           - prefixMatch: /PREFIX
         priority: PRIORITY  # 0 is highest
         routeAction:
           weightedBackendServices:
             - backendService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
               weight: 100
           corsPolicy:
               allowOrigins: [ "http://example.com" ]
               allowMethods: [ "GET", "POST" ]
               allowHeaders: [ "Authorization", "Content-Type" ]
               maxAge: 1200
               allowCredentials: true

運作方式

  • 只有符合指定路徑前置字元 (例如 /PREFIX) 的要求,才會強制執行 CORS 政策。
  • 只有來自主機 example.com 的要求 (使用 GET 或 POST 方法),以及具有允許標頭的要求,才能使用這條路徑。
  • maxAge 欄位會指定瀏覽器可以快取預檢要求結果的時間長度 (以秒為單位)。
  • 跨原始來源要求中允許使用憑證。
  • 其他路徑可能會有不同的 CORS 政策,或完全沒有政策。

您也可以在網址對應的下列層級定義 CORS 政策:

  • defaultRouteAction.corsPolicy
  • pathMatchers[].pathRules[].routeAction.corsPolicy

新增及移除要求和回應標頭

在將要求傳送至後端服務前,新增及移除要求標頭。從後端服務收到回應後,這項設定也可以新增或刪除回應標頭。

headerNameheaderValue 的有效值設有限制。 詳情請參閱「自訂標頭的運作方式」。

   defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
   name: global-lb-map
   hostRules:
   - hosts:
     - '*'
     pathMatcher: matcher1
   pathMatchers:
   - defaultService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
     name: matcher1
     routeRules:
       - matchRules:
           - prefixMatch: /PREFIX
         priority: PRIORITY  # 0 is highest
         routeAction:
           weightedBackendServices:
             - backendService: projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_1
               headerAction:
                 requestHeadersToAdd:
                 - headerName: header-1-name
                   headerValue: header-1-value
                   replace: True
                 requestHeadersToRemove:
                 - header-2-name
                 - header-3-name
                 responseHeadersToAdd:
                 - headerName: header-4-name
                   headerValue: header-4-value
                   replace: