進階流量管理總覽
本文件適用對象為網格或平台管理員和服務開發人員,他們對 Cloud Service Mesh 和服務網格概念有中級到進階程度的熟悉程度,並決定及設定 Cloud Service Mesh 部署中流量管理方式。
Cloud Service Mesh 提供進階流量管理功能,可讓您精細控管流量的處理方式。Cloud Service Mesh 支援下列用途:
- 將要求精細轉送至一或多項服務。
- 以權重為依據的流量拆分功能,可將流量分配給多項服務。
- 流量鏡射政策會將要求傳送至一個偵錯服務,並複製至另一個服務。
TCPRoute
或TLSRoute
資源不支援流量鏡像。 - 精細調整服務後端的流量分配,以改善負載平衡。
這些進階流量管理功能可協助您達成可用性和效能目標。在這些用途中使用 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 應用程式,以便強制執行您設定的進階流量管理政策。
整體來說,您需要執行以下操作:
- 設定
Mesh
資源,用於識別服務網格。 根據外送要求的特性,設定
Route
資源以執行下列操作:選取要求的轉送後端服務。
視需要執行其他動作。
設定後端服務,以便控管在選取目的地服務後,如何將流量分配至後端和端點。
流量轉送和動作
在 Cloud Service Mesh 中,系統會根據 Mesh
資源、Route
資源和後端服務資源中的值,將流量轉送至後端。所有與路由和動作相關的進階流量管理功能,都是使用 Route
物件設定。
以下各節將說明您可以在 Route
物件中設定的進階流量管理功能。
處理要求
當用戶端傳送要求時,系統會按照下列步驟處理要求:
要求會與特定
Route
資源相符,如下所示:- 如果您使用的是 Envoy:
- HTTP 要求中的主機標頭會與每個
HTTPRoute
或GRPCRoute
資源中的hostnames
欄位進行比對,以便為要求選取正確的Route
資源。只有HTTPRoute
和GRPCRoute
資源有hostnames
欄位。 - 系統會比對 IP 位址,以便使用
TCPPRoute
轉送 TCP 流量。 - 使用
TLSRoute
時,會使用 SNI 和 ALPN 進行 TLS 轉送。 - 與
Mesh
或Gateway
相關聯的HTTPRoute
和GRPCRoute
資源必須有專屬的主機名稱。如果您嘗試附加多個有衝突主機名稱的路由,系統會拒絕設定。 - 同樣地,
TCPRoute
的IP:Port
欄位不得重複,否則設定會遭到拒絕。 - 同樣地,
TLSRoute
的 SNI 和 ALPN 也必須不重複。 - 如果主機名稱重疊,例如
a.example.com
和*.example.com
,要求會比對更明確的路徑。
- HTTP 要求中的主機標頭會與每個
- 如果您使用無 Proxy gRPC:
- 無 Proxy gRPC 用戶端會使用
xds
名稱解析配置。他們會透過傳送要求至 Cloud Service Mesh,解析目標 URI 中的hostname[:port]
。 - 系統只會比較
GRPCRoute
資源的連接埠與目標 URI 中的連接埠 (例如xds:///example.hostname:8080
)。目標 URI 必須與GRPCRoute
的hostnames
欄位中的字串完全相符。
- 無 Proxy gRPC 用戶端會使用
- 如果您使用的是 Envoy:
Route
資源可包含其他轉送資訊和規則。選取目標後端服務後,系統會根據後端服務資源中的設定,將流量分配至該目標後端服務的後端或端點。
請參閱下一節「根據主機和路徑進行簡易轉送」瞭解第二個步驟。第三個步驟請參閱「進階轉送和動作」一節。
根據主機和路徑進行簡易轉送
Cloud Service Mesh 支援簡易的路由配置和更進階的配置。在簡易配置中,您可以指定主機,並視需要指定路徑。系統會評估要求的主機和路徑,進而決定要求要轉送至哪個後端服務。
- 要求的主機是網址的網域名稱部分,例如網址
http://example.com/video/
的主機部分為example.com
。 - 要求的路徑是網址中主機名稱後面的部分,例如網址
http://example.com/video/
的路徑部分是/video
。
您可以在轉送規則對應中,根據主機和路徑設定簡易轉送,轉送規則對應包含下列項目:
- 全域
Mesh
HTTPRoute
或GRPCRoute
大部分的設定都是在 HTTPRoute
中完成。建立初始轉送規則對應後,您只需修改 HTTPRoute
資源即可。
最簡單的規則就是預設規則,您只需指定萬用字元 (*
) 主機規則,以及含有預設服務的路徑比對器。建立預設規則後,您可以新增其他規則來指定不同的主機和路徑。系統會根據下列規則評估傳出要求:
如果要求的主機 (例如
example.com
) 與HTTPRoute
的主機名稱相符:- 系統接著會評估
RouteRule
。RouteRule
會指定如何比對流量,以及在比對流量時如何轉送流量。 - 每個
RouteRule
都包含一或多個路徑比對項目,這些項目會根據要求的路徑進行評估。 - 如果找到相符項目,要求就會轉送至
RouteAction
中指定的服務。
- 系統接著會評估
如要進一步瞭解 HTTPRoute
的資源欄位及其運作方式,請參閱 網路服務 API 說明文件。
進階轉送和動作
如果您想做的不只是根據要求的主機和路徑轉送要求,您可以設定進階規則來轉送要求並執行動作。
整體來說,進階轉送和動作的運作方式如下:
- 與簡易路由一樣,要求的主機會與您在
HTTPRoute
或GRPCRoute
中設定的主機規則進行比較。如果要求的主機與主機名稱相符,系統會評估HTTPRoute
或GRPCRoute
。 - 選取路線後,您就可以套用動作。
進階轉送
進階轉送功能與前述的簡易轉送功能類似,差別在於您可以指定其他比對條件。舉例來說,您可以指定規則在符合標頭名稱的情況下,比對要求的標頭,或是只比對部分標頭名稱 (例如根據前置字串或後置字串)。規則可根據規則運算式或其他條件 (例如檢查標頭是否存在) 評估標頭名稱,然後進行比對。
如要進一步瞭解 headerMatches
和 queryParameterMatches
的其他比對條件和詳細資料,請參閱 network services
REST API 頁面。
您可以將主機、路徑、標頭和查詢參數與比對條件結合,建立符合您確切流量管理需求的高度表達式規則。詳情請參閱下表。
以 HTTP 為基礎的應用程式 | 以 gRPC 為基礎的應用程式 | |
---|---|---|
HTTP 主機與 gRPC 主機 | 主機是應用程式呼叫的網址中網域名稱的部分。 例如,網址 |
主機是用戶端在頻道 URI 中使用的名稱,用於連線至特定服務。 舉例來說,頻道 URI |
HTTP 路徑與 gRPC 路徑 | 路徑是指網址中主機名稱後面的部分。 舉例來說,網址 |
路徑位於 HTTP/2 要求的 舉例來說,如果您在 |
其他 gRPC 標頭 (中繼資料) | gRPC 支援在 gRPC 用戶端和 gRPC 伺服器之間傳送中繼資料,以提供 RPC 呼叫的其他資訊。這類中繼資料的格式為鍵/值組合,會以 HTTP/2 要求中的標頭形式傳送。 |
動作
您可以使用 Cloud Service Mesh 指定 Envoy Proxy 或無 Proxy gRPC 應用程式在處理要求時採取的動作。您可以使用 Cloud Service Mesh 設定下列動作。
動作 | API 欄位名稱 | 說明 |
---|---|---|
重新導向 | redirect |
傳回可設定的 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 1、… 和 Backend 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 服務,而非一般服務。
user-agent
的 Android
進行轉送 (按一下可放大)以權重為依據的流量分配,可讓部署作業更安全
部署現有正式版服務的新版本可能會帶來風險。即使測試環境中的測試已通過,您可能也不想立即將所有使用者轉送至新版本。
Cloud Service Mesh 可讓您定義以權重為準的流量拆分,以便在多個服務中分配流量。舉例來說,您可以將 1% 的流量傳送至新版服務,監控所有服務是否正常運作,然後逐步增加傳送至新服務的流量比例。
用於偵錯的流量鏡像
在偵錯問題時,將實際工作環境流量的副本傳送至偵錯服務可能會有所幫助。Cloud Service Mesh 可讓您設定要求鏡像政策,將要求傳送至某項服務,並將這些要求的複本傳送至另一項服務。
精細調整負載平衡功能以提升效能
視應用程式特性而定,您或許可以透過微調服務後端的流量分配方式,改善效能和可用性。您可以使用 Cloud Service Mesh 套用進階負載平衡演算法,讓系統根據您的需求分配流量。
下圖與前述圖表不同,除了顯示目的地後端服務 (Production Service),還顯示該後端服務的後端 (Virtual Machine 1、Virtual Machine 2、Virtual Machine 3)。透過進階流量管理功能,您可以設定目的地後端服務的選取方式,以及該目的地服務的後端流量分配方式。
如要進一步瞭解如何使用 Cloud Service Mesh 進行負載平衡,請參閱「進階負載平衡總覽」。
後續步驟
- 如要將網格外部的流量引導至網格,請參閱「網格輸入流量」。