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

Alibaba Cloud Service Mesh:ASM フォールバックメカニズムの使用

最終更新日:Jun 23, 2026

フォールバックメカニズムは、サービス呼び出しが失敗した場合の代替アクションを定義します。マイクロサービスに障害が発生したり、利用できなくなったりした場合、このメカニズムはバックアップサービスを呼び出してリクエストを処理し、システムの安定性と可用性を確保します。例えば、サービスエンドポイントが利用できない場合、フォールバックメカニズムを使用してリクエストをバックアップサービスのバージョンに転送できます。これにより、クライアントのリクエストがエラーや中断なく処理されることが保証されます。Alibaba Cloud Service Mesh (ASM) は、VirtualService の fallback パラメーターを通じてこのメカニズムをサポートします。このトピックでは、ASM でフォールバックメカニズムを使用する方法について説明します。

前提条件

設定

このトピックでは、Bookinfo サンプルアプリケーションの reviews サービスを例として使用します。productpage サービスが reviews サービスの v1v2v3 バージョンにアクセスする際に、v3 バージョンが利用できない場合、フォールバックメカニズムがリクエストを v2 バージョンにルーティングします。これにより、サービスが 503 エラーを返すのを防ぎます。

[設定ファイル] をクリックして、このトピックで使用する YAML ファイルをダウンロードできます。

ステップ 1: Bookinfo サンプルへのアクセス

  1. reviews.yaml という名前のファイルを作成し、以下の内容を記述して reviews サービスの v1v2v3 バージョンを宣言します。

    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      name: reviews
    spec:
      host: reviews
      subsets:
      - name: v1
        labels:
          version: v1
      - name: v2
        labels:
          version: v2
      - name: v3
        labels:
          version: v3
  2. ご利用の KubeConfig 環境で、次のコマンドを実行して DestinationRule をデプロイします。

    kubectl apply -f reviews.yaml
  3. 次のいずれかの方法で、イングレスゲートウェイの IP アドレスを取得します。

    • 方法 1:次のコマンドを実行します。

    kubectl get svc -n istio-system  istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
  4. ブラウザで http://${YourGatewayIp}/productpage にアクセスします。

    ${YourGatewayIp} は前のステップで取得したゲートウェイ IP です。バージョンは Reviews served by の値または星の表示で識別できます。バージョン v1 には星がなく、バージョン v2 には黒い星、バージョン v3 には赤い星が表示されます。

    例えば、reviews-v2 という値はバージョン v2 を示し、黒い星が表示されます。v2版本示例..png

    ページを複数回更新します。リクエストは reviews サービスの v1v2v3 バージョンに負荷分散されます。

ステップ 2: ルートとフォールバックルールの定義

  1. reviews-route-fallback-sample1.yaml という名前のファイルを作成し、以下の内容を記述します。

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: reviews-route
      namespace: default
    spec:
      hosts:
        - reviews
      http:
        - route:
            - destination:
                host: reviews
                subset: v3
              fallback:
                target:
                  host: reviews
                  subset: v2
    
  2. ASM インスタンスの KubeConfig 環境で、次のコマンドを実行して reviews サービスのルートとフォールバックルールをデプロイします。

    kubectl apply -f reviews-route-fallback-sample1.yaml
  3. Web ブラウザで http://${YourGatewayIp}/productpage にアクセスし、ページを更新し続けます。

    リクエストが一貫して reviews サービスの v3 バージョンにルーティングされることがわかります。更新後、ページには書籍レビューサービスが reviews-v3 によって提供されていることが示され、レビューには赤い星の評価が含まれます。

  4. reviews-v3 バージョンのレプリカを 0 にスケーリングして、障害をシミュレートします。

    kubectl scale deployment reviews-v3 --replicas=0
  5. ブラウザで http://${YourGatewayIp}/productpage にアクセスし、ページを繰り返し更新します。

    リクエストが正しく reviews サービスの v2 バージョンにフォールバックすることがわかります。フォールバック関連のフィールドをカスタムアクセスログ形式に追加し、ログを確認することで、フォールバックが発生したことを検証できます。

    フォールバックの検証

    1. カスタムアクセスログ形式に次のフィールドを追加します。詳細については、「データプレーンのアクセスログの内容をカスタマイズする」をご参照ください。

      フィールド

      説明

      fallback_path

      %DYNAMIC_METADATA(com.aliyun.fallback:fallback-path)%

      フォールバックの具体的なパス。例えば、A:B はリクエストが A から B にフォールバックすることを示します。A:B:C はリクエストが A から B にフォールバックし、B も異常な場合は B から C にフォールバックすることを示します。

      fallback_final_cluster_name

      %DYNAMIC_METADATA(com.aliyun.fallback:final-cluster)%

      フォールバックが発生した場合の送信先クラスター。例えば、service1|v1 が存在しない場合、リクエストは service|base にフォールバックします。

      fallback_result

      %DYNAMIC_METADATA(com.aliyun.fallback:fallback-result)%

      フォールバックの結果。フォールバックが失敗した場合、リクエストの失敗は元の送信先クラスターに起因します。

    2. productpage-v1istio-proxy のログを表示します。

      次のログは、reviews-v3 から reviews-v2 へのフォールバックを示しています。

      {
          "authority":"reviews:9080",
          "authority_for":"reviews:9080",
          "bytes_received":"0",
          "bytes_sent":"442",
          "downstream_local_address":"192.168.255.46:9080",
          "downstream_remote_address":"172.16.0.252:57238",
          "duration":"10",
          "fallback_path":"outbound|9080|v3|reviews.default.svc.cluster.local:outbound|9080|v2|reviews.default.svc.cluster.local",
          "fallback_final_cluster_name":"outbound|9080|v2|reviews.default.svc.cluster.local",
          "fallback_result":"fallback successful",
          "istio_policy_status":"-",
          "method":"GET",
          "path":"/reviews/0",
          "protocol":"HTTP/1.1",
          "request_id":"15b2dffc-5f3f-4060-b9fa-898eab08****",
          "requested_server_name":"-",
          "response_code":"200",
          "response_flags":"-",
          "route_name":"-",
          "start_time":"2023-05-30T07:02:26.990Z",
          "trace_id":"18b3aed8af41****",
          "upstream_cluster":"outbound|9080|v2|reviews.default.svc.cluster.local",
          "upstream_host":"172.16.0.11:9080",
          "upstream_local_address":"172.16.0.252:44448",
          "upstream_service_time":"9",
          "upstream_transport_failure_reason":"-",
          "user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.X.X Safari/537.36",
          "x_forwarded_for":"-"
      }

      ログには、以下の新しいフィールドが含まれています。

      "fallback_path":"outbound|9080|v3|reviews.default.svc.cluster.local:outbound|9080|v2|reviews.default.svc.cluster.local"
      "fallback_final_cluster_name":"outbound|9080|v2|reviews.default.svc.cluster.local"
      "fallback_result":"fallback successful"

      ログから、元の送信先が v3 であったことがわかります。v3 インスタンスが利用できなかったため、リクエストは v2 にフォールバックされました。

ステップ 3: 重み付けルーティングを使用したフォールバックの設定

  1. 次のコマンドを実行して、reviews-v3 バージョンを再び利用可能にします。

    kubectl scale deployment reviews-v3 --replicas=1
  2. reviews-route-fallback-sample2.yaml という名前のファイルを作成し、以下の内容を記述して reviews-route の定義を変更します。

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: reviews-route
      namespace: default
    spec:
      hosts:
        - reviews 
      http:
        - route:
            - destination:
                host: reviews 
                subset: v3
              fallback:
                target:
                  host: reviews 
                  subset: v2
              weight: 50
            - destination:
                host: reviews 
                subset: v2
              fallback:
                target:
                  host: reviews 
                  subset: v1
              weight: 50
          retries:
            attempts: 0
  3. 次のコマンドを実行して、reviews サービスの新しいルートとフォールバックルールをデプロイします。

    kubectl apply -f reviews-route-fallback-sample2.yaml
  4. ブラウザで http://${YourGatewayIp}/productpage にアクセスし、ページを繰り返し更新します。

    リクエストが reviews サービスの v2v3 バージョンに 50:50 の比率でルーティングされることがわかります。この例では、結果をより明確にするためにリトライは無効にされています。

  5. 次のコマンドを実行して v3 のレプリカを 0 にスケーリングし、そのフォールバックルールが期待どおりに機能することを確認します。

    kubectl scale deployment reviews-v3 --replicas=0

    productpage ページを複数回更新します。リクエストが一貫して v2 バージョンにルーティングされることがわかります。これは期待される動作です。

  6. 次のコマンドを実行して v2 のレプリカを 0 にスケーリングします。

    kubectl scale deployment reviews-v2 --replicas=0

    productpage ページを繰り返し更新すると、約 50% の確率で reviews サービスへのアクセスに失敗することがわかります。残りの 50% のリクエストは v2 バージョンに送信されます。v2 バージョンは異常なため、これらのリクエストは v1 バージョンにフォールバックします。コマンドを実行して BookInfo アプリケーションの製品ページにアクセスすると、reviews セクションに赤いエラータイトル Error fetching product reviews! とメッセージ Sorry, product reviews are currently unavailable for this book. が表示されます。これは、reviews-v2 のレプリカが 0 にスケールダウンされた後、製品レビューサービスが利用できなくなることを示しています。

  7. 次のコマンドを実行してログを表示します。

    kubectl logs -f  deployment/productpage-v1  -c istio-proxy --tail=10

    期待される出力:

    {
        "authority":"reviews:9080",
        "authority_for":"reviews:9080",
        "bytes_received":"0",
        "bytes_sent":"19",
        "downstream_local_address":"192.168.255.46:9080",
        "downstream_remote_address":"172.16.0.252:47738",
        "duration":"0",
        "fallback_path":"outbound|9080|v3|reviews.default.svc.cluster.local:outbound|9080|v2|reviews.default.svc.cluster.local",
        "fallback_final_cluster_name":"-",
        "fallback_result":"fallback cluster is unhealthy",
        "istio_policy_status":"-",
        "method":"GET",
        "path":"/reviews/0",
        "protocol":"HTTP/1.1",
        "request_id":"b207a764-b6d7-4ef8-bc71-59f264c3****",
        "requested_server_name":"-",
        "response_code":"503",
        "response_flags":"UH",
        "route_name":"-",
        "start_time":"2023-05-30T07:32:08.999Z",
        "trace_id":"a40c32a7b2cf****",
        "upstream_cluster":"outbound|9080|v3|reviews.default.svc.cluster.local",
        "upstream_host":"-",
        "upstream_local_address":"-",
        "upstream_service_time":"-",
        "upstream_transport_failure_reason":"-",
        "user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.X.X Safari/537.36",
        "x_forwarded_for":"-"
    }

    productpage-v1 の 503 ログが確認できます。reviews-route の重み付けルーティング設定に基づき、productpage からのリクエストの 50% は reviews サービスの v3 バージョンにルーティングされます。v3 バージョンは利用できないため、サイドカー (istio-proxy) はフォールバックルールに基づいて v3 から v2 バージョンへのフォールバックを試みます。v2 バージョンも異常なため、リクエストは v3 バージョンに送信されます。これは "upstream_cluster":"outbound|9080|v3|reviews.default.svc.cluster.local" フィールドを確認することで確認できます。