フォールバックメカニズムは、サービス呼び出しが失敗した場合の代替アクションを定義します。マイクロサービスに障害が発生したり、利用できなくなったりした場合、このメカニズムはバックアップサービスを呼び出してリクエストを処理し、システムの安定性と可用性を確保します。例えば、サービスエンドポイントが利用できない場合、フォールバックメカニズムを使用してリクエストをバックアップサービスのバージョンに転送できます。これにより、クライアントのリクエストがエラーや中断なく処理されることが保証されます。Alibaba Cloud Service Mesh (ASM) は、VirtualService の fallback パラメーターを通じてこのメカニズムをサポートします。このトピックでは、ASM でフォールバックメカニズムを使用する方法について説明します。
前提条件
Enterprise Edition または Ultimate Edition の ASM インスタンス (バージョン 1.17.2.22 以降) があること。詳細については、「ASM インスタンスの作成」をご参照ください。
説明ご利用の ASM インスタンスのバージョンが 1.17 より前の場合は、インスタンスを 1.17.2.22 以降に更新するか、チケットを送信してテクニカルサポートを受けてください。インスタンスの更新方法の詳細については、「ASM インスタンスのアップグレード」をご参照ください。
ACK クラスターが ASM インスタンスに追加されていること。詳細については、「ASM インスタンスへのクラスターの追加」をご参照ください。
Bookinfo サンプルがデプロイされていること。詳細については、「ASM インスタンスに関連付けられたクラスターへのアプリケーションのデプロイ」をご参照ください。
データプレーンのサイドカーのバージョンが 1.17 以降であること。
設定
このトピックでは、Bookinfo サンプルアプリケーションの reviews サービスを例として使用します。productpage サービスが reviews サービスの v1、v2、v3 バージョンにアクセスする際に、v3 バージョンが利用できない場合、フォールバックメカニズムがリクエストを v2 バージョンにルーティングします。これにより、サービスが 503 エラーを返すのを防ぎます。
[設定ファイル] をクリックして、このトピックで使用する YAML ファイルをダウンロードできます。
ステップ 1: Bookinfo サンプルへのアクセス
reviews.yamlという名前のファイルを作成し、以下の内容を記述してreviewsサービスのv1、v2、v3バージョンを宣言します。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ご利用の KubeConfig 環境で、次のコマンドを実行して DestinationRule をデプロイします。
kubectl apply -f reviews.yaml次のいずれかの方法で、イングレスゲートウェイの IP アドレスを取得します。
方法 1:次のコマンドを実行します。
kubectl get svc -n istio-system istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'方法 2:ASM コンソールの Ingress Gateway ページからイングレスゲートウェイの IP アドレスを取得します。詳細については、「ASM ゲートウェイのエンドポイントの取得」をご参照ください。
ブラウザで
http://${YourGatewayIp}/productpageにアクセスします。${YourGatewayIp}は前のステップで取得したゲートウェイ IP です。バージョンは Reviews served by の値または星の表示で識別できます。バージョン v1 には星がなく、バージョン v2 には黒い星、バージョン v3 には赤い星が表示されます。例えば、reviews-v2 という値はバージョン
v2を示し、黒い星が表示されます。
ページを複数回更新します。リクエストは
reviewsサービスのv1、v2、v3バージョンに負荷分散されます。
ステップ 2: ルートとフォールバックルールの定義
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: v2ASM インスタンスの KubeConfig 環境で、次のコマンドを実行して
reviewsサービスのルートとフォールバックルールをデプロイします。kubectl apply -f reviews-route-fallback-sample1.yamlWeb ブラウザで
http://${YourGatewayIp}/productpageにアクセスし、ページを更新し続けます。リクエストが一貫して
reviewsサービスのv3バージョンにルーティングされることがわかります。更新後、ページには書籍レビューサービスが reviews-v3 によって提供されていることが示され、レビューには赤い星の評価が含まれます。reviews-v3バージョンのレプリカを 0 にスケーリングして、障害をシミュレートします。kubectl scale deployment reviews-v3 --replicas=0ブラウザで
http://${YourGatewayIp}/productpageにアクセスし、ページを繰り返し更新します。リクエストが正しく
reviewsサービスのv2バージョンにフォールバックすることがわかります。フォールバック関連のフィールドをカスタムアクセスログ形式に追加し、ログを確認することで、フォールバックが発生したことを検証できます。
ステップ 3: 重み付けルーティングを使用したフォールバックの設定
次のコマンドを実行して、
reviews-v3バージョンを再び利用可能にします。kubectl scale deployment reviews-v3 --replicas=1reviews-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次のコマンドを実行して、
reviewsサービスの新しいルートとフォールバックルールをデプロイします。kubectl apply -f reviews-route-fallback-sample2.yamlブラウザで
http://${YourGatewayIp}/productpageにアクセスし、ページを繰り返し更新します。リクエストが
reviewsサービスのv2とv3バージョンに 50:50 の比率でルーティングされることがわかります。この例では、結果をより明確にするためにリトライは無効にされています。次のコマンドを実行して
v3のレプリカを 0 にスケーリングし、そのフォールバックルールが期待どおりに機能することを確認します。kubectl scale deployment reviews-v3 --replicas=0productpageページを複数回更新します。リクエストが一貫してv2バージョンにルーティングされることがわかります。これは期待される動作です。次のコマンドを実行して
v2のレプリカを 0 にスケーリングします。kubectl scale deployment reviews-v2 --replicas=0productpage ページを繰り返し更新すると、約 50% の確率で reviews サービスへのアクセスに失敗することがわかります。残りの 50% のリクエストは v2 バージョンに送信されます。v2 バージョンは異常なため、これらのリクエストは v1 バージョンにフォールバックします。コマンドを実行して BookInfo アプリケーションの製品ページにアクセスすると、reviews セクションに赤いエラータイトル Error fetching product reviews! とメッセージ
Sorry, product reviews are currently unavailable for this book.が表示されます。これは、reviews-v2 のレプリカが 0 にスケールダウンされた後、製品レビューサービスが利用できなくなることを示しています。次のコマンドを実行してログを表示します。
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"フィールドを確認することで確認できます。