多くのマイクロサービスや多数のルーティングルールを持つアプリケーションでは、単一の VirtualService が肥大化し、維持が困難になることがあります。この問題に対処するため、Service Mesh (ASM) は、ルーティングルールを複数の VirtualService リソースに分割できる デリゲート メカニズムを提供します。これにより、ルーティング構成の変更に伴うリスクを軽減できます。このトピックでは、Bookinfo アプリケーションを例に、複数の VirtualService を使用してアプリケーションのルーティングルールを定義する方法を説明します。
前提条件
-
クラスターが ASM インスタンスに追加されており、ASM インスタンスのバージョンが 1.8.6.4 以降であること。
イングレスゲートウェイがデプロイされていること。詳細については、「イングレスゲートウェイの作成」をご参照ください。
-
ASM インスタンスに関連付けられているクラスターにアプリケーションがデプロイされていること。詳細については、「ASM インスタントへのアプリケーションのデプロイ」をご参照ください。
背景情報
Service Mesh (ASM) では、VirtualService を使用して、サービスへのトラフィックのルーティング方法を制御するルーティングルールを定義します。実際には、単一の大規模な VirtualService を維持することは困難な場合があります。ルーティングをアップグレードするたびにこの VirtualService を変更する必要があり、その結果、ルーティング構成において更新の競合、冗長性、密結合が発生しがちです。ルールに設定ミスがあると、データプレーンクラスター内のサービスに影響が及ぶ可能性があり、場合によってはすべてのサービスアクセスが中断されることさえあります。
ASM は、VirtualService リソースを デリゲート メカニズムで拡張し、ルーティングルールを分離します。VirtualService をプライマリ VirtualService と 1 つ以上のセカンダリ VirtualService に分割できます。プライマリ VirtualService は全体的なルールを定義し、セカンダリ VirtualService はアプリケーションの特定の部分に対する詳細なルーティングルールを定義します。プライマリ VirtualService は通常、中央の管理者が管理し、セカンダリ VirtualService は個々のサービスオーナーが管理します。この関心の分離により、ルーティングルール変更のリスクが大幅に軽減され、独立したサービスのデプロイとアップグレードの効率が向上します。
注意事項
-
ASM はネストされたデリゲートをサポートしていません。Delegate パラメーターは、プライマリ VirtualService でのみ設定できます。たとえば、Delegate パラメーターがプライマリ VirtualService とセカンダリ VirtualService の両方で設定されている場合、プライマリ VirtualService もセカンダリ VirtualService も有効になりません。
-
セカンダリ VirtualService の
HTTPMatchRequestは、プライマリ VirtualService の対応する match 条件のサブセットである必要があります。そうでない場合、競合が発生し、HTTPRouteは有効になりません。 -
delegateフィールドは、プライマリ VirtualService の HTTP ルートのrouteおよびredirectフィールドが空の場合にのみ指定できます。セカンダリ VirtualService のhostsフィールドは空である必要があります。セカンダリ VirtualService のルーティングルールは、プライマリ VirtualService のルーティングルールとマージされます。
ステップ 1: Gateway の設定
-
ASM コンソールにログインします。
-
左側のナビゲーションウィンドウで、 を選択します。
-
[メッシュ管理] ページで、設定する ASM インスタンスを見つけます。ASM インスタンスの名前をクリックするか、[操作] 列の [管理] をクリックします。
-
ASM インスタンスの詳細ページで、左側のナビゲーションウィンドウから を選択します。表示されたページで、[YAML から作成] をクリックします。
-
Namespaces を選択し、次の YAML コンテンツをエディターに貼り付けて、Create をクリックします。このトピックでは、
default名前空間を例として使用します。apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: ingressgateway # use istio default controller servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"numberを80に設定すると、Bookinfo サービスはポート 80 で送受信される HTTP 接続を受け入れることができます。
ステップ 2: プライマリ VirtualService の設定
-
ASM コンソールにログインします。
-
左側のナビゲーションウィンドウで、 を選択します。
-
[メッシュ管理] ページで、設定する ASM インスタンスを見つけます。ASM インスタンスの名前をクリックするか、[操作] 列の [管理] をクリックします。
-
ASM インスタンスの詳細ページで、左側のナビゲーションウィンドウから を選択します。表示されたページで、[YAML から作成] をクリックします。
-
Namespaces を選択し、次の YAML コンテンツをエディターに貼り付けて、Create をクリックします。このトピックでは、
default名前空間を例として使用します。以下では、vs-1 と vs-2 の
delegateを作成します。vs-1 は Bookinfo サービスにアクセスするためにリクエストに/logを含める必要があり、vs-2 は Bookinfo サービスにアクセスするためにリクエストに/を含める必要があります。apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: bookinfo namespace: default spec: gateways: - bookinfo-gateway hosts: - '*' http: - delegate: name: vs-1 namespace: ns1 match: - uri: prefix: /log - delegate: name: vs-2 namespace: ns1 match: - uri: prefix: /delegateフィールドのパラメーター:-
name:デリゲートの名前。
-
namespace:デリゲートの名前空間。
-
ステップ 3: 子の VirtualService を設定する
-
ASM コンソールにログインします。
-
左側のナビゲーションウィンドウで、 を選択します。
-
[メッシュ管理] ページで、設定する ASM インスタンスを見つけます。ASM インスタンスの名前をクリックするか、[操作] 列の [管理] をクリックします。
-
ASM インスタンスの詳細ページで、左側のナビゲーションウィンドウから を選択します。表示されたページで、[YAML から作成] をクリックします。
-
Namespaces を選択し、次のコンテンツをエディターに貼り付けて、Create をクリックします。
このトピックでは、
ns1名前空間を例として使用します。名前空間の作成方法の詳細については、「グローバル名前空間の管理」をご参照ください。apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: vs-1 namespace: ns1 spec: http: - match: - uri: exact: /login - uri: exact: /logout route: - destination: host: productpage.default.svc.cluster.local port: number: 9080-
metadata:プライマリ VirtualService の delegate パラメーターと一致させて、delegate パラメーターをバインドする必要があります。この例では、メタデータは vs-1 の delegate パラメーターと一致しており、vs-1 の delegate パラメーターをバインドします。
-
match:リクエストのフィルター条件を指定します。この例では、
uriはexact: /loginとexact: /logoutに設定されています。これにより、Bookinfo サービスへのログインとログアウトが可能になります。
-
-
再度、
ns1の Namespaces を選択し、次の YAML コンテンツをエディターに貼り付けて、Create をクリックします。apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: vs-2 namespace: ns1 spec: http: - match: - uri: exact: /productpage - uri: prefix: /static - uri: prefix: /api/v1/products route: - destination: host: productpage.default.svc.cluster.local port: number: 9080-
metadata:値はプライマリ VirtualService の delegate パラメーターと一致している必要があります。これは delegate パラメーターにバインドするために使用されます。この例では、値は vs-2 の delegate パラメーターと一致しており、vs-2 の delegate にバインドされることを意味します。
-
match:リクエストのフィルター条件を指定します。この例では、リクエストに /productpage、/static、または /api/v1/products が含まれている必要があります。
-
結果の確認
-
Web ブラウザーで http://<イングレスゲートウェイの IP アドレス>/productpage にアクセスします。
以下のページが表示されます。これは、
/productpageパラメーターを含む Bookinfo サービスへのリクエストが成功し、vs-2 の VirtualService が正常に設定されたことを示しています。ASM ゲートウェイアドレスの取得方法については、「イングレスゲートウェイの IP アドレスを取得する」をご参照ください。ページには BookInfo サンプル アプリケーションが正常にロードされ、書籍 The Comedy of Errors の製品ページが表示されます。左側の [書籍の詳細] セクションには、タイプ、ページ数、出版社、言語、ISBN などのフィールドが表示されます。右側の [書籍のレビュー] セクションには、複数のユーザーレビューと星評価が表示されます。これにより、サービスメッシュアプリケーションが ASM ゲートウェイ経由でアクセス可能であることが確認できます。 -
ページの右上隅にある [Sign in] をクリックします。表示されるダイアログボックスで、ユーザー名とパスワードを入力して Bookinfo サービスにサインインします。
ページが更新され、ログイン状態になります。これにより、
vs-1VirtualService が正しく設定されていることが確認されます。サインイン後、右上隅にユーザー名 (例:jason) と sign out リンクが表示され、サインインが成功したことが確認されます。