許可モードのトラフィックレーンを使用して、アプリケーションのバージョンを分離し、特定の比率に基づいてトラフィックを異なるレーンにルーティングできます。アプリケーションは、リクエストに対応するトレース全体で透過的に送信できるヘッダーを追加する必要があり、このようなヘッダーは異なる値を持ちます。これらのリクエストヘッダーは、エンドツーエンド(E2E)パススルーリクエストヘッダーと呼ばれます。この例では、バゲージヘッダーが E2E パススルーリクエストヘッダーとして使用されます。レーン内のサービスが相互に呼び出すとき、呼び出されるサービスがレーンに存在しない場合、リクエストはベースラインレーン内の同じサービスに転送されます。この機能は、トレースの整合性を確保し、トラフィック管理を簡素化します。
開始する前に、「許可モードのトラフィックレーンを使用してエンドツーエンドトラフィックを管理する」のトピックと関連コンテンツを読み、理解していることを確認してください。
シナリオの説明
この例では、3 つのサービス(mocka、mockb、mockc)と 3 つのレーン(s1、s2、s3)を使用してトレースをシミュレートします。 s1 は、v1 の 3 つのサービスすべてを含むベースラインレーンです。 s2 には、v2 の mocka と mockc のみ含まれています。 s3 には、v3 の mockb のみ含まれています。まず、OpenTelemetry の自動インストゥルメンテーション機能を使用して、サービスの Pod がバゲージヘッダーをパススルーできるようにします。次に、許可モードで 3 つのレーンを作成し、トラフィックルーティングの重みを設定して、特定の比率でトラフィックをルーティングします。
ステップ 1: サンプルサービスをデプロイする
デフォルトの名前空間に対して自動サイドカープロキシインジェクションを有効にします。詳細については、「グローバル名前空間の管理」をご参照ください。
説明自動サイドカープロキシインジェクションの詳細については、「自動サイドカープロキシインジェクションの有効化」をご参照ください。
次のコンテンツを含む mock.yaml ファイルを作成します。
アノテーション
instrumentation.opentelemetry.io/inject-java: "true"とinstrumentation.opentelemetry.io/container-names: "default"は、対応するサービスが Java で実装されており、defaultという名前のコンテナを自動インストゥルメントするために OpenTelemetry Operator が必要であることを宣言するために、各サービス Pod に追加されます。次のコマンドを実行して、サービスをデプロイします。
kubectl apply -f mock.yamlOpenTelemetry の自動インストゥルメンテーションメカニズムに基づいて、サービスの Pod はトレース内のバゲージヘッダーを自動的にパススルーできます。
ステップ 2: レーングループと対応するレーンを作成する
レーングループを作成します。
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[トラフィックレーン] ページで、[スイムレーングループの作成] をクリックします。 [スイムレーングループの作成] パネルで、必要なパラメーターを設定し、[OK] をクリックします。
パラメーター
説明
[スイムレーングループの名前]
この例では、test と入力します。
[イングレスゲートウェイの Istio ゲートウェイ]
[ingressgateway] を選択します。
[レーンモード]
[許可モード] を選択します。
[トレースコンテキストのパススルーモード]
[バゲージヘッダーのパススルー] を選択します。
[ルーティングリクエストヘッダー]
x-asm-prefer-tag と入力します。
[スイムレーンサービス]
[Kubernetes クラスタ] ドロップダウンリストから mocka、mockb、mockc サービスが存在するクラスタを選択し、[名前空間] ドロップダウンリストから [default] を選択します。リストで [mocka]、[mockb]、[mockc] サービスを選択し、
アイコンをクリックして、これらのサービスを [選択済み] セクションに追加します。
s1、s2、s3 という名前のレーンを作成し、s1 レーンをサンプルサービスの v1 バージョンに、s2 レーンをサンプルサービスの v2 バージョンに、s3 レーンをサンプルサービスの v3 バージョンにバインドします。
[トラフィックレーンの定義] セクションの [トラフィックレーン] ページで、[スイムレーンの作成] をクリックします。
[スイムレーンの作成] ダイアログボックスで、必要なパラメーターを設定し、[OK] をクリックします。
パラメーター
説明
[スイムレーン名]
3 つのレーンをそれぞれ s1、s2、s3 という名前で指定します。
[サービスタグの設定]
[ラベルキー]: ASM_TRAFFIC_TAG に設定します。
[ラベル値]: s1 レーンの場合は v1、s2 レーンの場合は v2、s3 レーンの場合は v3 に設定します。
[サービスの追加]
s1 レーンでは、mocka(default)、mockb(default)、および mockc(default) を選択します。
s2 レーンの場合は、mocka(デフォルト)mockc(既定) と を選択します。
s3 レーンの場合は、mockb(デフォルト)。 を選択します。
次の図は、s1 レーンの構成を示しています。

3 つのレーンが作成されると、次の図に示すように、[トラフィックレーンの定義] セクションでそれらを表示できます。

デフォルトでは、レーングループで最初に作成したレーンがベースラインレーンとして設定されます。ただし、ベースラインレーンを変更できます。トラフィックが他のレーンに存在しないサービス宛ての場合、フォールバックメカニズムに従ってリクエストはベースラインレーンに転送されます。ベースラインレーンの変更方法の詳細については、「許可モードでベースラインレーンを変更する」をご参照ください。
ASM コンソールの左側のナビゲーションペインで、[トラフィック管理センター] > [destinationrule] または [virtualservice] を選択して、レーングループ内の各サービスに対して自動的に生成されるデスティネーションルールまたは仮想サービスを表示します。たとえば、次のデスティネーションルールと仮想サービスは、mocka サービスに対して自動的に作成されます。
統一された重みベースのトラフィックルーティングルールを作成します。
トラフィック ルール定義トラフィックレーン重みベースのルーティングトラフィックルーティングルール セクションの ページで、 セクションの をクリックします。
[統合ルーティング規則の設定] ダイアログボックスで、必要なパラメーターを構成し、[OK] をクリックします。次の例では、レーン内のすべてのサービスの受信リクエストパスが /mock であり、レーンごとに同じトラフィックルーティング規則が構成されていることを前提としています。
パラメーター
説明
[レルム名]
* に設定します。
[リクエスト URI の一致]
[メソッド] パラメーターを [プレフィックス] に設定し、[コンテンツ] パラメーターを / に設定します。
次の図は、統一トラフィックルーティングルールを設定する例を示しています。

3 つのレーンのトラフィックルーティングの重みを設定します。重みは、各レーンに送信されるトラフィックの比率を決定します。
[トラフィックレーンの定義] セクションの [トラフィックレーン] ページで、
[トラフィックルーティングの重み] 列の数値の横にある トラフィックルーティングの重みを編集OK ボタンをクリックします。 ダイアログボックスで、必要なパラメーターを設定し、 をクリックします。パラメーター
説明
[イングレスサービス]
3 つのレーンすべてで mocka.default.svc.cluster.local に設定します。
[重み値]
s1 レーンの場合は、値を 60 に設定します。
s2 レーンの場合は、値を 20 に設定します。
s3 レーンの場合は、値を 20 に設定します。
次の図は、トラフィックルーティングの重みを設定する例を示しています。

ステップ 3: エンドツーエンドカナリーリリース機能が有効になっていることを確認する
イングレスゲートウェイのパブリック IP アドレスを取得します。詳細については、「ステップ 2: ASM イングレスゲートウェイの IP アドレスを取得する」をご参照ください。
次のコマンドを実行して、環境変数を設定します。 xxx.xxx.xxx.xxx は前のステップで取得した IP アドレスです。
export ASM_GATEWAY_IP=xxx.xxx.xxx.xxxエンドツーエンドカナリーリリース機能が有効になっていることを確認します。
次のコマンドを実行して、3 つのレーン内のサービスの呼び出しを表示します。
for i in {1..100}; do curl http://${ASM_GATEWAY_IP}/ ; echo ''; sleep 1; done;期待される出力:
-> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) // 以降同様の出力出力は、トラフィックが約 6:2:2 の比率で s1、s2、s3 レーンに送信され、s1 がベースラインレーンとして使用されていることを示しています。トレースに特定のバージョンのサービスが存在しない場合、s1 レーンの対応するサービスが呼び出されます。