進階流量管理總覽

本文件適用對象為網格或平台管理員和服務開發人員,他們對 Cloud Service Mesh 和服務網格概念有中級到進階程度的熟悉程度,並決定及設定 Cloud Service Mesh 部署中流量管理方式。

Cloud Service Mesh 提供進階流量管理功能,可讓您精細控管流量的處理方式。Cloud Service Mesh 支援下列用途

  • 將要求精細轉送至一或多項服務。
  • 以權重為依據的流量拆分功能,可將流量分配給多項服務。
  • 流量鏡射政策會將要求傳送至一個偵錯服務,並複製至另一個服務。TCPRouteTLSRoute 資源不支援流量鏡像。
  • 精細調整服務後端的流量分配,以改善負載平衡。

這些進階流量管理功能可協助您達成可用性和效能目標。在這些用途中使用 Cloud Service Mesh 的好處之一,就是您可以更新流量管理方式,而無需修改應用程式程式碼。

Cloud Service Mesh 服務網格中的流量管理功能需要下列資源:

  • Mesh 資源,可識別服務網狀網路,並代表負責轉送流量和套用政策的元件。Mesh 資源也會識別流量攔截埠。
  • Gateway 資源:用於識別中介 Proxy,並代表會聽取 IP 位址:通訊埠組合清單、轉送流量及套用政策的元件。
  • Route 資源,可為多種類型之一,其中包含網格流量路由資訊。Route 資源會識別主機名稱和通訊埠,用戶端可使用這些資訊將流量路由至後端服務。以下是 Route 資源的類型:
    • HTTPRoute,僅適用於使用 Envoy Proxy 的網格。使用 HTTPRoute 資源設定 Envoy Proxy 以傳送 HTTP 要求時,您可以使用本文中的所有功能。
    • TCPRoute,僅適用於使用 Envoy Proxy 的 Mesh。
    • TLSRoute,僅適用於使用 Envoy Proxy 的 Mesh。
    • GRPCRoute,可在使用 Envoy Sidecar Proxy 和無 Proxy gRPC 的網格中使用。在 Cloud Service Mesh 中使用無 Proxy gRPC 服務或應用程式時,您將無法使用本文件中說明的部分功能。
  • Route 資源相關聯的後端服務

設定

如要設定進階流量管理,請使用設定 Cloud Service Mesh 時使用的 Route 和後端服務資源。接著,Cloud Service Mesh 會設定 Envoy Proxy 和無 Proxy gRPC 應用程式,以便強制執行您設定的進階流量管理政策。

整體來說,您需要執行以下操作:

  1. 設定 Mesh 資源,用於識別服務網格。
  2. 根據外送要求的特性,設定 Route 資源以執行下列操作:

    1. 選取要求的轉送後端服務。

    2. 視需要執行其他動作。

  3. 設定後端服務,以便控管在選取目的地服務後,如何將流量分配至後端和端點。

流量轉送和動作

在 Cloud Service Mesh 中,系統會根據 Mesh 資源、Route 資源和後端服務資源中的值,將流量轉送至後端。所有與路由和動作相關的進階流量管理功能,都是使用 Route 物件設定。

以下各節將說明您可以在 Route 物件中設定的進階流量管理功能。

處理要求

當用戶端傳送要求時,系統會按照下列步驟處理要求:

  1. 要求會與特定 Route 資源相符,如下所示:

    • 如果您使用的是 Envoy:
      • HTTP 要求中的主機標頭會與每個 HTTPRouteGRPCRoute 資源中的 hostnames 欄位進行比對,以便為要求選取正確的 Route 資源。只有 HTTPRouteGRPCRoute 資源有 hostnames 欄位。
      • 系統會比對 IP 位址,以便使用 TCPPRoute 轉送 TCP 流量。
      • 使用 TLSRoute 時,會使用 SNI 和 ALPN 進行 TLS 轉送。
      • MeshGateway 相關聯的 HTTPRouteGRPCRoute 資源必須有專屬的主機名稱。如果您嘗試附加多個有衝突主機名稱的路由,系統會拒絕設定。
      • 同樣地,TCPRouteIP:Port 欄位不得重複,否則設定會遭到拒絕。
      • 同樣地,TLSRoute 的 SNI 和 ALPN 也必須不重複。
      • 如果主機名稱重疊,例如 a.example.com*.example.com,要求會比對更明確的路徑。
    • 如果您使用無 Proxy gRPC:
      • 無 Proxy gRPC 用戶端會使用 xds 名稱解析配置。他們會透過傳送要求至 Cloud Service Mesh,解析目標 URI 中的 hostname[:port]
      • 系統只會比較 GRPCRoute 資源的連接埠與目標 URI 中的連接埠 (例如 xds:///example.hostname:8080)。目標 URI 必須與 GRPCRoutehostnames 欄位中的字串完全相符。
  2. Route 資源可包含其他轉送資訊和規則。

  3. 選取目標後端服務後,系統會根據後端服務資源中的設定,將流量分配至該目標後端服務的後端或端點。

請參閱下一節「根據主機和路徑進行簡易轉送」瞭解第二個步驟。第三個步驟請參閱「進階轉送和動作」一節。

根據主機和路徑進行簡易轉送

Cloud Service Mesh 支援簡易的路由配置和更進階的配置。在簡易配置中,您可以指定主機,並視需要指定路徑。系統會評估要求的主機和路徑,進而決定要求要轉送至哪個後端服務。

  • 要求的主機是網址的網域名稱部分,例如網址 http://example.com/video/ 的主機部分為 example.com
  • 要求的路徑是網址中主機名稱後面的部分,例如網址 http://example.com/video/ 的路徑部分是 /video

您可以在轉送規則對應中,根據主機和路徑設定簡易轉送,轉送規則對應包含下列項目:

  • 全域 Mesh
  • HTTPRouteGRPCRoute

大部分的設定都是在 HTTPRoute 中完成。建立初始轉送規則對應後,您只需修改 HTTPRoute 資源即可。

最簡單的規則就是預設規則,您只需指定萬用字元 (*) 主機規則,以及含有預設服務的路徑比對器。建立預設規則後,您可以新增其他規則來指定不同的主機和路徑。系統會根據下列規則評估傳出要求:

  • 如果要求的主機 (例如 example.com) 與 HTTPRoute 的主機名稱相符:

    1. 系統接著會評估 RouteRuleRouteRule 會指定如何比對流量,以及在比對流量時如何轉送流量。
    2. 每個 RouteRule 都包含一或多個路徑比對項目,這些項目會根據要求的路徑進行評估。
    3. 如果找到相符項目,要求就會轉送至 RouteAction 中指定的服務。

如要進一步瞭解 HTTPRoute 的資源欄位及其運作方式,請參閱 網路服務 API 說明文件

進階轉送和動作

如果您想做的不只是根據要求的主機和路徑轉送要求,您可以設定進階規則來轉送要求並執行動作。

整體來說,進階轉送和動作的運作方式如下:

  1. 與簡易路由一樣,要求的主機會與您在 HTTPRouteGRPCRoute 中設定的主機規則進行比較。如果要求的主機與主機名稱相符,系統會評估 HTTPRouteGRPCRoute
  2. 選取路線後,您就可以套用動作。

進階轉送

進階轉送功能與前述的簡易轉送功能類似,差別在於您可以指定其他比對條件。舉例來說,您可以指定規則在符合標頭名稱的情況下,比對要求的標頭,或是只比對部分標頭名稱 (例如根據前置字串或後置字串)。規則可根據規則運算式或其他條件 (例如檢查標頭是否存在) 評估標頭名稱,然後進行比對。

如要進一步瞭解 headerMatchesqueryParameterMatches 的其他比對條件和詳細資料,請參閱 network services REST API 頁面。

您可以將主機、路徑、標頭和查詢參數與比對條件結合,建立符合您確切流量管理需求的高度表達式規則。詳情請參閱下表。

以 HTTP 為基礎的應用程式 以 gRPC 為基礎的應用程式
HTTP 主機與 gRPC 主機

主機是應用程式呼叫的網址中網域名稱的部分。

例如,網址 http://example.com/video/ 的主機部分為 example.com

主機是用戶端在頻道 URI 中使用的名稱,用於連線至特定服務。

舉例來說,頻道 URI xds:///example.com 的主機部分為 example.com

HTTP 路徑與 gRPC 路徑

路徑是指網址中主機名稱後面的部分。

舉例來說,網址 http://example.com/video 的路徑部分為 /video

路徑位於 HTTP/2 要求的 :path 標頭中,如下所示:/SERVICE_NAME/METHOD_NAME

舉例來說,如果您在 Example gRPC 服務上呼叫 Download 方法,:path 標頭的內容會類似 /Example/Download

其他 gRPC 標頭 (中繼資料) gRPC 支援在 gRPC 用戶端和 gRPC 伺服器之間傳送中繼資料,以提供 RPC 呼叫的其他資訊。這類中繼資料的格式為鍵/值組合,會以 HTTP/2 要求中的標頭形式傳送。

動作

您可以使用 Cloud Service Mesh 指定 Envoy Proxy 或無 Proxy gRPC 應用程式在處理要求時採取的動作。您可以使用 Cloud Service Mesh 設定下列動作。

動作 API 欄位名稱 說明
重新導向 redirect [pathredirect?] 傳回可設定的 3xx 回應碼。此外,它也會使用適當的 URI 來設定 Location 回應標頭,以取代重新導向動作中所指定的主機和路徑。
網址重寫 urlRewrite 在傳送要求至所選後端服務之前,重新編寫網址的主機名稱部分、網址的路徑部分或兩者皆重新編寫。
標頭轉換 requestHeaderModifier/responseHeaderModifier? 在傳送要求至後端服務之前,新增或移除要求標頭。從後端服務收到回應後,這項設定也可以新增或刪除回應標頭。
流量鏡像 requestMirrorPolicy

除了將要求轉送到所選的後端服務外,也會以射後不理的模式,將完全相同的要求傳送至設定的鏡射後端服務。負載平衡器不會等待從後端傳送鏡像要求的回應。

鏡射很適合用來測試新版本的後端服務。您也可以使用這項功能,針對後端服務的偵錯版本 (而不是正式版本) 偵錯實際工作環境的錯誤。

依權重分配流量 weightDestination.serviceName

可將相符規則的流量分配給多個後端服務,並與指派給個別後端服務的使用者定義權重成正比。

這項功能對於設定分階段部署或 A/B 測試非常實用。例如,轉送動作可以設定為將 99% 的流量傳送到執行穩定版應用程式的服務,而將 1% 的流量傳送到執行較新版應用程式的不同服務。

重試 retryPolicy 設定負載平衡器重試失敗要求的條件、負載平衡器在重試前等待的時間,以及允許的重試次數上限。
逾時 timeout 指定所選路徑的逾時時間。系統會從要求完成處理的時間開始計算逾時時間,直到回應完成處理為止。逾時時間包括所有重試時間。
錯誤植入 faultInjectionPolicy 處理模擬故障的要求時,會引入高延遲、服務超載、服務故障和網路分區等錯誤。這項功能可用於測試服務對模擬故障的彈性。
安全性政策 corsPolicy 跨來源資源共享 (CORS) 政策會處理用於強制執行 CORS 要求的設定。

如要進一步瞭解動作及其運作方式,請參閱 網路服務 API 頁面。

您可以在每個路由規則中指定下列其中一個路由動作:

  • 將流量轉送至單一服務 (destination.serviceName)
  • 利用流量拆分技巧,將流量導向多項服務 (destination.weight)
  • 重新導向網址 (redirect)

此外,您可以將上述任一轉送動作與下列一或多個轉送動作 (在 Google Cloud 控制台中稱為外掛動作) 結合:

  • 操控要求或回應標頭 (requestHeaderModifier/responseHeaderModifier)
  • 鏡像流量 (requestMirrorPolicy)
  • 重寫網址主機、路徑或兩者 (urlRewrite)
  • 重試失敗的要求 (retryPolicy)
  • 設定逾時 (timeout)
  • 對流量的百分比導入錯誤 (faultInjectionPolicy)
  • 新增 CORS 政策 (corsPolicy)

由於動作與特定規則相關聯,因此 Envoy Proxy 或無 Proxy gRPC 應用程式可以根據所處理的要求套用不同的動作。

將流量分配給服務的後端

要求處理一節所述,當用戶端處理外送要求時,會先選取目的地服務。選取目的地服務後,就必須判斷應由哪個後端或端點接收要求。

在後端之間分配流量。
在後端之間分配流量 (按一下可放大)

在上圖中,規則已簡化。規則通常是主機規則、路徑比對器,以及一或多個路徑或路由規則。目的地服務為「(後端) 服務」Backend 1Backend n 會接收並處理要求。這些後端可能會是託管伺服器端應用程式程式碼的 Compute Engine 虛擬機器 (VM) 執行個體。

根據預設,處理要求的用戶端會將要求傳送至最近且具有可用容量的健康後端。為避免特定後端超載,它會使用循環制負載平衡演算法,在目的地服務的其他後端之間負載平衡後續要求。不過,在某些情況下,您可能會想要進一步控管這項行為。

負載平衡、工作階段相依性和保護後端

您可以在各項服務上設定下列流量分配政策。

政策 API 欄位名稱 說明
負載平衡模式 balancingMode 控制在選取目的地服務後,如何選取網路端點群組 (NEG) 或代管執行個體群組 (MIG)。您可以設定平衡模式,根據並行連線和要求頻率分配負載。
負載平衡政策 localityLbPolicy 設定負載平衡演算法,用於在 NEG 或 MIG 中的後端之間分配流量。如要改善效能,您可以選擇各種演算法 (例如輪流或最少要求)。
工作階段相依性 sessionAffinity

盡可能嘗試將來自特定用戶端的要求傳送至同一個後端,前提是後端的健康狀態良好且具有容量。

Cloud Service Mesh 支援四種工作階段相依性選項:用戶端 IP 位址、HTTP Cookie 型、HTTP 標頭型,以及產生的 Cookie 相依性 (由 Cloud Service Mesh 自行產生)。

一致的雜湊 consistentHash 根據 HTTP 標頭、Cookie 或其他屬性提供軟性工作階段相依性。
斷路器 circuitBreakers 設定後端服務連線量以及每個後端服務連線的要求數量上限。
離群值偵測 outlierDetection 指定 (1) 從 MIG 或 NEG 移除健康狀態不良的後端或端點,以及 (2) 在後端或端點被視為健康狀態良好,足以再次接收流量時,將其重新加入。與服務相關聯的健康狀態檢查會判斷後端或端點是否為健康狀態。

如要進一步瞭解不同的流量分配選項及其運作方式,請參閱下列文件:

應用實例範例

進階流量管理可因應許多用途,本節將提供一些概略的範例。

如需更多範例 (包括程式碼範例),請參閱「使用 Envoy 設定進階流量管理」和「使用無 Proxy gRPC 服務設定進階流量管理」。

精細的流量路由,可用於個人化

您可以根據要求的參數,將流量轉送至服務。舉例來說,您可以使用這項服務為 Android 使用者提供更個人化的體驗。在下圖中,Cloud Service Mesh 會設定服務網狀結構,將含有 user-agent:Android 標頭的要求傳送至 Android 服務,而非一般服務。

根據設為 Android 的使用者代理程式標頭進行轉送。
根據設為 user-agentAndroid 進行轉送 (按一下可放大)

以權重為依據的流量分配,可讓部署作業更安全

部署現有正式版服務的新版本可能會帶來風險。即使測試環境中的測試已通過,您可能也不想立即將所有使用者轉送至新版本。

Cloud Service Mesh 可讓您定義以權重為準的流量拆分,以便在多個服務中分配流量。舉例來說,您可以將 1% 的流量傳送至新版服務,監控所有服務是否正常運作,然後逐步增加傳送至新服務的流量比例。

Cloud Service Mesh 以權重為依據的流量拆分。
Cloud Service Mesh 以權重為依據的流量分配 (按一下即可放大)

用於偵錯的流量鏡像

在偵錯問題時,將實際工作環境流量的副本傳送至偵錯服務可能會有所幫助。Cloud Service Mesh 可讓您設定要求鏡像政策,將要求傳送至某項服務,並將這些要求的複本傳送至另一項服務。

Cloud Service Mesh 流量鏡像。
Cloud Service Mesh 流量鏡像 (按一下可放大)

精細調整負載平衡功能以提升效能

視應用程式特性而定,您或許可以透過微調服務後端的流量分配方式,改善效能和可用性。您可以使用 Cloud Service Mesh 套用進階負載平衡演算法,讓系統根據您的需求分配流量。

下圖與前述圖表不同,除了顯示目的地後端服務 (Production Service),還顯示該後端服務的後端 (Virtual Machine 1Virtual Machine 2Virtual Machine 3)。透過進階流量管理功能,您可以設定目的地後端服務的選取方式,以及該目的地服務的後端流量分配方式。

Cloud Service Mesh 負載平衡。
Cloud Service Mesh 負載平衡 (按一下可放大)

如要進一步瞭解如何使用 Cloud Service Mesh 進行負載平衡,請參閱「進階負載平衡總覽」。

後續步驟