すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:Istio リソースを使用した、異なるサービスバージョンへのトラフィックルーティング

最終更新日:Mar 12, 2026

マイクロサービスの新しいバージョンをリリースする際、完全にロールアウトする前に、各バージョンに到達するトラフィック量を制御する必要があります。Service Mesh (ASM) は、Gateway、VirtualService、DestinationRule という 3 つの Istio リソースを使用して、サービスバージョン間でトラフィックをパーセンテージに基づいて分割します。これにより、カナリアリリースや A/B テストがサポートされます。

このトピックでは、Bookinfo アプリケーションを使用した完全な例を紹介します。Istio ゲートウェイを通じて Bookinfo を公開し、次に重み付きルーティングを構成して、トラフィックの 10%、40%、および 50% を reviews サービスの 3 つのバージョンに送信します。

仕組み

ASM でのトラフィックルーティングは、連携して機能する 3 つの Istio リソースに依存しています。

リソース役割
Gatewayメッシュのエッジにあるロードバランサーで、インバウンドの HTTP または TCP 接続を受け入れます。イングレスゲートウェイにバインドして、外部トラフィックがメッシュにどのように入るかを制御します。
VirtualServiceURI、ヘッダー、またはその他の基準で受信リクエストを照合し、特定のサービスに転送するルーティングルールです。VirtualService は、重みに基づいて複数の送信先にトラフィックを分割できます。
DestinationRuleラベル (通常はバージョンラベル) に基づいてサービスインスタンスを名前付きのサブセットにグループ化します。VirtualService のルールは、これらのサブセットを参照して、特定のバージョンにトラフィックを誘導します。

トラフィックフロー:

外部トラフィック --> Gateway --> VirtualService --> DestinationRule (サブセット) --> サービス Pod

このチュートリアルでは、まず Bookinfo アプリケーションを公開するためのゲートウェイと VirtualService を作成します。次に、DestinationRule と 2 つ目の VirtualService を追加して、reviews トラフィックを v1、v2、および v3 の間で分割します。

前提条件

開始する前に、以下を確認してください。

ステップ 1:Istio ゲートウェイの作成

Istio ゲートウェイを作成し、イングレスゲートウェイにバインドして、外部トラフィックがメッシュ内のサービスに到達できるようにします。

オプション A:YAML の適用 (推奨)

以下のマニフェストを保存し、kubectl apply -f <filename>.yaml で適用します。

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-gateway
  namespace: default
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - '*'

このゲートウェイは、label istio: ingressgateway の付いたイングレスゲートウェイ Pod を選択し、すべてのホストからの HTTP トラフィックをポート 80 でリッスンします。

オプション B:ASM コンソールの使用

  1. ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[ASM ゲートウェイ] > [ゲートウェイ] を選択します。[作成] をクリックします。

  3. 次のパラメーターを設定し、[作成] をクリックします。

    パラメーター
    名前空間default
    名前bookinfo-gateway
    ゲートウェイ Pod セレクター -- キーistio
    ゲートウェイ Pod セレクター -- ingressgateway
    公開されるサービス -- 名前http
    公開されるサービス -- ポート80
    公開されるサービス -- プロトコルHTTP
    公開されるサービス -- サービス*

    Gateway rule configuration

各パラメーターの詳細については、Gateway をご参照ください。

ステップ 2:イングレスルーティング用の VirtualService の作成

ゲートウェイを介して受信リクエストを productpage サービスにルーティングする VirtualService を作成します。このステップの後、Bookinfo アプリケーションは /productpage/static/login/logout、および /api/v1/products でアクセス可能になります。

オプション A:YAML の適用 (推奨)

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: vs-demo
  namespace: default
spec:
  hosts:
    - '*'
  gateways:
    - bookinfo-gateway
  http:
    - name: gw-to-productage
      match:
        - uri:
            exact: /productpage
        - uri:
            prefix: /static
        - uri:
            exact: /login
        - uri:
            exact: /logout
        - uri:
            prefix: /api/v1/products
      route:
        - destination:
            host: productpage
            port:
              number: 9080

この VirtualService は、bookinfo-gateway にバインドされ、一致したリクエストをポート 9080 の productpage サービスに転送します。

オプション B:ASM コンソールの使用

  1. ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[トラフィック管理センター] > [VirtualService] を選択します。[作成] をクリックします。

  3. 次の設定を行い、[作成] をクリックします。

    セクションパラメーター
    基本情報名前空間default
    名前VirtualService の名前を指定します
    ゲートウェイ特定のゲートウェイに適用オンにします。[bookinfo-gateway]
    すべての Sidecar に適用オフにします
    ホスト選択 *
    HTTP ルート名前ルート名を指定します
    リクエストマッチングルール5 つのルールを追加します。
    URI のマッチング = 完全一致: /productpage
    URI のマッチング = プレフィックス: /static
    URI のマッチング = 完全一致: /login
    URI のマッチング = 完全一致: /logout
    URI のマッチング = プレフィックス: /api/v1/products
    ルートの送信先ホスト: productpageポート: 9080

各パラメーターの詳細については、Virtual Service をご参照ください。

ステップ 3:Bookinfo へのアクセス確認

  1. イングレスゲートウェイの IP アドレスを取得します。

    ASM コンソールから

    1. ASM コンソール」にログインします。Service Meshメッシュ管理 を選択します。

    2. ASM インスタンス名をクリックし、[ASM ゲートウェイ] > [Ingress ゲートウェイ] を選択します。

    3. [イングレスゲートウェイ] ページで、[サービスアドレス] の値を確認します。

    ACK コンソールから

    1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

    2. クラスター名をクリックします。左側のナビゲーションウィンドウで、[ネットワーク] > [サービス] を選択します。

    3. [サービス] ページで、[名前空間] ドロップダウンリストから [istio-system] を選択します。[istio-ingressgateway] のポート 80 の [外部 IP] を確認します。

  2. ブラウザで http://<ingress-gateway-ip>/productpage を開き、約 10 回ページをリフレッシュします。ルーティングルールがない場合、Istio は reviews サービスの v1、v2、v3 にリクエストをほぼ均等に配信します(1:1:1)。各バージョンは星の評価を異なる方法でレンダリングするため、ページの外観はリフレッシュするたびに変化します:

    • v1 -- 星評価なし

    • v2 -- 黒い星評価

    • v3 -- 赤い星評価

    Bookinfo traffic distribution without routing rules

ステップ 4:重み付けトラフィックルーティングの設定

DestinationRule を作成してバージョンベースのサブセットを定義し、VirtualService を作成してそれらのサブセット間でトラフィックを 10:40:50 の比率で分割します。

4a. DestinationRule の作成

reviews」サービスに対して、version ラベルに基づいて 3 つのサブセット (v1、v2、v3) を定義します。

オプション A:YAML の適用 (推奨)

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: reviews
  namespace: default
spec:
  host: reviews
  subsets:
    - name: v1
      labels:
        version: v1
    - name: v2
      labels:
        version: v2
    - name: v3
      labels:
        version: v3

各サブセットは、対応する version ラベルを持つ Pod と一致し、reviews インスタンスを version ごとにグループ化します。

オプション B:ASM コンソールの使用

  1. ASM コンソール」にログインします。Service Mesh > メッシュ管理 を選択します。

  2. ASM インスタンス名をクリックします。[トラフィック管理センター] > [DestinationRule] を選択します。[作成] をクリックします。

  3. 次の設定を行い、[作成] をクリックします。

    セクションパラメーター
    基本情報名前空間default
    名前名前を指定します
    ホストreviews
    サービスバージョン (サブセット)サブセット 1名前: v1ラベル: version=v1
    サブセット 2名前: v2ラベル: version=v2
    サブセット 3名前: v3ラベル: version=v3

    Destination rule configuration

各パラメーターの詳細については、Destination Rule をご参照ください。

4b. 重み付けルーティング用の VirtualService の作成

reviews サービスの v1 にトラフィックの 10%、v2 に 40%、v3 に 50% をルーティングします。

オプション A:YAML の適用 (推奨)

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: reviews
  namespace: default
spec:
  hosts:
    - reviews.default.svc.cluster.local
  http:
    - name: route
      route:
        - destination:
            host: reviews
            subset: v1
          weight: 10
        - destination:
            host: reviews
            subset: v2
          weight: 40
        - destination:
            host: reviews
            subset: v3
          weight: 50

weight の値は、合計が 100 になる必要があります。ロールアウト戦略に合わせて、これらのパーセンテージを調整します。たとえば、控えめなカナリアリリースとして 90/10 の配分から始め、信頼性の向上に伴い、徐々により多くのトラフィックをシフトしていきます。

オプション B:ASM コンソールの使用

  1. ASM コンソールにログインします。[Service Mesh] > [メッシュ管理] を選択します。

  2. ASM インスタンス名をクリックします。[トラフィック管理センター] > [VirtualService] を選択します。[作成] をクリックします。

  3. 次の設定を行い、[作成] をクリックします。

    セクションパラメーター
    基本情報名前空間default
    名前名前を指定します
    ゲートウェイすべての Sidecar に適用オンにします
    ホスト[default] 名前空間の [reviews] を選択します
    HTTP ルート名前ルート名を指定します
    ルートの送信先 1ホスト: reviewsサブセット: v1重み: 10
    ルートの送信先 2ホスト: reviewsサブセット: v2重み: 40
    ルートの送信先 3ホスト: reviewsサブセット: v3重み: 50

    VirtualService weighted routing configuration

ステップ 5:トラフィック分割の確認

ブラウザで http://<ingress-gateway-ip>/productpage を開き、ページを約10回リフレッシュしてください。

reviews」サービスの各バージョンでは、星の評価を異なる方法でレンダリングします。

バージョン星評価期待される頻度 (10 回の更新中)
v1星なし約 1 回
v2黒い星約 4 回
v3赤い星約 5 回

分散がほぼ 1:4:5 に一致する場合、重み付けルーティングは正しく機能しています。分散は確率的なものであるため、多少のずれは正常です。

次のステップ

  • カナリアリリースの一環として、トラフィックの重みを調整して特定のバージョンにより多くのトラフィックを移行する

  • ヘッダーベースのルーティングルールを追加して、A/B テストのために特定のユーザーを特定のバージョンにルーティングする

  • 回復性を向上させるために、トラフィックルーティングと合わせてリトライポリシーとタイムアウトを設定する