複数のイングレスゲートウェイが異なるクラシックロードバランサー (CLB) インスタンスのフロントエンドとして動作しているものの、同一のリスナー設定を必要とする場合、各ゲートウェイを個別に設定すると重複構成や構成ドリフトのリスクが生じます。Service Mesh (ASM) では、複数のイングレスゲートウェイデプロイメントに共通のラベルを割り当て、単一の Gateway リソースの spec.selector に同じラベルを設定できます。これにより、1 つの Istio ゲートウェイ構成で、該当するすべてのイングレスゲートウェイに適用できます。
本トピックでは、イングレスゲートウェイに共通ラベルを追加し、Gateway の selector を設定して、単一の Istio ゲートウェイ構成を複数のイングレスゲートウェイに適用する方法について説明します。
ゲートウェイセレクターの仕組み
Gateway リソースは、spec.selector を使用して、イングレスゲートウェイの Pod に付与されたラベルと照合します。Pod に一致するラベルが付与されているすべてのイングレスゲートウェイは、その Gateway 構成を適用されます。
たとえば、2 つのイングレスゲートウェイデプロイメントの両方に key1: value1 というラベルが付与されている場合、selector: {key1: value1} を指定した Gateway は、両方のイングレスゲートウェイに適用されます。
DNS A レコード (xxx.xxx.cn)
|-- CLB インスタンス 1 --> イングレスゲートウェイ 1 --\
| +--> Gateway (selector: key1: value1) --> 仮想サービス
\-- CLB インスタンス 2 --> イングレスゲートウェイ 2 --/Gateway リソースは、プロキシが特定のポート (レイヤー 4-6) でリッスンするように設定するだけです。レイヤー 7 ルーティングルールは定義しません。バックエンドサービスにトラフィックをルーティングするには、ゲートウェイを仮想サービスにバインドする必要があります。リファレンスの詳細については、「Istio Gateway」と「VirtualService」をご参照ください。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
v1.13.4.46 以降の ASM インスタンスが存在すること。詳細については、「ASM インスタンスの作成」をご参照ください。
ASM インスタンスに追加されたクラスターです。「ASM インスタンスにクラスターを追加する」を参照してください。
少なくとも 2 つのイングレスゲートウェイがデプロイ済みであること。詳細については、「イングレスゲートウェイの作成」をご参照ください。
ASM インスタンスにデプロイされたアプリケーション。詳細については、「ASM インスタンスにアプリケーションをデプロイする」をご参照ください。
ステップ 1:各イングレスゲートウェイに共通ラベルを追加する
Istio ゲートウェイを共有するすべてのイングレスゲートウェイに、同一のラベルを追加します。
ASM コンソールにログインします。左側ナビゲーションウィンドウで、Service Mesh > メッシュ管理 を選択します。
メッシュ管理 ページで、ASM インスタンスの名前をクリックします。
左側ナビゲーションウィンドウで、ASM ゲートウェイ > イングレスゲートウェイ を選択します。
イングレスゲートウェイ ページで、最初のイングレスゲートウェイを見つけ、YAML をクリックします。
編集 ダイアログボックスで、
specの下にpodLabelsフィールドを追加し、OK をクリックします。... spec: podLabels: key1: value1 ...同一の Istio ゲートウェイを共有する他のイングレスゲートウェイについても、手順 4~5 を繰り返します。
ラベルの確認
各イングレスゲートウェイの Pod に期待されるラベルが正しく付与されていることを確認するには、以下のコマンドを実行します。
kubectl get pods -n istio-system --show-labels | grep <ingress-gateway-name><ingress-gateway-name> は、ご利用のイングレスゲートウェイデプロイメントの名前に置き換えてください。出力結果のラベル列に key1=value1 が含まれていることを確認します。出力例:
ingress-gateway-1-xxx 1/1 Running 0 2d app=istio-ingressgateway,key1=value1,...ステップ 2:Gateway セレクターを設定する
Istio ゲートウェイを、label で指定されたイングレスゲートウェイに設定するには、spec.selector を同じ label に設定します。
ASM インスタンスの詳細ページで、左側ナビゲーションウィンドウから ASM ゲートウェイ > ゲートウェイ を選択します。
ゲートウェイ ページで、対象の Istio ゲートウェイを見つけ、操作 列の YAML をクリックします。
編集 ダイアログボックスで、
selectorフィールドをステップ 1 で追加したラベルと一致するように設定し、OK をクリックします。両方のイングレスゲートウェイにkey1: value1が付与されているため、この単一の Gateway リソースが両方のイングレスゲートウェイに適用されます。apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: bookinfo-gateway namespace: default spec: selector: key1: value1 servers: - hosts: - '*' port: name: http number: 80 protocol: HTTP
Gateway のバインド確認
Gateway リソースが正しく設定されていることを確認するには、以下のコマンドを実行します。
kubectl get gateway bookinfo-gateway -n default -o yamlspec.selector に key1: value1 が表示され、spec.servers に期待されるポートおよびプロトコルがリストされていることを確認します。出力例:
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: bookinfo-gateway
namespace: default
spec:
selector:
key1: value1
servers:
- hosts:
- '*'
port:
name: http
number: 80
protocol: HTTP次のステップ
Gateway リソースはリスナーの設定のみを行います。トラフィックをバックエンドサービスにルーティングするには、このゲートウェイを参照する仮想サービスを作成します。詳細については、「仮想サービスの管理」をご参照ください。
Gateway およびイングレスゲートウェイの CRD フィールドの詳細については、「ASM ゲートウェイの CRD フィールド」をご参照ください。