2.6. アンビエントモードで Kubernetes Gateway API を使用してサービスを公開する
Kubernetes Gateway API を使用して、Gateway および HTTPRoute リソースを作成し、アンビエントモードでゲートウェイをデプロイできます。リソースは、メッシュ内のサービスをメッシュ外のトラフィックに公開するようにゲートウェイを設定します。
前提条件
-
cluster-adminロールを持つユーザーとして OpenShift Container Platform Web コンソールにログインしている。 - Red Hat OpenShift Service Mesh Operator がインストールされている。
-
Istioリソースをデプロイした。 - Kubernetes ネイティブの Gateway API リソースを使用します。
- Istio アンビエントモードを使用しているか、アンビエントモードに移行する予定です。
アンビエントモード (istio.io/dataplane-mode=ambient) を使用する場合、Istio Gateway および VirtualService リソースはアンビエントモードと完全に互換性がないため、Ingress 設定には Kubernetes Gateway API を使用することを推奨します。
手順
次のコマンドを実行して、
httpbinという namespace を作成します。oc create namespace httpbin
$ oc create namespace httpbinCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、アンビエントモードのラベルを適用します。
oc label namespace httpbin istio.io/dataplane-mode=ambient
$ oc label namespace httpbin istio.io/dataplane-mode=ambientCopy 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 次の例のように、
httpbin-waypoint.yamlという名前の YAML ファイルを作成して、waypoint プロキシーをデプロイします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f httpbin-waypoint.yaml
$ oc apply -f httpbin-waypoint.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
httpbinサービスで Ingress waypoint ルーティングを有効にします。oc label service httpbin -n httpbin istio.io/ingress-use-waypoint=true
$ oc label service httpbin -n httpbin istio.io/ingress-use-waypoint=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow このラベルにより、Ingress ゲートウェイからのトラフィックが waypoint プロキシーを経由してルーティングされ、waypoint プロキシーで設定された Layer 7 (L7) ポリシーが、
httpbinサービスに到達する前に Ingress トラフィックに適用されます。次のコマンドを実行して、namespace 内のすべてのサービスが waypoint を経由してルーティングされるように、namepsace に waypoint ラベルを適用します。
oc label ns httpbin istio.io/use-waypoint=httpbin-waypoint
$ oc label ns httpbin istio.io/use-waypoint=httpbin-waypointCopy 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 "httpbin.example.com"- 関連付けられたポート上のメッシュサービスへのアクセスを試みる際に、クライアントが使用する仮想ホスト名を指定します。
以下のコマンドを実行して、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 waypoint プロキシーの
HTTPRouteリソースを定義するhttpbin-waypoint-hr.yamlという名前の YAML ファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
spec.parentRefsは、HTTPRouteリソースをhttpbinサービスにバインドします。サービスのistio.io/ingress-use-waypoint=trueラベルと組み合わせると、HTTPRouteは L7 ルーティングルールを設定します。これにより、ポイントプロキシーが、そのサービス宛てのトラフィックに対して強制的に適用されます。 -
spec.rules.backendRefsは、httpbinサービスの名前とポートを含むbackendRefsを定義して、一致するトラフィックをhttpbinサービスにルーティングします。
-
以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f httpbin-waypoint-hr.yaml
$ oc apply -f httpbin-waypoint-hr.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記この使用例では、
istio.io/ingress-use-waypoint=trueラベルがあるため、Ingress ゲートウェイからのトラフィックは waypoint プロキシーを通過します。次に、HTTPRouteリソースは、トラフィックが httpbin サービスに到達する前に、パスベースのルーティングポリシーを適用します。次のコマンドを実行して、waypoint プロキシーの準備ができていることを確認します。
oc wait --for=condition=programmed gtw httpbin-waypoint -n httpbin
$ oc wait --for=condition=programmed gtw httpbin-waypoint -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 次のコマンドを実行して、アンビエントモードのラベルを
curlnamespace に適用します。oc label namespace curl istio.io/dataplane-mode=ambient
$ oc label namespace curl istio.io/dataplane-mode=ambientCopy 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 \ httpbin-gateway-istio.httpbin.svc.cluster.local/headers$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ httpbin-gateway-istio.httpbin.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 \ httpbin-gateway-istio.httpbin.svc.cluster.local/get$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ httpbin-gateway-istio.httpbin.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 httpbin-gateway-istio -n httpbin -p '{"spec": {"type": "LoadBalancer"}}'$ oc patch service httpbin-gateway-istio -n httpbin -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 httpbin-gateway -n httpbin -o jsonpath='{.status.addresses[0].value}')$ export INGRESS_HOST=$(oc get gtw httpbin-gateway -n httpbin -o jsonpath='{.status.addresses[0].value}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
INGRESS_PORT変数を設定します。INGRESS_PORT=$(oc get gtw httpbin-gateway -n httpbin -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')$ INGRESS_PORT=$(oc get gtw httpbin-gateway -n httpbin -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ステータスがあることを確認します。これは、リクエストが成功したことを示します。