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

Alibaba Cloud Service Mesh:ASM でのフォールバックルーティングの設定

最終更新日:Mar 12, 2026

あるサービスバージョンが利用できなくなると、そのバージョンへのリクエストは HTTP 503 エラーを返します。フォールバックルーティングは、プロキシレベルでリクエストを代替のサービスバージョンに自動的にリダイレクトすることで、この問題を解決します。Service Mesh (ASM) は、Istio の VirtualService リソースを拡張し、この代替ルートを定義する fallback フィールドを提供します。

このトピックでは、Bookinfo サンプルアプリケーションを使用して、フォールバックルーティングについて説明します。具体的には、以下の内容を扱います。

  • すべてのトラフィックを特定のサービスバージョンにルーティングする

  • プライマリバージョンが到達不能になった場合にトラフィックを受信するフォールバックターゲットを定義する

  • 高度なシナリオのためにフォールバックと加重ルーティングを組み合わせる

  • カスタムアクセスログを通じてフォールバックの動作を検証する

フォールバックとリトライ、サーキットブレーカーの違い

ASM は、いくつかの回復性メカニズムを提供します。対応する必要がある障害モードに基づいて、適切なものを選択してください。

メカニズム障害モード動作使用するケース
フォールバックサブセット内のすべてのエンドポイントが到達不能代替サブセットへのリダイレクトバックアップバージョンまたはデプロイメントがリクエストを処理できる場合
リトライ一時的なエラー (タイムアウト、5xx)同じサブセットへのリクエストの再送信エラーが断続的で、リトライによって成功する可能性が高い場合
サーキットブレーカー持続的な高エラー率異常なエンドポイントへのトラフィック送信の停止カスケード障害からダウンストリームサービスを保護する場合

フォールバックはルーティングレベルで動作します。サイドカープロキシは、リクエストを転送する前に、ターゲットサブセットに正常なエンドポイントがあるかどうかを確認します。正常なエンドポイントが存在しない場合、代わりにフォールバックターゲットにルーティングします。

前提条件

要件詳細
ASM インスタンスEnterprise Edition または Ultimate Edition、バージョン 1.17.2.22 以降
Kubernetes クラスターASM インスタンスに追加された Container Service for Kubernetes (ACK) クラスター。詳細は、ASM インスタンスへのクラスターの追加をご参照ください。
サンプルアプリケーションクラスターにデプロイされた Bookinfo。詳細は、ASM インスタンスでのアプリケーションのデプロイをご参照ください。
サイドカープロキシのバージョン1.17 以降 すべてのデータプレーン Pod で
説明

ご利用の ASM インスタンスのバージョンが 1.17 より前の場合は、1.17.2.22 以降に更新してください。詳細は、ASM インスタンスの更新をご参照ください。または、チケットを送信してテクニカルサポートを依頼してください。

説明

ASM コンソール[インスタンスステータス] ページで、各 Pod のサイドカープロキシのバージョンを確認してください。詳細については、「アップグレード管理」をご参照ください。

Bookinfo の reviews サービスのバージョン

Bookinfo の reviews サービスには 3 つのバージョンがあり、それぞれ製品ページの星評価で識別できます。

バージョン星評価
v1星なし
v2黒い星
v3赤い星

productpage サービスは reviews を呼び出します。VirtualService はすべてのトラフィックを reviews-v3 にルーティングします。v3 が利用できなくなった場合、フォールバックルールは 503 エラーを返す代わりに、リクエストを reviews-v2 にリダイレクトします。

このトピックで使用される構成ファイルをダウンロード

ステップ 1:reviews サービスの宛先ルールの作成

reviews サービスの各バージョンに対応するサブセットを持つ DestinationRule を定義します。

  1. reviews.yaml という名前のファイルを作成し、次の内容を記述します。

       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. kubectl と KubeConfig ファイルを使用して ASM インスタンスに接続し、ルールを適用します。

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

  4. ブラウザで http://<gateway-ip>/productpage を開きます。Reviews served by フィールドと星評価によって、各リクエストを処理しているバージョンがわかります。ページを数回リフレッシュすると、リクエストは v1、v2、v3 に分散されます。例えば、reviews-v2 は黒い星を表示します。

    reviews-v2 with black stars

ステップ 2:基本的なフォールバックルールの設定

すべてのトラフィックを reviews-v3 にルーティングし、reviews-v2 をフォールバックターゲットとして設定します。

  1. reviews-route-fallback-sample1.yaml という名前のファイルを作成します。fallback.target フィールドは、reviews-v3 が到達不能な場合にリクエストを reviews-v2 に転送するようサイドカープロキシに指示します。

       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. VirtualService を適用します。

       kubectl apply -f reviews-route-fallback-sample1.yaml
  3. http://<gateway-ip>/productpage を開いてリフレッシュします。すべてのリクエストが v3 (赤い星) にルーティングされるようになります。

    reviews-v3 with red stars

  4. v3 のデプロイメントを 0 レプリカにスケーリングして、v3 の障害をシミュレートします。

       kubectl scale deployment reviews-v3 --replicas=0
  5. ページをリフレッシュします。リクエストは v2 (黒い星) にフォールバックされるようになります。

アクセスログによるフォールバックの検証

フォールバック関連のフィールドをカスタムアクセスログのフォーマットに追加して、フォールバックがトリガーされたことを確認します。設定手順については、アクセスログフィールドのカスタマイズをご参照ください。

フィールド説明
fallback_path%DYNAMIC_METADATA(com.aliyun.fallback:fallback-path)%フォールバックチェーン。A:B は A が B にフォールバックしたことを意味します。A:B:C は A が B に、その後 B が C にフォールバックしたことを意味します。
fallback_final_cluster_name%DYNAMIC_METADATA(com.aliyun.fallback:final-cluster)%フォールバックが成功した後に最終的にリクエストを処理したクラスター。
fallback_result%DYNAMIC_METADATA(com.aliyun.fallback:fallback-result)%フォールバックの結果。フォールバックが失敗した場合、リクエストは元のルートのクラスターに送られます。
Custom log format configuration

productpage-v1 の istio-proxy ログを確認します。v3 から 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": "-"
}

3 つのフォールバック固有のフィールドがこの動作を裏付けます。

  • fallback_path は、v3 クラスターから v2 クラスターへのチェーンを示します。

  • fallback_final_cluster_name は、リクエストを処理したクラスターが v2 であることを示します。

  • fallback_result"fallback successful" です。

ステップ 3:フォールバックと加重ルーティングの組み合わせ

フォールバックルールは加重ルーティングと連携して機能します。このシナリオでは、トラフィックは v3 と v2 の間で 50/50 に分割され、各バージョンには独自のフォールバックターゲットがあります。

  1. v3 を復元します。

       kubectl scale deployment reviews-v3 --replicas=1
  2. reviews-route-fallback-sample2.yaml という名前のファイルを作成します。2 つの独立したフォールバックチェーンが定義されています。テスト中にフォールバックの動作をリトライの動作から分離するため、リトライは無効 (attempts: 0) になっています。

    • v3 トラフィック (50%):v3 が利用できない場合、v2 にフォールバックします

    • v2 トラフィック (50%):v2 が利用できない場合、v1 にフォールバックします

       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. 更新された VirtualService を適用します。

       kubectl apply -f reviews-route-fallback-sample2.yaml
  4. 製品ページをリフレッシュします。リクエストは v3 (赤い星) と v2 (黒い星) の間で均等に分散されます。

v3 がダウンした場合のフォールバックのテスト

  1. v3 をゼロにスケーリングします。ページをリフレッシュします。すべてのリクエストが v2 に到達するようになります。元々 v3 をターゲットとしていた 50% は v2 にフォールバックし、残りの 50% は直接 v2 にルーティングされます。

       kubectl scale deployment reviews-v3 --replicas=0

v3 と v2 の両方がダウンした場合のフォールバックのテスト

  1. v2 をゼロにスケーリングします。ページをリフレッシュします。2 つの動作が交互に発生します。productpage error when both v3 and v2 are unavailable

    • リクエストの 50% が成功:これらは元々 v2 にルーティングされたリクエストで、v1 (星なし) にフォールバックします。

    • リクエストの 50% が 503 エラーで失敗:これらは元々 v3 にルーティングされたリクエストです。プロキシは v2 へのフォールバックを試みますが、v2 もダウンしているため、フォールバックチェーンは v1 には及びません。

       kubectl scale deployment reviews-v2 --replicas=0
  2. ログでこれを確認します。失敗したフォールバックは、次のようなログエントリを生成します。失敗したフォールバックログの主要なフィールドは次のとおりです。

    • response_code503 はリクエストが処理されなかったことを示します。

    • response_flagsUH (Upstream Host Unhealthy)。

    • fallback_result"fallback cluster is unhealthy" は、フォールバックターゲット (v2) も利用できなかったことを示します。

    • upstream_cluster:依然として v3 クラスターを示しており、元のルーティング先を確認できます。

       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": "-"
       }

本番環境でのフォールバックの使用

フォールバックルーティングはサービスの障害をマスクするため、可用性にとっては価値がありますが、本番環境では慎重な計画が必要です。

フォールバック頻度の監視

持続的に高いフォールバック率は、プライマリサービスバージョンに根本的な問題があることを示します。サイレントフェイルオーバーとして依存するのではなく、fallback_result アクセスログフィールドにアラートを設定して、フォールバックが繰り返しトリガーされるタイミングを検出してください。

キャパシティプランニング

フォールバックがトリガーされると、フォールバックターゲットは通常の負荷を超える追加のトラフィックを受け取ります。フォールバックサービスバージョンが、通常のトラフィックとリダイレクトされたトラフィックの両方を処理するのに十分なキャパシティを持っていることを確認してください。ステップ 3 の加重ルーティングのシナリオでは、v3 がダウンした場合、v2 は総トラフィックの最大 100% を処理できなければなりません。

フォールバックチェーンの深さ

フォールバックは、複数のホップにわたって自動的にカスケードされません。加重ルーティングの例では、v3 が v2 にフォールバックし、v2 もダウンしている場合、リクエストは 503 で失敗し、v1 には続きません。各ルートエントリは、独自の独立したフォールバックターゲットを維持します。これに応じてフォールバックチェーンを計画してください。

関連トピック