2.3. Kubernetes Gateway API を使用してサービスを公開する
Kubernetes Gateway API を使用して、Gateway
および HTTPRoute
リソースを作成し、ゲートウェイをデプロイします。リソースは、メッシュ内のサービスをメッシュ外のトラフィックに公開するようにゲートウェイを設定します。次に、ゲートウェイの Service
を LoadBalancer
に設定して、ゲートウェイをクラスター外部のトラフィックに公開できます。
前提条件
-
cluster-admin
ロールを持つユーザーとして OpenShift Container Platform Web コンソールにログインしている。 - Red Hat OpenShift Service Mesh Operator がインストールされている。
- Istio リソースがインストールされている。
手順
次のコマンドを実行して、
httpbin
という namespace を作成します。oc create namespace httpbin
$ oc create namespace httpbin
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.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Kubernetes Gateway リソースを定義する
httpbin-gw.yaml
という名前の YAML ファイルを作成します。このリソースは、ホストhttpbin.example.com
のポート 80 (HTTP) を公開するようにゲートウェイプロキシーを設定します。ゲートウェイリソースファイルの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 関連付けられたポート上のメッシュサービスへのアクセスを試みる際に、クライアントが使用する仮想ホスト名を指定します。
以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f httpbin-gw.yaml
$ oc apply -f httpbin-gw.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow HTTPRoute
リソースを定義するhttpbin-hr.yaml
という名前の YAML ファイルを作成します。HTTPRoute
リソースは、ゲートウェイプロキシーからhttpbin
サービスにトラフィックをルーティングするルールを指定します。HTTPRoute ファイルの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f httpbin-hr.yaml
$ oc apply -f httpbin-hr.yaml
Copy 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 httpbin
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを実行して、
curl
クライアントの namespace を作成します。oc create namespace curl
$ oc create namespace curl
Copy 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.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
curl
Pod の名前で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/headers
Copy 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 次のコマンドを実行して、
httpbin
HTTPROUTE
で定義されている 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/get
Copy to Clipboard Copied! Toggle word wrap Toggle overflow レスポンスは
404 Not Found
ステータスを返します。これは、/get
エンドポイントのhttpbin
HTTPROUTE
リソース内に一致する 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>-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/headers
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
応答に
HTTP/1.1 200 OK
ステータスがあることを確認します。これは、リクエストが成功したことを示します。