トラフィックミラーリングでは、実際の本番環境トラフィックのコピーをセカンダリのサービスバージョンに送信し、エンドユーザに影響を与えることなく、リアルな本番リクエストに対するテストを実行できます。本番トラフィックを新バージョンに切り替える前に、トラフィックミラーリングを活用して新サービスバージョンの検証を行ってください。
このトピックでは、すべてのトラフィックを helloworld-v1 にルーティングするとともに、各リクエストのコピーを helloworld-v2 にミラーする手順について説明します。
前提条件
事前準備を完了し、helloworld および sleep サービスをデプロイしてください。詳細については、「事前準備」をご参照ください。
手順 1:ベースラインルーティングの確認
ミラーリングルールを適用する前に、通常の負荷分散により、helloworld-v1 と helloworld-v2 の両方にトラフィックが届いていることを確認します。
sleepPod 内でシェルを開きます:kubectl exec -it deploy/sleep -- shhelloworldサービスにリクエストを送信します:curl helloworld:5000/hello応答は、v1 または v2 のいずれかからランダムに返されます:
Hello version: v1, instance: helloworld-v1-6d77f4c4cf-p****または
Hello version: v2, instance: helloworld-v2-6b96c5684-4****
手順 2:宛先ルールおよび仮想サービスの作成
helloworld サービスに対して v1 および v2 の 2 つのサブセットを定義した後、すべてのトラフィックを v1 にルーティングしつつ、v2 へミラーする仮想サービスを作成します。
宛先ルールの作成
以下の DestinationRule を適用して、v1 および v2 のサブセットを定義します。詳細については、「宛先ルールの管理」をご参照ください。
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: helloworld
namespace: default
spec:
host: helloworld
subsets:
- labels:
version: v1
name: v1
- labels:
version: v2
name: v2ミラーリング機能付き仮想サービスの作成
以下の VirtualService を適用します。route ブロックにより、すべてのトラフィックが helloworld-v1 に送信されます。mirror ブロックにより、各リクエストのコピーが helloworld-v2 に送信されます。詳細については、「仮想サービスの管理」をご参照ください。
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: helloworld-vs
namespace: default
spec:
hosts:
- helloworld
http:
- mirror:
host: helloworld
subset: v2
route:
- destination:
host: helloworld
subset: v1手順 3:ミラーリングの確認
v1 がすべての応答を処理することを確認
sleepPod 内でシェルを開きます:kubectl exec -it deploy/sleep -- shhelloworldサービスにリクエストを送信します:curl helloworld:5000/helloすべての応答が今後 v1 のみから返されるようになります:
Hello version: v1, instance: helloworld-v1-6d77f4c4cf-p****
v2 がミラーされたトラフィックを受信していることを確認
Mesh Topology を開き、サービストポロジーを確認します。トポロジーには、クライアントからの応答を処理しているのは v1 のみであるにもかかわらず、リクエストが helloworld-v2 にコピーされている様子が表示されます。詳細については、「Mesh Topology を使用してアプリケーションのトポロジーを表示する」をご参照ください。
