Service Mesh (ASM) は、トラフィックレーン管理のために2つの CustomResourceDefinitions (CRD) である ASMSwimLaneGroup と ASMSwimLane を提供します。これらを組み合わせることで、特定のサービスバージョンや特定の特性を持つサービスを、トラフィックレーンと呼ばれる独立した実行環境に分離し、一致するリクエストをそれらのバージョンにルーティングできます。
これらの CRD の連携
ASMSwimLaneGroup は、分離する**対象**を定義します。つまり、トラフィックレーンに参加するサービスと、それらにリクエストをルーティングするイングレスゲートウェイです。ASMSwimLane は、分離する**方法**を定義します。つまり、どの Pod バージョンがレーンに属し、どのルーティングルールが適用されるかです。
関係は次のとおりです。
1つの ASMSwimLaneGroup は、複数のサービスをグループ化し、共有イングレスゲートウェイを指定します。
複数の ASMSwimLane リソース は、ラベル
swimlane-group: <group-name>を介してそのグループに関連付けられます。各レーンは、グループ化されたサービスの特定のバージョンをターゲットとします。
ASM は2つのレーンモードをサポートしています。
Strict モード (
isPermissive: falseまたは未設定) -- すべてのレーンは、グループで定義されているすべてのサービスを含む必要があります。Permissive モード (
isPermissive: true) -- レーンは、グループのサービスの一部を含むことができます。不足しているサービスへのリクエストは、ベースラインレーンにフォールバックします。
ASMSwimLaneGroup フィールド
ASMSwimLaneGroup は、トラフィックレーングループを定義します。これは、複数のレーンにわたるサービスと Ingress ルーティングの共有構成です。
ASMSwimLaneGroupSpec
spec セクションは、コア構成です。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
services | ClusterServiceRef[] | Yes | トラフィックレーンに参加する Kubernetes クラスター内のサービス。 |
ingress | SwimLaneGroupIngressConfiguration | Yes | 異なるサービスバージョンへのリクエストをルーティングするためのイングレスゲートウェイ構成。 |
isPermissive | bool | No | レーングループモード。true:Permissive モード。false または未設定:Strict モード。詳細については、「トラフィックレーンの概要」をご参照ください。 |
permissiveModeConfiguration | PermissiveSwimLaneGroupConfiguration | No | Permissive モード設定。isPermissive が true の場合に必須です。 |
ClusterServiceRef
トラフィックレーンに参加する Kubernetes サービスを参照します。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
name | string | Yes | Kubernetes サービスの名前。 |
namespace | string | Yes | Kubernetes サービスの名前空間。 |
cluster | ClusterRef | No | Kubernetes クラスターへの参照。ASM インスタンスが複数のクラスターを管理している場合に使用します。 |
ClusterRef
ASM インスタンスに追加された Kubernetes クラスターを識別します。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
name | string | No | Kubernetes クラスターの表示名。 |
id | string | No | Kubernetes クラスターの ID。 |
SwimLaneGroupIngressConfiguration
レーングループ内のサービスにリクエストをルーティングするイングレスゲートウェイを構成します。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
gateway | SwimLaneGatewayConfiguration | Yes | イングレスゲートウェイに関連付けられた Istio ゲートウェイ。 |
ingressRouting | SwimLaneGroupIngressRouteConfiguration | No | レーングループのリクエストルーティング戦略。 説明 ASM v1.21.6.92 以降が必要です。 |
SwimLaneGatewayConfiguration
イングレスゲートウェイに関連付けられた Istio ゲートウェイを指定します。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
name | string | Yes | Istio ゲートウェイの名前。 |
namespace | string | Yes | Istio ゲートウェイの名前空間。 |
type | string | Yes | Istio ゲートウェイのタイプ。ASM が提供する Istio ゲートウェイを示す ASM に設定します。 |
SwimLaneGroupIngressRouteConfiguration
レーングループのリクエストルーティング戦略を定義します。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
ingressRoutingStrategy | string | No | ルーティング戦略。有効な値:rule_based (デフォルト) -- 各レーンは ingressRules を介して独自のルーティングルールを定義します。weighted -- 共有ルーティングルールを使用して、重みによってリクエストがレーン全体に分散されます。 |
weightedRoutingRule | WeightedSwimLaneIngressConfiguration | No | 重みベースのルーティングのための統合リクエストマッチングルール。ingressRoutingStrategy が weighted の場合にのみ有効です。 |
WeightedSwimLaneIngressConfiguration
重みベースのルーティングで使用される統合リクエストマッチングルールを定義します。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
hosts | []string | Yes | マッチングするホスト。レーングループに関連付けられた Istio ゲートウェイで宣言する必要があります。 |
requestMatches | SwimLaneIngressRequestMatch | No | URI およびヘッダーマッチング条件。 |
PermissiveSwimLaneGroupConfiguration
トラフィックレーングループの Permissive モードを構成します。isPermissive が true の場合に必須です。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
routeHeader | string | Yes | リクエストがコールチェーンを通過する際に、どのレーンに属するかを決定するリクエストヘッダー。イングレスゲートウェイを介して入るリクエストは、このヘッダーを保持する必要があります。 |
traceHeader | string | Yes | コールチェーン全体に伝播するエンドツーエンド (E2E) パススルーヘッダー。routeHeader と異なる場合は、リクエストごとに一意である必要があります。例:x-b3-trace-id。 |
fallbackTarget | string | No | ベースラインレーンの名前。リクエストが指定されたレーン内のターゲットサービスバージョンに到達できない場合、リクエストはこのベースラインレーン内の同じサービスにフォールバックします。 |
ASMSwimLane フィールド
ASMSwimLane は、単一のトラフィックレーン、つまり一緒に分離されるサービスバージョンのセットを定義します。ASMSwimLane リソースにラベル swimlane-group: <group-name> を追加することで、レーンをレーングループに関連付けます。
ASMSwimLaneSpec
spec セクションは、コア構成です。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
labelSelector | map<string, string> | Yes | このレーン内のサービスに対して Pod をマッチングするために使用されるラベル。通常、version: v1 のようなバージョンラベルを使用します。 |
services | ClusterServiceRef[] | No | このレーンにデプロイされたサービス。Strict モードでは、このフィールドを省略します。すべてのレーンはグループからのすべてのサービスを含む必要があります。Permissive モードでは、このレーン内のサービスを指定します。リストはグループの services フィールドのサブセットである必要があります。このレーンから欠落しているサービスへのリクエストは、ベースラインレーンに転送されます。 |
ingressRules | SwimLaneIngressRule[] | No | ASM がイングレスゲートウェイ用の仮想サービスに自動的に変換するルーティングルール。省略した場合、仮想サービスを手動で作成します。 |
ingressWeight | SwimLaneIngressWeight | No | グループが重みベースのルーティング (ingressRoutingStrategy: weighted) を使用する場合の、このレーンのルーティングの重み。 |
SwimLaneIngressRule
イングレスゲートウェイのルーティングルールを定義します。ASM は各ルールを仮想サービスの一部に変換します。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
online | bool | Yes | このルールがアクティブかどうか。仮想サービスは、これが true の場合にのみ生成されます。 |
hosts | string[] | Yes | マッチングするホスト。生成された仮想サービスの hosts フィールドにマッピングされます。 |
name | string | No | このルーティングルールの名前。生成された仮想サービスの http の下の name フィールドにマッピングされます。 |
match | SwimLaneIngressRequestMatch | No | リクエストマッチング条件。生成された仮想サービスの http の下の match フィールドにマッピングされます。 |
route | SwimLaneIngressRoute | Yes | マッチしたリクエストの送信先サービス。生成された仮想サービスの http の下の route フィールドにマッピングされます。 |
SwimLaneIngressWeight
重みベースのルーティングが使用される場合のレーンのルーティングの重みを指定します。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
weight | int | No | このレーンのルーティングの重み。デフォルトは 0 です。ASM はすべてのレーンの重みを使用して、リクエスト分散比率を計算します。 |
destination | RouteDestination | Yes | 重みベースのルーティングの送信先サービス。 |
SwimLaneIngressRequestMatch
URI またはヘッダーによるリクエストのマッチング条件を定義します。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
uri | StringMatch | No | URI マッチング条件。exact、prefix、および regex (RE2 構文) をサポートします。 |
headers | map<string, StringMatch> | No | ヘッダーマッチング条件。キーはハイフン付きの小文字のヘッダー名 (例:x-request-id) です。値はマッチタイプを定義します。 |
StringMatch
文字列値のマッチング方法を定義します。フィールドを1つだけ指定します。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
exact | string | No | 完全一致の文字列マッチ。 |
prefix | string | No | プレフィックスマッチ。 |
regex | string | No | RE2 正規表現マッチ。「RE2 構文」をご参照ください。 |
SwimLaneIngressRoute
マッチしたリクエストの送信先サービスを指定します。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
destination | RouteDestination | Yes | 送信先サービス。 |
RouteDestination
ターゲット Kubernetes サービスを識別します。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
host | string | Yes | Kubernetes サービスの完全修飾ドメイン名。例:mocka.default.svc.cluster.local。 |
portNum | int | No | サービスポート番号。例:8000。説明 ASM v1.21.4.104 以降が必要です。 |
関連トピック
トラフィックレーンの概要:概念、ユースケース、Strict モードと Permissive モードの比較。