2.2. Istio Gateway と VirtualService リソースを使用してサービスを公開する
Istio Gateway および VirtualService リソースを使用して、ゲートウェイインジェクションを使用してデプロイされたゲートウェイを設定できます。リソースは、メッシュ内のサービスをメッシュ外のトラフィックに公開します。ゲートウェイ Service タイプを LoadBalancer に設定して、クラスター外部からのトラフィックを許可できます。
前提条件
- ゲートウェイインジェクションを使用して Istio ゲートウェイがインストールされている。
-
Istio
GatewayおよびVirtualServiceリソースを使用している。 -
既存の
VirtualService設定があり、アンビエントモードに移行する予定がない。
手順
次のコマンドを実行して、
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ステータスがあることを確認します。これは、リクエストが成功したことを示します。