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

Alibaba Cloud Service Mesh:クラスタ内のサービスにトラフィックミラーリングを使用する

最終更新日:Jan 13, 2025

トラフィックミラーリング機能を使用して、本番トラフィックをテストクラスタまたはテストサービスバージョンにミラーリングできます。ミラーリングされた本番トラフィックを使用したテストは、本番環境に影響を与えることなく、バージョンの変更に伴うリスクを軽減します。このトピックでは、トラフィックミラーリングとは何か、そしてクラスタ内のサービスにこの機能を使用する方法について説明します。

トラフィックミラーリングとは

マイクロサービスアーキテクチャは、アプリケーションの開発とデプロイを高速化しますが、サービスバージョンの変更にはリスクが伴います。Service Mesh (ASM) は、リスクを軽減するためのトラフィックミラーリング機能を提供します。トラフィックシャドーイングとも呼ばれるこの機能は、本番トラフィックをミラーリングされたサービスにリアルタイムで送信します。ミラーリングされたトラフィックは、本番サービスのクリティカルなリクエストパスの帯域外で発生します。トラフィックがミラーリングされると、ミラーリングされたサービスバージョンに送信されるリクエストの Host/Authority ヘッダーに -shadow が追加されます。これにより、本番トラフィックとミラーリングされたトラフィックが区別されます。この機能を使用して、クラスタまたはサービスバージョンが本番環境で実行される前に、本番トラフィックをテストクラスタまたはテストサービスバージョンにミラーリングできます。これにより、バージョンの変更に伴うリスクが軽減されます。

利点

利点

説明

本番環境に近いテスト環境でのリスクの少ないバージョンのデプロイ

本番トラフィックをテストクラスタまたはテストサービスバージョンにコピーし、ミラーリングされたユースケースとトラフィックを使用してテストを実行できます。より正確なテスト結果により、本番環境でのデプロイのリスクが軽減されます。

本番環境への影響なし

  • ミラーリングされたトラフィックは、本番サービスのクリティカルなリクエストパスの帯域外で発生します。ミラーリングされたトラフィックによって発生した問題は、本番環境には影響しません。

  • リクエストは「Fire and Forget」としてミラーリングされます。つまり、レスポンスは破棄されます。

シナリオ

トラフィックミラーリングを使用すると、エンドユーザーに影響を与えることなく、本番環境で実行されているサービスをテストできます。サービスの 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:サンプルアプリケーションサービスをデプロイする

  1. 次の内容を含む httpbin.yaml ファイルを作成します。

    httpbin.yaml ファイルを表示する

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin-v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin-v1-mirroring
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1-mirroring
      template:
        metadata:
          labels:
            app: httpbin
            version: v1-mirroring
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
  2. 次のコマンドを実行して、httpbin サービスの v1 および v1-mirroring バージョンをデプロイします。

    kubectl apply -f httpbin.yaml
  3. 次の内容を含む sleep.yaml ファイルを作成します。

    sleep.yaml ファイルを表示する

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: sleep
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sleep
      labels:
        app: sleep
        service: sleep
    spec:
      ports:
      - port: 80
        name: http
      selector:
        app: sleep
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sleep
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sleep
      template:
        metadata:
          labels:
            app: sleep
        spec:
          terminationGracePeriodSeconds: 0
          serviceAccountName: sleep
          containers:
          - name: sleep
            image: curlimages/curl
            command: ["/bin/sleep", "infinity"]
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - mountPath: /etc/sleep/tls
              name: secret-volume
          volumes:
          - name: secret-volume
            secret:
              secretName: sleep-secret
              optional: true
    ---
  4. 次のコマンドを実行して、クライアントアプリケーションサービス sleep をデプロイします。

    kubectl apply -f httpbin.yaml

手順 2:ルーティングルールを作成する

  1. v1 および v1-mirroring バージョンを指定する宛先ルールを作成します。

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

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

    3. [作成] ページで、パラメータを設定し、[作成] をクリックします。次の図は、パラメータを設定する方法を示しています。创建路由策略

  2. すべてのトラフィックを v1 にルーティングし、トラフィックの半分を v1-mirroring にミラーリングする仮想サービスを作成します。

    1. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [トラフィック管理センター] > [virtualservice] を選択します。

    2. [virtualservice] ページで、[作成] をクリックします。[作成] ページで、パラメータを設定し、[作成] をクリックします。次の図は、パラメータを設定する方法を示しています。

      创建路由策略-1创建路由策略2

手順 3:リクエストを送信する

  1. アプリケーションサービスが正しく実行されている場合は、次のコマンドを実行して、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/headers
  2. v1 および v1-mirroring の Pod ログを表示します。詳細については、「Pod のログを確認する」をご参照ください。

    ログは、すべてのトラフィックが v1 に送信され、トラフィックの半分が v1-mirroring にミラーリングされていることを示しています。結果は期待どおりです。

    次の図は、v1 と v1-mirroring の Pod ログを比較しています。 v1 に送信されたトラフィックが v1-mirroring にミラーリングされていることを示しています。 v1-mirroring にミラーリングされたリクエストの authority ヘッダーに -shadow が追加されているため、ミラーリングされたトラフィックパケットサイズの方が大きくなっています。对比日志