2.4. サイドカーモードで Kubernetes Gateway API を使用してサービスを公開する
Kubernetes Gateway API を使用して、Gateway および HTTPRoute リソースを作成し、ゲートウェイをデプロイできます。リソースは、メッシュ内のサービスをメッシュ外のトラフィックに公開するようにゲートウェイを設定します。
前提条件
-
cluster-adminロールを持つユーザーとして OpenShift Container Platform Web コンソールにログインしている。 - Red Hat OpenShift Service Mesh Operator がインストールされている。
-
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アップグレードストラテジーの場合は、次のコマンドを実行します。oc label namespace httpbin istio.io/rev=<revision-name>
$ oc label namespace httpbin istio.io/rev=<revision-name>Copy 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 次の例のように、Kubernetes Gateway リソースを定義する
httpbin-gw.yamlという名前の YAML ファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow "httpbin.example.com"- 関連付けられたポート上のメッシュサービスへのアクセスを試みる際に、クライアントが使用する仮想ホスト名を指定します。
HTTPRouteリソースは、ゲートウェイプロキシーからhttpbinサービスにトラフィックをルーティングするルールを指定します。以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f httpbin-gw.yaml
$ oc apply -f httpbin-gw.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次の例のように、Ingress ゲートウェイの
HTTPRouteリソースを定義するhttpbin-ingress-hr.yamlという名前の YAML ファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
spec.parentRefsはHTTPROUTEリソースを、前の手順で作成された Kubernetes Gateway リソースにバインドします。 -
spec.rules.backendRefsは、httpbinサービスの名前とポートを含むbackendRefsを定義して、一致するトラフィックをhttpbinサービスにルーティングします。
HTTPRouteリソースは、ゲートウェイプロキシーからhttpbinサービスにトラフィックをルーティングするルールを指定します。-
以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f httpbin-ingress-hr.yaml
$ oc apply -f httpbin-ingress-hr.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Gateway API サービスが準備完了状態で、サービスにアドレスが割り当てられていることを確認します。
oc wait --for=condition=programmed gtw httpbin-gateway -n httpbin
$ oc wait --for=condition=programmed gtw httpbin-gateway -n httpbinCopy 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エンドポイントにリクエストを送信します。Kubernetes Gateway およびHTTPROUTEリソースが指定するホストと一致するように、リクエストの Host ヘッダーをhttpbin.example.comに設定します。次のコマンドを実行して、curlリクエストを送信します。oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>-istio.<gateway_namespace>.svc.cluster.local/headers$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>-istio.<gateway_namespace>.svc.cluster.local/headersCopy to Clipboard Copied! Toggle word wrap Toggle overflow 応答では、次の例のように、リクエストが成功したことを示す
200 OKHTTP ステータスが返されます。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 次のコマンドを実行して、
httpbinHTTPROUTEで定義されている Uniform Resource Identifier (URI) 接頭辞の一致がないエンドポイントにcurlリクエストを送信します。oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>-istio.<gateway_namespace>.svc.cluster.local/get$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>-istio.<gateway_namespace>.svc.cluster.local/getCopy to Clipboard Copied! Toggle word wrap Toggle overflow /getエンドポイントにはhttpbinHTTPROUTEリソース内に一致する URI 接頭辞がないため、次の例のように、応答は予想どおり404 Not Foundステータスを返します。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>-istio -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'$ oc patch service <gateway_name>-istio -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変数を適切に設定してください。次のコマンドを実行して、
INGRESS_HOST変数を設定します。export INGRESS_HOST=$(oc get gtw <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.addresses[0].value}')$ export INGRESS_HOST=$(oc get gtw <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.addresses[0].value}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
INGRESS_PORT変数を設定します。INGRESS_PORT=$(oc get gtw <gateway_name> -n <gateway_namespace> -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')$ INGRESS_PORT=$(oc get gtw <gateway_name> -n <gateway_namespace> -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow ゲートウェイホストを使用して、次のコマンドを実行し、
httpbinサービスにcurlリクエストを送信します。curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST:$INGRESS_PORT/headers
$ curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST:$INGRESS_PORT/headersCopy to Clipboard Copied! Toggle word wrap Toggle overflow
-
応答に
HTTP/1.1 200 OKステータスがあることを確認します。これは、リクエストが成功したことを示します。