イングレスゲートウェイ
Istioは、Kubernetes Ingress6 リソースのサポートに加えて、Istio Gateway または Kubernetes Gateway7 リソースを使用してイングレストラフィックを設定することもできます。Gateway
は Ingress
よりも広範なカスタマイズと柔軟性を提供し、モニタリングやルートルールなどのIstioの機能をクラスタに流入するトラフィックに適用できます。
このタスクでは、Gateway
を使用してサービスメッシュの外部にサービスを公開するようにIstioを設定する方法について説明します。
始める前に
インストールガイド9の手順に従ってIstioをセットアップします。
イングレストラフィックのターゲットサービスとして機能する httpbin10 サンプルを開始します。
このドキュメントでは、ゲートウェイを使用して「Kubernetesクラスタ」へのイングレストラフィックを制御する方法を示しているため、サイドカーインジェクションを有効または無効にして
httpbin
サービスを開始できます(つまり、ターゲットサービスはIstioメッシュの内部または外部のいずれかに配置できます)。
ゲートウェイを使用したイングレスの設定
イングレス Gateway
は、メッシュのエッジで動作し、着信HTTP/TCP接続を受信するロードバランサーを記述します。公開ポート、プロトコルなどを設定しますが、Kubernetes Ingressリソース12 とは異なり、トラフィックルーティング設定は含まれていません。イングレストラフィックのトラフィックルーティングは、代わりに、内部サービスリクエストの場合とまったく同じ方法で、ルーティングルールを使用して設定されます。
HTTPトラフィック用にポート80で Gateway
を設定する方法を見てみましょう。
Istio Gateway13 を作成します。
Gateway
を介して入ってくるトラフィックのルートを設定します。
これで、パス /status
と /delay
のトラフィックを許可する2つのルートルールを含む、httpbin
サービスの 仮想サービス14 設定が作成されました。
gateways リストは、httpbin-gateway
を介したリクエストのみが許可されることを指定します。その他のすべての外部リクエストは、404レスポンスで拒否されます。
Kubernetes Gateway を作成します。
Kubernetes Gateway
リソースを作成すると、関連付けられたプロキシサービスもデプロイされるため、次のコマンドを実行してゲートウェイの準備ができるまで待ちます。
Gateway
を介して入ってくるトラフィックのルートを設定します。
これで、パス /status
と /delay
のトラフィックを許可する2つのルートルールを含む、httpbin
サービスの HTTP Route 設定が作成されました。
イングレスのIPとポートの確認
すべての Gateway
は、LoadBalancerタイプのサービス15 によって支えられています。このサービスの外部ロードバランサーのIPとポートは、ゲートウェイへのアクセスに使用されます。LoadBalancer
タイプのKubernetesサービスは、ほとんどのクラウドプラットフォームで実行されているクラスタではデフォルトでサポートされていますが、一部の環境(例:テスト)では、次の操作が必要になる場合があります。
minikube
- 別のターミナルで次のコマンドを実行して、外部ロードバランサーを起動します。kind
-LoadBalancer
タイプのサービスを動作させるには、MetalLBのセットアップガイド16 に従ってください。その他のプラットフォーム - MetalLB17 を使用して、
LoadBalancer
サービスのEXTERNAL-IP
を取得できる場合があります。
便宜上、イングレスのIPとポートを環境変数に格納し、後続の手順で使用します。以下の手順に従って、INGRESS_HOST
および INGRESS_PORT
環境変数を設定します。
Istioイングレスゲートウェイがクラスタ内に配置されている名前と名前空間に、次の環境変数を設定します。
Kubernetesクラスタが外部ロードバランサーをサポートする環境にあるかどうかを判断するには、次のコマンドを実行します。
EXTERNAL-IP
値が設定されている場合、環境にはイングレスゲートウェイに使用できる外部ロードバランサーがあります。EXTERNAL-IP
値が <none>
(または永久に <pending>
)の場合、環境はイングレスゲートウェイの外部ロードバランサーを提供していません。
環境が外部ロードバランサーをサポートしていない場合は、イングレスゲートウェイにノードポートを使用してアクセスすることを試すことができます。それ以外の場合は、次のコマンドを使用してイングレスのIPとポートを設定します。
httpbinゲートウェイリソースからゲートウェイのアドレスとポートを取得します。
イングレスサービスへのアクセス
curl を使用して httpbin サービスにアクセスします。
-H
フラグを使用して、Host HTTPヘッダーを「httpbin.example.com」に設定していることに注意してください。これは、イングレスGateway
が「httpbin.example.com」を処理するように設定されていますが、テスト環境ではそのホストのDNSバインディングがなく、リクエストをイングレスIPに送信しているだけなので、必要です。明示的に公開されていない他のURLにアクセスします。HTTP 404エラーが表示されるはずです。
ブラウザを使用したイングレスサービスへのアクセス
curl
のようにブラウザに Host ヘッダーを渡すことができないため、ブラウザで httpbin
サービスのURLを入力しても機能しません。実際の状況では、リクエストされたホストを正しく設定し、DNSで解決できるようにするため、これは問題になりません。したがって、URLにはホストのドメイン名を使用します(例:https://httpbin.example.com/status/200
)。
簡単なテストとデモでは、次のようにこの問題を回避できます。
Gateway
および VirtualService
設定のホストにワイルドカード *
値を使用します。たとえば、イングレス設定を次のように変更します。
Gateway
および HTTPRoute
設定からホスト名を削除すると、それらはすべてのリクエストに適用されます。たとえば、イングレス設定を次のように変更します。
その後、ブラウザのURLで $INGRESS_HOST:$INGRESS_PORT
を使用できます。たとえば、http://$INGRESS_HOST:$INGRESS_PORT/headers
は、ブラウザが送信するすべてのヘッダーを表示します。
何が起こったかの理解
Gateway
設定リソースにより、外部トラフィックがIstioサービスメッシュに流入し、Istioのトラフィック管理およびポリシー機能をエッジサービスで使用できるようになります。
前の手順では、サービスメッシュ内にサービスを作成し、サービスのHTTPエンドポイントを外部トラフィックに公開しました。
イングレスゲートウェイサービスのノードポートの使用
環境が外部ロードバランサーをサポートしていない場合でも、istio-ingressgateway
サービスの ノードポート を使用することで、Istioの一部の機能を試すことができます。
イングレスポートを設定します。
イングレスIPの設定は、クラスタプロバイダーによって異なります。
GKE
ingressgateway サービスのポートへのTCPトラフィックを許可するファイアウォールルールを作成する必要があります。HTTPポート、セキュアポート(HTTPS)、またはその両方のトラフィックを許可するには、次のコマンドを実行します。
IBM Cloud Kubernetes Service
Docker For Desktop
その他の環境
トラブルシューティング
INGRESS_HOST
およびINGRESS_PORT
環境変数の値を調べます。次のコマンドの出力に従って、有効な値が設定されていることを確認します。同じポートに他のIstioイングレスゲートウェイが定義されていないことを確認します。
同じIPとポートにKubernetes Ingressリソースが定義されていないことを確認します。
外部ロードバランサーがあり、それが機能しない場合は、ノードポートを使用してゲートウェイにアクセスすることを試してください。