リクエストルーティング

このタスクでは、複数のバージョンのマイクロサービスにリクエストを動的にルーティングする方法を示します。

始める前に

このタスクについて

Istio Bookinfoサンプルは、それぞれに複数のバージョンを持つ4つの個別のマイクロサービスで構成されています。マイクロサービスの1つである`reviews`の3つの異なるバージョンがデプロイされ、同時に実行されています。これが引き起こす問題を説明するために、ブラウザでBookinfoアプリケーションの`/productpage`にアクセスし、数回更新します。URLは`http://$GATEWAY_URL/productpage`です。ここで、`$GATEWAY_URL`はBookinfoドキュメントで説明されているイングレスの外部IPアドレスです。

書籍レビューの出力に星評価が含まれる場合と含まれない場合があることに気付くでしょう。これは、ルーティング先の明示的なデフォルトサービスバージョンがない場合、Istioがラウンドロビン方式ですべての利用可能なバージョンにリクエストをルーティングするためです。

このタスクの最初の目標は、すべてのトラフィックをマイクロサービスのv1(バージョン1)にルーティングするルールを適用することです。後で、HTTPリクエストヘッダーの値に基づいてトラフィックをルーティングするルールを適用します。

バージョン1へのルーティング

1つのバージョンにのみルーティングするには、マイクロサービスのデフォルトバージョンにトラフィックを送信するルートルールを設定します。

  1. ルートルールを作成するには、次のコマンドを実行します。

Istioは、仮想サービスを使用してルートルールを定義します。各マイクロサービスのv1にすべてのトラフィックをルーティングする仮想サービスを適用するには、次のコマンドを実行します。

Zip
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@

設定の伝播は最終的に整合性が取れるため、仮想サービスが有効になるまで数秒待ってください。

  1. 定義されたルートは、次のコマンドで表示できます。
$ kubectl get virtualservices -o yaml
- apiVersion: networking.istio.io/v1
  kind: VirtualService
  ...
  spec:
    hosts:
    - details
    http:
    - route:
      - destination:
          host: details
          subset: v1
- apiVersion: networking.istio.io/v1
  kind: VirtualService
  ...
  spec:
    hosts:
    - productpage
    http:
    - route:
      - destination:
          host: productpage
          subset: v1
- apiVersion: networking.istio.io/v1
  kind: VirtualService
  ...
  spec:
    hosts:
    - ratings
    http:
    - route:
      - destination:
          host: ratings
          subset: v1
- apiVersion: networking.istio.io/v1
  kind: VirtualService
  ...
  spec:
    hosts:
    - reviews
    http:
    - route:
      - destination:
          host: reviews
          subset: v1

対応するsubset定義は、次のコマンドで表示することもできます。

$ kubectl get destinationrules -o yaml

Bookinfoマイクロサービス、特にreviewsサービスバージョン1のv1バージョンにルーティングするようにIstioを設定しました。

新しいルーティング設定のテスト

ブラウザでBookinfoアプリの/productpageをもう一度更新することで、新しい構成を簡単にテストできます。ページのレビュー部分は、何回更新しても、評価星が表示されません。これは、reviewsサービスのすべてのトラフィックをバージョンreviews:v1にルーティングするようにIstioを設定し、このバージョンのサービスが星評価サービスにアクセスしないためです。

このタスクの最初の部分である、サービスの1つのバージョンへのトラフィックのルーティングを正常に完了しました。

ユーザーIDに基づくルーティング

次に、特定のユーザーからのすべてのトラフィックが特定のサービスバージョンにルーティングされるように、ルート構成を変更します。この場合、Jasonという名前のユーザーからのすべてのトラフィックは、サービスreviews:v2にルーティングされます。

この例は、productpageサービスがreviewsサービスへのすべてのアウトバウンドHTTPリクエストにカスタムend-userヘッダーを追加するという事実によって有効になっています。

Istioは、イングレスゲートウェイでの強力に認証されたJWTに基づくルーティングもサポートしています。詳細については、JWTクレームベースのルーティングを参照してください。

reviews:v2は、星評価機能を含むバージョンであることに注意してください。

  1. ユーザーベースのルーティングを有効にするには、次のコマンドを実行します。
Zip
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@

次のコマンドを使用して、ルールが作成されたことを確認できます。

$ kubectl get virtualservice reviews -o yaml
apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1
  1. Bookinfoアプリの/productpageで、ユーザーjasonとしてログインします。

    ブラウザを更新します。何が表示されますか?星評価が各レビューの横に表示されます。

  2. 別のユーザーとしてログインします(任意の名前を選択します)。

    ブラウザを更新します。 अब तारे गायब हो गए हैं. これは、Jason以外のすべてのユーザーのトラフィックがreviews:v1にルーティングされるためです。

ユーザーIDに基づいてトラフィックをルーティングするようにIstioを正常に設定しました。

何が起こったのかを理解する

このタスクでは、Istioを使用して、トラフィックの100%を各Bookinfoサービスのv1バージョンに送信しました。次に、productpageサービスによってリクエストに追加されたカスタムend-userヘッダーに基づいて、reviewsサービスのバージョンv2にトラフィックを選択的に送信するルールを設定しました。

このタスクで使用されているBookinfoなどのKubernetesサービスは、IstioのL7ルーティング機能を利用するために、特定の制限事項を遵守する必要があることに注意してください。詳細については、ポッドとサービスの要件を参照してください。

トラフィックシフトタスクでは、ここで学習したのと同じ基本パターンに従って、サービスのあるバージョンから別のバージョンに徐々にトラフィックを送信するルートルールを設定します。

クリーンアップ

  1. アプリケーションルートルールを削除します。
Zip
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
  1. フォローアップタスクを実行する予定がない場合は、Bookinfoクリーンアップの手順を参照して、アプリケーションをシャットダウンしてください。
この情報は役に立ちましたか?
改善のための提案はありますか?

フィードバックをありがとうございます!