第2章 トラフィックをメッシュに取り込む
Istio API を使用すると、ゲートウェイインジェクションを使用してインストールされたゲートウェイプロキシーを設定して、メッシュ外部からのトラフィックを受け入れ、そのトラフィックをメッシュ内のサービスにルーティングできます。
LoadBalancer タイプの Service または OpenShift Routes のいずれかを使用して、ゲートウェイプロキシーをクラスター外部のトラフィックに公開できます。
2.1. ゲートウェイインジェクションを使用してインストールされたゲートウェイを Ingress トラフィックを受け入れるように設定することについて リンクのコピーリンクがクリップボードにコピーされました!
ゲートウェイインジェクションを使用してゲートウェイをインストールすると、Istio Gateway と VirtualService リソースを組み合わせて Ingress トラフィックを受信するようにゲートウェイを設定できます。Istio Gateway リソースは、着信または発信の HTTP/TCP 接続を受信するメッシュのエッジで動作するロードバランサーを表します。Gateway 仕様には、公開する必要があるポートのセット、使用するプロトコルのタイプ、およびロードバランサーの Server Name Indication (SNI) 設定が記述されています。VirtualServices は、VirtualServices を使用して内部メッシュトラフィックのルーティングルールを定義するのと同様に、Istio Gateway に適用するルーティングルールを定義します。
次の例では、Istio Gateway リソースは、外部トラフィックのエントリーポイントとして機能するゲートウェイプロキシーを設定します。この設定では、ホスト info.com のポート 443 (HTTPS) が公開されます。この設定例は、istio: ingressgateway ラベルを持つ Pod に適用されます。tls モードは SIMPLE と設定され、例で提供される証明書と秘密鍵を使用して着信 HTTPS トラフィックを終了します。
設定例
次の VirtualService は、前の設定例に示されている Istio Gateway リソースにバインドされています。この仕様では、/reviews/ パス接頭辞を持つトラフィックを info namespace のレビューサービスにルーティングするためのルールが定義されています。VirtualService は、前に示した Gateway リソースを明示的に参照します。これにより、指定されたゲートウェイを通じて入ってくるトラフィックにのみルーティングルールが適用されるようになります。
設定例
2.1.1. Istio Gateway と VirtualService リソースを使用してサービスを公開する リンクのコピーリンクがクリップボードにコピーされました!
この手順では、Istio Gateway および VirtualService リソースを使用して、ゲートウェイインジェクションを使用してデプロイされたゲートウェイを設定します。リソースは、メッシュ内のサービスをメッシュ外のトラフィックに公開するようにゲートウェイを設定します。次に、ゲートウェイの Service を LoadBalancer タイプに設定して、ゲートウェイをクラスター外部のトラフィックに公開します。
前提条件
- ゲートウェイインジェクションを使用して Istio ゲートウェイをインストールしている。
手順
次のコマンドを実行して、
httpbinという namespace を作成します。oc create namespace httpbin
$ oc create namespace httpbinCopy to Clipboard Copied! Toggle word wrap Toggle overflow namespace でサイドカーインジェクションを有効にします。
InPlaceアップグレードストラテジーを使用している場合は、次のコマンドを実行します。oc label namespace httpbin istio-injection=enabled
$ oc label namespace httpbin istio-injection=enabledCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記RevisionBasedアップグレードストラテジーを使用している場合は、次のコマンドを実行します。<revision-name>を見つけるには、次のコマンドを実行します。oc get istiorevisions.sailoperator.io
$ oc get istiorevisions.sailoperator.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力サンプル
NAME TYPE READY STATUS IN USE VERSION AGE default Local True Healthy True v1.24.3 3m33s
NAME TYPE READY STATUS IN USE VERSION AGE default Local True Healthy True v1.24.3 3m33sCopy to Clipboard Copied! Toggle word wrap Toggle overflow サイドカーインジェクションを有効にするには、namespace にリビジョン名でラベルを付けます。
oc label namespace httpbin istio.io/rev=default
$ oc label namespace httpbin istio.io/rev=defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow
次のコマンドを実行して、
httpbinという名前のサンプルサービスをデプロイします。oc apply -n httpbin -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yaml
$ oc apply -n httpbin -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Istio
Gatewayリソースを定義するhttpbin-gw.yamlという名前の YAML ファイルを作成します。このリソースは、ホストhttpbin.example.comのポート 80 (HTTP) を公開するようにゲートウェイプロキシーを設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f httpbin-gw.yaml
$ oc apply -f httpbin-gw.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow VirtualService用にhttpbin-vs.yamlという名前の YAML ファイルを作成します。VirtualServiceは、ゲートウェイプロキシーからhttpbinサービスにトラフィックをルーティングするルールを定義します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
VirtualServiceのルーティングルールが適用されるhostsを指定します。指定されたhostsは、VirtualService がバインドされている IstioGatewayリソースによって公開される必要があります。- 2
Gateway名をゲートウェイのリストに追加して、前の手順で作成した IstioGatewayリソースにVirtualServiceをバインドします。- 3
httpbinServiceのhostとportを含むdestinationを定義して、一致するトラフィックを以前デプロイしたhttpbinサービスにルーティングします。
以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f httpbin-vs.yaml
$ oc apply -f httpbin-vs.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 検証のために、次のコマンドを実行して
curlクライアントの namespace を作成します。oc create namespace curl
$ oc create namespace curlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して
curlクライアントをデプロイします。oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yaml
$ oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
curlPod の名前でCURL_POD変数を設定します。CURL_POD=$(oc get pods -n curl -l app=curl -o jsonpath='{.items[*].metadata.name}')$ CURL_POD=$(oc get pods -n curl -l app=curl -o jsonpath='{.items[*].metadata.name}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow curlクライアントを使用して、Ingress ゲートウェイServiceリソースを介してhttpbinアプリケーションの/headersエンドポイントにリクエストを送信します。IstioGatewayおよびVirtualServiceリソースが指定するホストと一致するように、リクエストのHostヘッダーをhttpbin.example.comに設定します。リクエストを送信するには、次のcurlコマンドを実行します。oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>.<gateway_namespace>.svc.cluster.local/headers$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>.<gateway_namespace>.svc.cluster.local/headersCopy to Clipboard Copied! Toggle word wrap Toggle overflow 応答には、リクエストが成功したことを示す
200 OK HTTPステータスが含まれます。出力例
HTTP/1.1 200 OK server: istio-envoy ...
HTTP/1.1 200 OK server: istio-envoy ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
httpbinVirtualServiceに対応する URI プレフィックスの一致が定義されていないエンドポイントに curl リクエストを送信します。oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>.<gateway_namespace>.svc.cluster.local/get$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>.<gateway_namespace>.svc.cluster.local/getCopy to Clipboard Copied! Toggle word wrap Toggle overflow 応答では
404 Not Foundステータスが返されます。/getエンドポイントには、httpbinVirtualServiceリソース内に一致する URI 接頭辞がないため、これは予想された結果です。出力例
HTTP/1.1 404 Not Found server: istio-envoy ...
HTTP/1.1 404 Not Found server: istio-envoy ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServiceタイプをLoadBalancerに設定して、ゲートウェイプロキシーをクラスター外部のトラフィックに公開します。oc patch service <gateway_name> -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'$ oc patch service <gateway_name> -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記OpenShift Routes を使用して、ゲートウェイをクラスター外部のトラフィックに公開することもできます。詳細は、「OpenShift Routes を使用してゲートウェイをクラスター外のトラフィックに公開する」を参照してください。
ゲートウェイ
Serviceリソースの外部ホスト名または IP アドレスを使用する場合は、クラスターの外部からhttpbinサービスにアクセスできることを確認します。クラスターが実行されている環境に合わせて、INGRESS_HOST変数を適切に設定してください。クラスターが AWS 上で実行されている場合は、次のコマンドを実行して
INGRESS_HOST変数を設定します。INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')$ INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow クラスターが GCP または Azure 上で実行されている場合は、次のコマンドを実行して
INGRESS_HOST変数を設定します。INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].ip}')$ INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].ip}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行し、ゲートウェイのホストを使用して
httpbinサービスにcurlリクエストを送信します。curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST/headers
$ curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST/headersCopy to Clipboard Copied! Toggle word wrap Toggle overflow
-
応答に
HTTP/1.1 200 OKステータスがあることを確認します。これは、リクエストが成功したことを示します。