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 を使用することを推奨します。

手順

  1. 次のコマンドを実行して、httpbin という namespace を作成します。

    $ oc create namespace httpbin
    Copy to Clipboard Toggle word wrap
  2. 次のコマンドを実行して、アンビエントモードのラベルを適用します。

    $ oc label namespace httpbin istio.io/dataplane-mode=ambient
    Copy to Clipboard Toggle word wrap
  3. 次のコマンドを実行して、httpbin という名前のサンプルサービスをデプロイします。

    $ oc apply -n httpbin -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yaml
    Copy to Clipboard Toggle word wrap
  4. 次の例のように、httpbin-waypoint.yaml という名前の YAML ファイルを作成して、waypoint プロキシーをデプロイします。

    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: httpbin-waypoint
      namespace: httpbin
      labels:
        istio.io/waypoint-for: service
    spec:
      gatewayClassName: istio-waypoint
      listeners:
      - name: mesh
        port: 15008
        protocol: HBONE
    Copy to Clipboard Toggle word wrap
  5. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f httpbin-waypoint.yaml
    Copy to Clipboard Toggle word wrap
  6. 次のコマンドを実行して、httpbin サービスで Ingress waypoint ルーティングを有効にします。

    $ oc label service httpbin -n httpbin istio.io/ingress-use-waypoint=true
    Copy to Clipboard Toggle word wrap

    このラベルにより、Ingress ゲートウェイからのトラフィックが waypoint プロキシーを経由してルーティングされ、waypoint プロキシーで設定された Layer 7 (L7) ポリシーが、httpbin サービスに到達する前に Ingress トラフィックに適用されます。

  7. 次のコマンドを実行して、namespace 内のすべてのサービスが waypoint を経由してルーティングされるように、namepsace に waypoint ラベルを適用します。

    $ oc label ns httpbin istio.io/use-waypoint=httpbin-waypoint
    Copy to Clipboard Toggle word wrap
  8. Kubernetes 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"
        port: 80
        protocol: HTTP
        allowedRoutes:
          namespaces:
            from: All
    Copy to Clipboard Toggle word wrap
    "httpbin.example.com"
    関連付けられたポート上のメッシュサービスへのアクセスを試みる際に、クライアントが使用する仮想ホスト名を指定します。
  9. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f httpbin-gw.yaml
    Copy to Clipboard Toggle word wrap
  10. 次の例のように、Ingress ゲートウェイの HTTPRoute リソースを定義する httpbin-ingress-hr.yaml という名前の YAML ファイルを作成します。

    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: httpbin-ingress
      namespace: httpbin
    spec:
      parentRefs:
      - name: httpbin-gateway
        namespace: httpbin
      hostnames:
      - "httpbin.example.com"
      rules:
      - backendRefs:
        - name: httpbin
          port: 8000
    Copy to Clipboard Toggle word wrap
    • spec.parentRefsHTTPROUTE リソースを、前の手順で作成された Kubernetes Gateway リソースにバインドします。
    • spec.rules.backendRefs は、httpbin サービスの名前とポートを含む backendRefs を定義して、一致するトラフィックを httpbin サービスにルーティングします。

    HTTPRoute リソースは、ゲートウェイプロキシーから httpbin サービスにトラフィックをルーティングするルールを指定します。

  11. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f httpbin-ingress-hr.yaml
    Copy to Clipboard Toggle word wrap
  12. waypoint プロキシーの HTTPRoute リソースを定義する httpbin-waypoint-hr.yaml という名前の YAML ファイルを作成します。

    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: httpbin-waypoint-route
      namespace: httpbin
    spec:
      parentRefs:
      - group: ""
        kind: service
        name: httpbin
        namespace: httpbin
      rules:
      - matches:
        - path:
            type: PathPrefix
            value: /status
        - path:
            type: PathPrefix
            value: /headers
        backendRefs:
        - name: httpbin
          port: 8000
    Copy to Clipboard Toggle word wrap
    • spec.parentRefs は、HTTPRoute リソースを httpbin サービスにバインドします。サービスの istio.io/ingress-use-waypoint=true ラベルと組み合わせると、HTTPRoute は L7 ルーティングルールを設定します。これにより、ポイントプロキシーが、そのサービス宛てのトラフィックに対して強制的に適用されます。
    • spec.rules.backendRefs は、httpbin サービスの名前とポートを含む backendRefs を定義して、一致するトラフィックを httpbin サービスにルーティングします。
  13. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f httpbin-waypoint-hr.yaml
    Copy to Clipboard Toggle word wrap
    注記

    この使用例では、istio.io/ingress-use-waypoint=true ラベルがあるため、Ingress ゲートウェイからのトラフィックは waypoint プロキシーを通過します。次に、HTTPRoute リソースは、トラフィックが httpbin サービスに到達する前に、パスベースのルーティングポリシーを適用します。

  14. 次のコマンドを実行して、waypoint プロキシーの準備ができていることを確認します。

    $ oc wait --for=condition=programmed gtw httpbin-waypoint -n httpbin
    Copy to Clipboard Toggle word wrap

検証

  1. 次のコマンドを実行して、curl クライアントの namespace を作成します。

    $ oc create namespace curl
    Copy to Clipboard Toggle word wrap
  2. 次のコマンドを実行して、curl クライアントをデプロイします。

    $ oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yaml
    Copy to Clipboard Toggle word wrap
  3. 次のコマンドを実行して、アンビエントモードのラベルを curl namespace に適用します。

    $ oc label namespace curl istio.io/dataplane-mode=ambient
    Copy to Clipboard Toggle word wrap
  4. 次のコマンドを実行して、curl Pod の名前で CURL_POD 変数を設定します。

    $ CURL_POD=$(oc get pods -n curl -l app=curl -o jsonpath='{.items[*].metadata.name}')
    Copy to Clipboard Toggle word wrap
  5. 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
    Copy to Clipboard Toggle word wrap

    応答では、次の例のように、リクエストが成功したことを示す 200 OK HTTP ステータスが返されます。

    HTTP/1.1 200 OK
    server: istio-envoy
    ...
    Copy to Clipboard Toggle word wrap
  6. 次のコマンドを実行して、httpbin HTTPROUTE で定義されている 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
    Copy to Clipboard Toggle word wrap

    /get エンドポイントには httpbin HTTPROUTE リソース内に一致する URI 接頭辞がないため、次の例のように、応答は予想どおり 404 Not Found ステータスを返します。

    HTTP/1.1 404 Not Found
    server: istio-envoy
    ...
    Copy to Clipboard Toggle word wrap
  7. Service タイプを LoadBalancer に設定して、ゲートウェイプロキシーをクラスター外部のトラフィックに公開します。以下のコマンドを実行します。

    $ oc patch service httpbin-gateway-istio -n httpbin -p '{"spec": {"type": "LoadBalancer"}}'
    Copy to Clipboard Toggle word wrap
    注記

    OpenShift Routes を使用して、ゲートウェイをクラスター外部のトラフィックに公開することもできます。詳細は、「OpenShift Routes を使用してゲートウェイをクラスター外のトラフィックに公開する」を参照してください。

  8. ゲートウェイ Service リソースの外部ホスト名または IP アドレスを使用する場合は、クラスターの外部から httpbin サービスにアクセスできることを確認します。クラスターが実行されている環境に合わせて、INGRESS_HOST 変数を適切に設定してください。

    1. 次のコマンドを実行して、INGRESS_HOST 変数を設定します。

      $ export INGRESS_HOST=$(oc get gtw httpbin-gateway -n httpbin -o jsonpath='{.status.addresses[0].value}')
      Copy to Clipboard Toggle word wrap
    2. 次のコマンドを実行して、INGRESS_PORT 変数を設定します。

      $ INGRESS_PORT=$(oc get gtw httpbin-gateway -n httpbin -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')
      Copy to Clipboard Toggle word wrap
    3. ゲートウェイホストを使用して、次のコマンドを実行し、httpbin サービスに curl リクエストを送信します。

      $ curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST:$INGRESS_PORT/headers
      Copy to Clipboard Toggle word wrap
  9. 応答に HTTP/1.1 200 OK ステータスがあることを確認します。これは、リクエストが成功したことを示します。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat