トラフィックミラーリング機能を使用して、本番トラフィックをテストクラスタまたはテストサービスバージョンにミラーリングできます。ミラーリングされた本番トラフィックを使用したテストは、本番環境に影響を与えることなく、バージョンの変更に伴うリスクを軽減します。このトピックでは、トラフィックミラーリングとは何か、そしてクラスタ内のサービスにこの機能を使用する方法について説明します。
トラフィックミラーリングとは
マイクロサービスアーキテクチャは、アプリケーションの開発とデプロイを高速化しますが、サービスバージョンの変更にはリスクが伴います。Service Mesh (ASM) は、リスクを軽減するためのトラフィックミラーリング機能を提供します。トラフィックシャドーイングとも呼ばれるこの機能は、本番トラフィックをミラーリングされたサービスにリアルタイムで送信します。ミラーリングされたトラフィックは、本番サービスのクリティカルなリクエストパスの帯域外で発生します。トラフィックがミラーリングされると、ミラーリングされたサービスバージョンに送信されるリクエストの Host/Authority ヘッダーに -shadow が追加されます。これにより、本番トラフィックとミラーリングされたトラフィックが区別されます。この機能を使用して、クラスタまたはサービスバージョンが本番環境で実行される前に、本番トラフィックをテストクラスタまたはテストサービスバージョンにミラーリングできます。これにより、バージョンの変更に伴うリスクが軽減されます。
利点
利点 | 説明 |
本番環境に近いテスト環境でのリスクの少ないバージョンのデプロイ | 本番トラフィックをテストクラスタまたはテストサービスバージョンにコピーし、ミラーリングされたユースケースとトラフィックを使用してテストを実行できます。より正確なテスト結果により、本番環境でのデプロイのリスクが軽減されます。 |
本番環境への影響なし |
|
シナリオ
トラフィックミラーリングを使用すると、エンドユーザーに影響を与えることなく、本番環境で実行されているサービスをテストできます。サービスの 2 つのバージョンのベンチマークテストを実行して、新しいバージョンが既存のバージョンと同じ方法で受信リクエストを処理できるかどうかを判断できます。
次の表は、トラフィックミラーリングを使用できる典型的なシナリオを示しています。
シナリオ | 説明 |
試運転およびシミュレーションテストのための本番トラフィックミラーリング | テストのために、本番クラスタからテストクラスタへのトラフィックをミラーリングできます。これは、本番環境のクリティカルなリクエストパスには影響しません。古いシステムを新しいシステムに置き換えたり、変換したりするとします。試運転のために、古いシステムの本番トラフィックをミラーリングして新しいシステムにインポートできます。実験的なアーキテクチャ調整を実行する場合にも、シミュレーションテストのために本番トラフィックをミラーリングできます。 |
新しいバージョンの検証 | 本番トラフィックとミラーリングされたトラフィックの出力結果をリアルタイムで比較できます。新しいサービスをリリースする前に、ミラーリングされたトラフィックをドリルで使用できます。すべての本番トラフィックをミラーリングできます。従来の手動ドリルは、サンプルデータに基づいて実行されます。(サービスが本番トラフィックにどのように反応するかを予測することは困難です。)ミラーリングされた本番トラフィックを使用すると、悪意のある攻撃を受ける例外的な特殊文字やトークンなど、本番環境のすべての状況をシミュレートできます。これにより、リリースされるサービスの処理能力とトラブルシューティング能力を理解するのに役立ちます。 |
データベースデータとテストデータの分離 | データ処理パフォーマンスをテストする場合、テストデータを空のデータベースにインポートし、本番トラフィックをこのテストデータベースにミラーリングできます。これにより、テストデータが本番データベースのデータから分離されます。 |
実行中のサービスのトラブルシューティング | 実行中のサービスに予期しない問題が発生した場合、オンプレミスネットワークで問題を再現することは困難です。この場合、一時的なサービスを開始し、実行中のサービスから一時的なサービスへのトラフィックをミラーリングしてデバッグできます。このトラブルシューティング方法は、実行中のサービスには影響しません。 |
ユーザー行動のログ記録 | サンプルとデータは、レコメンデーションシステムアルゴリズムにとって重要です。アルゴリズム依存アプリケーションの従来の自動テストの最大の課題は、現実世界のユーザー行動データの不足です。トラフィックミラーリングを使用すると、ユーザー行動データをログに保存できます。ログデータは、レコメンデーションシステムアルゴリズムを構築するためのシミュレーションテストで使用できます。また、ユーザープロファイル分析のためのビッグデータソースとしても使用できます。 |
トラフィックミラーリングを使用するためのサンプルコード
次の YAML ファイルの例は、Istio でトラフィックミラーリングを使用する方法を示しています。この例では、VirtualService はすべてのトラフィックを v1 サブセットにルーティングし、トラフィックを v1-mirroring サブセットにミラーリングします。リクエストが v1 サブセットに送信されると、リクエストはコピーされて v1-mirroring サブセットに送信されます。
v1-mirroring サブセットがアプリケーションの v1 バージョンにリクエストを送信した後、アプリケーションログを表示できます。アプリケーションが呼び出されると、レスポンスは v1 サブセットからのものであることがわかります。また、リクエストが v1-mirroring サブセットにミラーリングされていることもわかります。
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: myapp-traffic-mirroring
spec:
hosts:
- myapp
http:
- route:
- destination:
host: myapp.default.svc.cluster.local
port:
number: 8000
subset: v1
weight: 100
mirror:
host: myapp.default.svc.cluster.local
port:
number: 8000
subset: v1-mirroringクラスタ内のサービスのトラフィックミラーリングを有効にする
この例では、すべてのトラフィックが v1 にルーティングされ、トラフィックの半分が v1-mirroring にミラーリングされます。 v1 と v1-mirroring は、httpbin サービスの 2 つのバージョンです。
手順 1:サンプルアプリケーションサービスをデプロイする
次の内容を含む httpbin.yaml ファイルを作成します。
次のコマンドを実行して、
httpbinサービスの v1 および v1-mirroring バージョンをデプロイします。kubectl apply -f httpbin.yaml次の内容を含む sleep.yaml ファイルを作成します。
次のコマンドを実行して、クライアントアプリケーションサービス
sleepをデプロイします。kubectl apply -f httpbin.yaml
手順 2:ルーティングルールを作成する
v1 および v1-mirroring バージョンを指定する宛先ルールを作成します。
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。表示されるページで、[作成] をクリックします。
[作成] ページで、パラメータを設定し、[作成] をクリックします。次の図は、パラメータを設定する方法を示しています。

すべてのトラフィックを v1 にルーティングし、トラフィックの半分を v1-mirroring にミラーリングする仮想サービスを作成します。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。
[virtualservice] ページで、[作成] をクリックします。[作成] ページで、パラメータを設定し、[作成] をクリックします。次の図は、パラメータを設定する方法を示しています。


手順 3:リクエストを送信する
アプリケーションサービスが正しく実行されている場合は、次のコマンドを実行して、
sleepからhttpbinにリクエストを送信します。export SLEEP_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name}) kubectl exec -it $SLEEP_POD -c sleep -- curl http://httpbin:8000/headersv1 および v1-mirroring の Pod ログを表示します。詳細については、「Pod のログを確認する」をご参照ください。
ログは、すべてのトラフィックが v1 に送信され、トラフィックの半分が v1-mirroring にミラーリングされていることを示しています。結果は期待どおりです。
次の図は、v1 と v1-mirroring の Pod ログを比較しています。 v1 に送信されたトラフィックが v1-mirroring にミラーリングされていることを示しています。 v1-mirroring にミラーリングされたリクエストの
authorityヘッダーに -shadowが追加されているため、ミラーリングされたトラフィックパケットサイズの方が大きくなっています。