複数のマイクロサービスまたはルーティングルールを含むサービスのルーティングルールを定義するために仮想サービスを使用すると、仮想サービスが複雑になり、多くのメンテナンス作業が必要になります。ルーティングルールの変更によるリスクを軽減するために、Service Mesh(ASM)は、よりきめ細かい方法でルーティングルールを管理するためのデリゲートを導入しています。このトピックでは、複数の仮想サービスを使用してサービスのルーティングルールを定義する方法を示します。次の例では、Bookinfo アプリケーションを使用します。
前提条件
バージョン 1.8.6.4 以降の ASM インスタンスに Container Service for Kubernetes(ACK)クラスタが追加されています。詳細については、「ASM インスタンスへのクラスタの追加」をご参照ください。
イングレスゲートウェイがデプロイされています。詳細については、「イングレスゲートウェイの作成」をご参照ください。
アプリケーションは、ASM インスタンスに追加された ACK クラスタにデプロイされています。詳細については、「ASM インスタンスに追加された ACK クラスタへのアプリケーションのデプロイ」をご参照ください。
背景情報
Service Mesh では、仮想サービスを使用して、サービスにルーティングされるトラフィックを制御するためのルーティングルールを定義します。実際のシナリオでは、複雑な仮想サービスを維持する必要がある場合があります。仮想サービスによって定義されているルーティングルールを変更するたびに、仮想サービスを変更する必要があります。ルーティングルールが変更された後、ルーティングルールが互いに競合したり、特定のルーティングルールが冗長になったり、ルーティングルールが互いに結合されたりする可能性があります。ルーティングルールの構成エラーは、データプレーン上のクラスタにデプロイされているサービスに影響を与えたり、すべてのサービスにアクセスできなくしたりする可能性があります。
ASM は、仮想サービスの構成を拡張するためのデリゲートを導入しており、サービスに対して定義されているルーティングルールを分離できます。仮想サービスをプライマリ仮想サービスと複数のセカンダリ仮想サービスに分割できます。プライマリ仮想サービスは、サービスの全体的なルーティングルールを定義します。各セカンダリ仮想サービスは、サービスの詳細なルーティングルールを定義します。プライマリ仮想サービスは管理者によって管理され、セカンダリ仮想サービスはサービス管理者によって管理されます。これにより、ルーティングルールの変更によってもたらされるリスクが大幅に軽減され、独立したサービスのデプロイと更新の効率が向上します。
注意事項
delegate に関連するパラメータは、プライマリ仮想サービスでのみ設定できます。プライマリ仮想サービスとセカンダリ仮想サービスの両方で delegate に関連するパラメータを設定すると、プライマリ仮想サービスとセカンダリ仮想サービスは有効になりません。
セカンダリ仮想サービスの HTTPMatchRequest 構成は、プライマリ仮想サービスの HTTPMatchRequest 構成のサブセットである必要があります。そうでない場合、競合が発生し、HTTPRoute 構成は有効になりません。
delegate に関連するパラメータは、プライマリ仮想サービスの route フィールドと redirect フィールドが空のままになっている場合にのみ指定できます。セカンダリ仮想サービスの hosts フィールドは空のままにする必要があります。セカンダリ仮想サービスによって定義されたルーティングルールは、プライマリ仮想サービスによって定義されたルーティングルールと組み合わされます。
手順 1:Istio ゲートウェイを構成する
ASM コンソール にログインします。
左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列の ASM インスタンス名をクリックするか、[アクション] をクリックします。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。表示されるページで、[YAML から作成] をクリックします。
[名前空間] ドロップダウンリストから名前空間を選択し、次のコンテンツをコードエディターにコピーして、[作成] をクリックします。この例では、デフォルトの名前空間を使用します。
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:プライマリ仮想サービスを構成する
ASM コンソール にログインします。
左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列で、ASM インスタンスの名前をクリックするか、[アクション] をクリックします。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。表示されるページで、[YAML から作成] をクリックします。
[名前空間] ドロップダウンリストから名前空間を選択し、次のコンテンツをコードエディターにコピーして、[作成] をクリックします。この例では、デフォルトの名前空間を使用します。
次のコンテンツを使用して、vs-1 という名前の
delegate
と vs-2 という名前のデリゲートを作成できます。vs-1 デリゲートは、/log
を含むリクエスト URL のみを使用して Bookinfo アプリケーションにアクセスできることを指定します。vs-2 デリゲートは、/
を含むリクエスト URL のみを使用して 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:セカンダリ仮想サービスを構成する
ASM コンソール にログインします。
左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列の [アクション] をクリックするか、ASM インスタンスの名前をクリックします。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。表示されるページで、[YAML から作成] をクリックします。
[名前空間] ドロップダウンリストから名前空間を選択し、次のコンテンツをコードエディターにコピーして、[作成] をクリックします。
この例では、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:セカンダリ仮想サービスをプライマリ仮想サービスのデリゲートに関連付けます。metadata の設定は、プライマリ仮想サービスのデリゲートの設定と同じである必要があります。 この手順では、metadata の設定は vs-1 デリゲートの設定と同じです。これは、セカンダリ仮想サービスが vs-1 デリゲートに関連付けられていることを意味します。
match:HTTP リクエストのフィルタ条件を指定します。この手順では、
uri
はexact: /login
とexact: /logout
に設定されています。この設定は、Bookinfo アプリケーションにログインまたはログオフできることを指定します。
前の手順を繰り返します。[作成] ページで、[名前空間] ドロップダウンリストから名前空間を選択し、次のコンテンツをコードエディターにコピーして、[作成] をクリックします。
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:セカンダリ仮想サービスをプライマリ仮想サービスのデリゲートに関連付けます。 metadata の設定は、プライマリ仮想サービスのデリゲートの設定と同じである必要があります。 この手順では、metadata の設定は vs-2 デリゲートの設定と同じです。これは、セカンダリ仮想サービスが vs-2 デリゲートに関連付けられていることを意味します。
match:HTTP リクエストのフィルタ条件を指定します。この手順では、/productpage を含む、または /static または /api/v1/products で始まるリクエスト URL のみを使用して Bookinfo アプリケーションにアクセスできることを指定します。
結果の確認
ブラウザのアドレスバーに http://<ASM イングレスゲートウェイの IP アドレス>/productpage と入力します。
次のページが表示されます。これは、
/productpage
を含むリクエスト URL を使用して Bookinfo アプリケーションにアクセスしたことを意味します。結果は、vs-2 デリゲートに関連付けられたセカンダリ仮想サービスが有効になっていることを示しています。ASM イングレスゲートウェイの IP アドレスを取得する方法の詳細については、「Istio リソースを使用してトラフィックをサービスの異なるバージョンにルーティングする」トピックの「イングレスゲートウェイの IP アドレスを取得する」セクションをご参照ください。右上隅の [サインイン] をクリックします。表示されるダイアログボックスで、ユーザー名と対応するパスワードを入力して Bookinfo アプリケーションにログインします。
次のページが表示されます。これは、Bookinfo アプリケーションにログインしたことを意味します。結果は、vs-1 デリゲートに関連付けられたセカンダリ仮想サービスが有効になっていることを示しています。