マイクロサービスの新しいバージョンをリリースする際、完全にロールアウトする前に、各バージョンに到達するトラフィック量を制御する必要があります。Service Mesh (ASM) は、Gateway、VirtualService、DestinationRule という 3 つの Istio リソースを使用して、サービスバージョン間でトラフィックをパーセンテージに基づいて分割します。これにより、カナリアリリースや A/B テストがサポートされます。
このトピックでは、Bookinfo アプリケーションを使用した完全な例を紹介します。Istio ゲートウェイを通じて Bookinfo を公開し、次に重み付きルーティングを構成して、トラフィックの 10%、40%、および 50% を reviews サービスの 3 つのバージョンに送信します。
仕組み
ASM でのトラフィックルーティングは、連携して機能する 3 つの Istio リソースに依存しています。
| リソース | 役割 |
|---|---|
| Gateway | メッシュのエッジにあるロードバランサーで、インバウンドの HTTP または TCP 接続を受け入れます。イングレスゲートウェイにバインドして、外部トラフィックがメッシュにどのように入るかを制御します。 |
| VirtualService | URI、ヘッダー、またはその他の基準で受信リクエストを照合し、特定のサービスに転送するルーティングルールです。VirtualService は、重みに基づいて複数の送信先にトラフィックを分割できます。 |
| DestinationRule | ラベル (通常はバージョンラベル) に基づいてサービスインスタンスを名前付きのサブセットにグループ化します。VirtualService のルールは、これらのサブセットを参照して、特定のバージョンにトラフィックを誘導します。 |
トラフィックフロー:
外部トラフィック --> Gateway --> VirtualService --> DestinationRule (サブセット) --> サービス Podこのチュートリアルでは、まず Bookinfo アプリケーションを公開するためのゲートウェイと VirtualService を作成します。次に、DestinationRule と 2 つ目の VirtualService を追加して、reviews トラフィックを v1、v2、および v3 の間で分割します。
前提条件
開始する前に、以下を確認してください。
ASM インスタンスにデプロイされた Bookinfo アプリケーション。詳細については、「ASM インスタンスに追加された ACK クラスターにアプリケーションをデプロイする」をご参照ください。
ステップ 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 コンソールの使用
ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[ASM ゲートウェイ] > [ゲートウェイ] を選択します。[作成] をクリックします。
次のパラメーターを設定し、[作成] をクリックします。
パラメーター 値 名前空間 default名前 bookinfo-gatewayゲートウェイ Pod セレクター -- キー istioゲートウェイ Pod セレクター -- 値 ingressgateway公開されるサービス -- 名前 http公開されるサービス -- ポート 80公開されるサービス -- プロトコル HTTP 公開されるサービス -- サービス *
各パラメーターの詳細については、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 コンソールの使用
ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[トラフィック管理センター] > [VirtualService] を選択します。[作成] をクリックします。
次の設定を行い、[作成] をクリックします。
セクション パラメーター 値 基本情報 名前空間 default名前 VirtualService の名前を指定します ゲートウェイ 特定のゲートウェイに適用 オンにします。[bookinfo-gateway] すべての Sidecar に適用 オフにします ホスト 選択 *HTTP ルート 名前 ルート名を指定します リクエストマッチングルール 5 つのルールを追加します。 URI のマッチング = 完全一致: /productpageURI のマッチング = プレフィックス: /staticURI のマッチング = 完全一致: /loginURI のマッチング = 完全一致: /logoutURI のマッチング = プレフィックス: /api/v1/productsルートの送信先 ホスト: productpage、ポート:9080
各パラメーターの詳細については、Virtual Service をご参照ください。
ステップ 3:Bookinfo へのアクセス確認
イングレスゲートウェイの IP アドレスを取得します。
ASM コンソールから
「ASM コンソール」にログインします。Service Mesh > メッシュ管理 を選択します。
ASM インスタンス名をクリックし、[ASM ゲートウェイ] > [Ingress ゲートウェイ] を選択します。
[イングレスゲートウェイ] ページで、[サービスアドレス] の値を確認します。
ACK コンソールから
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター名をクリックします。左側のナビゲーションウィンドウで、[ネットワーク] > [サービス] を選択します。
[サービス] ページで、[名前空間] ドロップダウンリストから [istio-system] を選択します。[istio-ingressgateway] のポート 80 の [外部 IP] を確認します。
ブラウザで
http://<ingress-gateway-ip>/productpageを開き、約 10 回ページをリフレッシュします。ルーティングルールがない場合、Istio はreviewsサービスの v1、v2、v3 にリクエストをほぼ均等に配信します(1:1:1)。各バージョンは星の評価を異なる方法でレンダリングするため、ページの外観はリフレッシュするたびに変化します:v1 -- 星評価なし
v2 -- 黒い星評価
v3 -- 赤い星評価

ステップ 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 コンソールの使用
「ASM コンソール」にログインします。Service Mesh > メッシュ管理 を選択します。
ASM インスタンス名をクリックします。[トラフィック管理センター] > [DestinationRule] を選択します。[作成] をクリックします。
次の設定を行い、[作成] をクリックします。
セクション パラメーター 値 基本情報 名前空間 default名前 名前を指定します ホスト reviewsサービスバージョン (サブセット) サブセット 1 名前: v1、ラベル:version=v1サブセット 2 名前: v2、ラベル:version=v2サブセット 3 名前: v3、ラベル:version=v3
各パラメーターの詳細については、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: 50weight の値は、合計が 100 になる必要があります。ロールアウト戦略に合わせて、これらのパーセンテージを調整します。たとえば、控えめなカナリアリリースとして 90/10 の配分から始め、信頼性の向上に伴い、徐々により多くのトラフィックをシフトしていきます。
オプション B:ASM コンソールの使用
ASM コンソールにログインします。[Service Mesh] > [メッシュ管理] を選択します。
ASM インスタンス名をクリックします。[トラフィック管理センター] > [VirtualService] を選択します。[作成] をクリックします。
次の設定を行い、[作成] をクリックします。
セクション パラメーター 値 基本情報 名前空間 default名前 名前を指定します ゲートウェイ すべての Sidecar に適用 オンにします ホスト [default] 名前空間の [reviews] を選択します HTTP ルート 名前 ルート名を指定します ルートの送信先 1 ホスト: reviews、サブセット:v1、重み:10ルートの送信先 2 ホスト: reviews、サブセット:v2、重み:40ルートの送信先 3 ホスト: reviews、サブセット:v3、重み:50
ステップ 5:トラフィック分割の確認
ブラウザで http://<ingress-gateway-ip>/productpage を開き、ページを約10回リフレッシュしてください。
「reviews」サービスの各バージョンでは、星の評価を異なる方法でレンダリングします。
| バージョン | 星評価 | 期待される頻度 (10 回の更新中) |
|---|---|---|
| v1 | 星なし | 約 1 回 |
| v2 | 黒い星 | 約 4 回 |
| v3 | 赤い星 | 約 5 回 |
分散がほぼ 1:4:5 に一致する場合、重み付けルーティングは正しく機能しています。分散は確率的なものであるため、多少のずれは正常です。
次のステップ
カナリアリリースの一環として、トラフィックの重みを調整して特定のバージョンにより多くのトラフィックを移行する
ヘッダーベースのルーティングルールを追加して、A/B テストのために特定のユーザーを特定のバージョンにルーティングする
回復性を向上させるために、トラフィックルーティングと合わせてリトライポリシーとタイムアウトを設定する