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次のコマンドを実行して、
httpbinという名前のサンプルサービスをデプロイします。$ oc apply -n httpbin -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yamlKubernetes Gateway リソースを定義する
httpbin-gw.yamlという名前の YAML ファイルを作成します。このリソースは、ホストhttpbin.example.comのポート 80 (HTTP) を公開するようにゲートウェイプロキシーを設定します。ゲートウェイリソースファイルの例
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: httpbin-gateway namespace: httpbin spec: gatewayClassName: istio listeners: - name: default hostname: "httpbin.example.com"1 port: 80 protocol: HTTP allowedRoutes: namespaces: from: All- 1
- 関連付けられたポート上のメッシュサービスへのアクセスを試みる際に、クライアントが使用する仮想ホスト名を指定します。
以下のコマンドを実行して、YAML ファイルを適用します。
$ oc apply -f httpbin-gw.yamlHTTPRouteリソースを定義するhttpbin-hr.yamlという名前の YAML ファイルを作成します。HTTPRouteリソースは、ゲートウェイプロキシーからhttpbinサービスにトラフィックをルーティングするルールを指定します。HTTPRoute ファイルの例
apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: httpbin namespace: httpbin spec: parentRefs:1 - name: httpbin-gateway namespace: httpbin rules: - matches: - path: type: PathPrefix value: /status - path: type: PathPrefix value: /headers backendRefs:2 - name: httpbin port: 8000以下のコマンドを実行して、YAML ファイルを適用します。
$ oc apply -f httpbin-hr.yaml次のコマンドを実行して、Gateway API サービスが準備完了状態で、サービスにアドレスが割り当てられていることを確認します。
$ oc wait --for=condition=programmed gtw httpbin-gateway -n httpbin
検証
次のコマンドを実行して、
curlクライアントの namespace を作成します。$ oc create namespace curl次のコマンドを実行して、
curlクライアントをデプロイします。$ oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yaml次のコマンドを実行して、
curlPod の名前でCURL_POD変数を設定します。$ CURL_POD=$(oc get pods -n curl -l app=curl -o jsonpath='{.items[*].metadata.name}')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レスポンスでは、要求が成功したことを示す
200 OKHTTP ステータスが返されます。出力例
HTTP/1.1 200 OK server: istio-envoy ...次のコマンドを実行して、
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レスポンスは
404 Not Foundステータスを返します。これは、/getエンドポイントのhttpbinHTTPROUTEリソース内に一致する URI 接頭辞がないため、予想される動作です。出力例
HTTP/1.1 404 Not Found server: istio-envoy ...ServiceタイプをLoadBalancerに設定して、ゲートウェイプロキシーをクラスター外部のトラフィックに公開します。以下のコマンドを実行します。$ oc patch service <gateway_name>-istio -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'注記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}')次のコマンドを実行して、
INGRESS_PORT変数を設定します。$ INGRESS_PORT=$(oc get gtw <gateway_name> -n <gateway_namespace> -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')ゲートウェイホストを使用して、次のコマンドを実行し、
httpbinサービスにcurlリクエストを送信します。$ curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST:$INGRESS_PORT/headers
-
応答に
HTTP/1.1 200 OKステータスがあることを確認します。これは、リクエストが成功したことを示します。