ASM通過流量泳道組(ASMSwimLaneGroup)和流量泳道(ASMSwimLane)兩種資源實現針對服務調用鏈路的流量泳道能力。流量泳道能夠將應用的相關版本(或者其他特徵)隔離成一個獨立的運行環境(即泳道),然後通過設定泳道引流規則,將滿足規則的請求流量路由到目標版本(或者其他特徵)的應用上。
配置樣本
以下配置表示為Kubernetes叢集中default命名空間下的服務mocka、mockb、mockc建立一個名為mock的泳道組。泳道組中包含v1和v2兩條流量泳道,分別對應這些服務的v1和v2版本(通過Pod上的version標籤區分版本)。當mocka、mockb、mockc相互發送請求時,將只會調用相同版本的服務,保證v1和v2版本的隔離。同時,基於istio-system下名為ingressgateway的網關規則建立虛擬服務,為兩條泳道進行引流。
ASMSwimLaneGroup欄位說明
ASMSwimLaneGroup定義了一個流量泳道組。流量泳道組主要定義多條流量泳道需要共用的資訊,包括需要為哪些服務建立流量泳道隔離環境、泳道引流的虛擬服務規則需要基於哪個網關規則建立等。一個流量泳道組可以與多個流量泳道建立關聯,流量泳道可以通過swimlane-group: {ASMSwimLaneGroup名稱}
的方式關聯泳道組。
ASMSwimLaneGroupSpec
ASMSwimLaneGroupSpec是ASMSwimLaneGroup的核心配置,即spec欄位的部分。
欄位 | 類型 | 是否必選 | 說明 |
services | 是 | 指定需要為K8s叢集中的哪些服務建立泳道隔離環境。通過K8s Service的名稱、命名空間、所在K8s叢集ID與叢集名稱來引用K8s叢集中的服務。 | |
ingress | 是 | 指定流量泳道組的入口網關的相關配置。入口網關的主要作用是為泳道組中的多個版本服務進行引流。 | |
isPermissive | bool | 否 | 指定流量泳道組的模式。取值如下:
關於strict 模式和寬鬆模式的流量泳道的詳情,請參見流量泳道概述。 |
permissiveModeConfiguration | 否 | 寬鬆模式下泳道組的相關配置,當泳道組模式為寬鬆模式時必須配置。 |
ClusterServiceRef
每個ClusterServiceRef引用一個部署在K8s叢集中的Service。流量泳道通過這些引用決定為哪些服務建立流量隔離環境。
欄位 | 類型 | 是否必選 | 說明 |
name | string | 是 | K8s Service的名稱。 |
namespace | string | 是 | K8s Service所在的命名空間。 |
cluster | 否 | K8s叢集的引用資訊。 |
ClusterRef
ClusterRef提供一個添加到ASM執行個體中的K8s叢集的引用資訊。
欄位 | 類型 | 是否必選 | 說明 |
name | string | 否 | K8s叢集的顯示名稱。 |
id | string | 否 | K8s叢集的叢集ID。 |
SwimLaneGroupIngressConfiguration
SwimLaneGroupIngressConfiguration定義了為泳道組內服務進行引流的入口網關的相關資訊。
欄位 | 類型 | 是否必選 | 說明 |
gateway | 是 | 與入口網關關聯的網關規則(Gateway)的相關資訊。 | |
ingressRouting | 否 | 對泳道組內服務進行引流的引流規則相關配置。 說明 使用此欄位需要網格執行個體版本在1.21.6.92及以上。 |
SwimLaneGatewayConfiguration
SwimLaneGatewayConfiguration定義了與入口網關相關聯的網關規則(Gateway)的相關資訊。
欄位 | 類型 | 是否必選 | 說明 |
name | string | 是 | 網關規則的名稱。 |
namespace | string | 是 | 網關規則所在命名空間。 |
type | string | 是 | 網關規則的類型,必須填寫為 |
SwimLaneGroupIngressRouteConfiguration
SwimLaneGroupIngressRouteConfiguration定義了對泳道組內服務進行引流的引流規則相關配置。
欄位 | 類型 | 是否必填 | 說明 |
ingressRoutingStrategy | string | 否 | 對泳道組內服務進行引流的策略,可以指定兩個選項:
|
weightedRoutingRule | 否 | 在基於權重的引流策略下,匹配所有請求時使用的統一匹配規則。僅在ingressRoutingStrategy值為weighted時起效。 |
WeightedSwimLaneIngressConfiguration
WeightedSwimLaneIngressConfiguration指定了基於權重的引流策略下匹配所有請求時使用的統一匹配規則。
欄位 | 類型 | 是否必填 | 說明 |
hosts | []string | 是 | 匹配請求的網域名稱,該網域名稱必須聲明在泳道組關聯的網關規則(Gateway)中。 |
requestMatches | 否 | 對請求URI及要求標頭進行匹配的匹配條件。 |
PermissiveSwimLaneGroupConfiguration
PermissiveSwimLaneGroupConfiguration定義了在寬鬆模式下,流量泳道組需要指定的參數。
欄位 | 類型 | 是否必選 | 說明 |
routeHeader | string | 是 | 寬鬆模式下,流量泳道的引流要求標頭名稱。 引流要求標頭用於請求在請求調用鏈路中傳遞時確定請求所處泳道。 在寬鬆模式下,請求經入口網關轉寄到達上遊服務時,必須攜帶引流要求標頭,以確定請求所處泳道。 |
traceHeader | string | 是 | 寬鬆模式下,流量泳道使用的鏈路透傳要求標頭名稱。 鏈路透傳要求標頭必須具有以下性質:
|
fallbackTarget | string | 否 | 寬鬆模式下的基準泳道名稱。當路由到泳道對應版本的服務失敗時,流量將回退到服務的基準版本。 |
ASMSwimLane欄位說明
ASMSwimLane定義一條流量泳道。流量泳道定義主要包含與服務的具體版本(或其他特徵)相關的資訊。一條流量泳道通過打上swimlane-group: {ASMSwimLaneGroup名稱}
標籤的方式與一個泳道組建立關聯。
ASMSwimLaneSpec
ASMSwimLaneSpec是ASMSwimLane的核心配置,即spec的部分。
欄位 | 類型 | 是否必選 | 說明 |
labelSelector | map<string, string> | 是 | 一個或多個標籤,用來匹配屬於此泳道的服務Pod。一般使用帶有版本資訊的標籤對泳道內的Pod進行匹配,如 |
services | 否 | 指定泳道內部署了哪些服務。和ASMSwimLaneGroupSpec中的services欄位相同,通過K8s Service的名稱、命名空間、所在K8s叢集ID與叢集名稱來引用K8s叢集中的服務。
| |
ingressRules | 否 | 泳道對應的引流規則定義。該引流規則定義將轉化為泳道組關聯的入口網關上的虛擬服務資源,負責將請求從網關上路由到泳道中的服務。 如果不填寫ingressRules欄位,也可以手動建立網關上的虛擬服務資源為泳道內的服務引流。 | |
ingressWeight | 否 | 當泳道組使用基於權重的引流策略時,使用此欄位指定每條泳道對應的引流權重比例。泳道組將依據不同泳道聲明的引流權重向該條泳道的入口服務轉寄一定比例的請求。僅當ingressRoutingStrategy值為weighted時起效。 |
SwimLaneIngressRule
SwimLaneIngressRule指定了網關為一條泳道內服務進行引流的路由規則,該規則將轉化為網關上的虛擬服務。
欄位 | 類型 | 是否必選 | 說明 |
online | bool | 是 | 指定引流規則是否生效。當online為true時,網關上的虛擬服務才會對應被建立。 |
hosts | string[] | 是 | 引流規則匹配的網域名稱。對應虛擬服務中的hosts欄位。 |
name | string | 否 | 引流規則名稱。對應虛擬服務中HTTP路由的名稱。 |
match | 否 | 引流規則的請求匹配條件,將對應轉化為虛擬服務中HTTP路由的match欄位。 | |
route | 是 | 引流規則的引流目的服務,將對應轉化為虛擬服務中HTTP路由的route欄位。 |
SwimLaneIngressWeight
欄位 | 類型 | 是否必選 | 說明 |
weight | int | 否 | 泳道的引流權重數值,不指定則為0。該數值將通過與其它泳道的引流權重比較來確定最終的引流比例。 |
destination | 是 | 在基於權重的引流策略下,指定應將請求轉寄到的服務執行個體。 |
SwimLaneIngressRequestMatch
SwimLaneIngressRequestMatch是引流規則的請求匹配條件。
欄位 | 類型 | 是否必選 | 說明 |
uri | 否 | 請求URI匹配條件。樣本如下:
| |
headers | map<string, StringMatch> | 否 | 請求Header匹配條件。Map的鍵必須小寫並使用短劃線(-),代表Header的名稱,例如x-request-id。Map的值同為StringMatch類型,樣本如下:
|
StringMatch
StringMatch指定一個字串匹配條件,用於指定如何匹配請求的URI和Header。
欄位 | 類型 | 是否必選 | 說明 | |
任選其一 | exact | string | 否 | 精確的字串匹配。 |
prefix | string | 否 | 基於首碼的匹配。 | |
regex | string | 否 | RE2風格的基於Regex的匹配。更多資訊,請參見wiki。 |
SwimLaneIngressRoute
SwimLaneIngressRoute指定了引流規則的引流目的服務。
欄位 | 類型 | 是否必選 | 說明 |
destination | 是 | 指定應將請求轉寄到的服務執行個體。 |
RouteDestination
欄位 | 類型 | 是否必選 | 說明 |
host | string | 是 | K8s服務網域名稱,例如 |
portNum | int | 否 | k8s服務連接埠。如 說明 使用此欄位需要網格執行個體版本在1.21.4.104及以上。 |
相關文檔
關於流量泳道的概念、使用情境,以及嚴格與寬鬆兩種模式的流量泳道對比,請參見流量泳道概述。
關於如何使用strict 模式流量泳道實現全鏈路流量管理,請參見使用strict 模式流量泳道。
關於如何使用寬鬆模式流量泳道實現全鏈路流量管理,請參見使用寬鬆模式流量泳道。