2.3. Kubernetes Gateway API を使用してサービスを公開する


Kubernetes Gateway API を使用して、Gateway および HTTPRoute リソースを作成し、ゲートウェイをデプロイします。リソースは、メッシュ内のサービスをメッシュ外のトラフィックに公開するようにゲートウェイを設定します。次に、ゲートウェイの ServiceLoadBalancer に設定して、ゲートウェイをクラスター外部のトラフィックに公開できます。

前提条件

  • cluster-admin ロールを持つユーザーとして OpenShift Container Platform Web コンソールにログインしている。
  • Red Hat OpenShift Service Mesh Operator がインストールされている。
  • Istio リソースがインストールされている。

手順

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

    $ oc create namespace httpbin
    Copy to Clipboard Toggle word wrap
  2. 次のコマンドを実行して、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
  3. 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" 
    1
    
        port: 80
        protocol: HTTP
        allowedRoutes:
          namespaces:
            from: All
    Copy to Clipboard Toggle word wrap

    1
    関連付けられたポート上のメッシュサービスへのアクセスを試みる際に、クライアントが使用する仮想ホスト名を指定します。
  4. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f httpbin-gw.yaml
    Copy to Clipboard Toggle word wrap
  5. HTTPRoute リソースを定義する 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
    Copy to Clipboard Toggle word wrap

    1
    ゲートウェイリソースの名前をゲートウェイのリストに追加することで、HTTPROUTE リソースを前のステップで作成した Kubernetes Gateway リソースにバインドします。
    2
    httpbin サービスの名前とポートが含まれる backendRefs を定義して、一致するトラフィックを httpbin サービスにルーティングします。
  6. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f httpbin-hr.yaml
    Copy to Clipboard Toggle word wrap
  7. 次のコマンドを実行して、Gateway API サービスが準備完了状態で、サービスにアドレスが割り当てられていることを確認します。

    $ oc wait --for=condition=programmed gtw httpbin-gateway -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 Pod の名前で CURL_POD 変数を設定します。

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

    レスポンスでは、要求が成功したことを示す 200 OK HTTP ステータスが返されます。

    出力例

    HTTP/1.1 200 OK
    server: istio-envoy
    ...
    Copy to Clipboard Toggle word wrap

  5. 次のコマンドを実行して、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
    Copy to Clipboard Toggle word wrap

    レスポンスは 404 Not Found ステータスを返します。これは、/get エンドポイントの httpbin HTTPROUTE リソース内に一致する URI 接頭辞がないため、予想される動作です。

    出力例

    HTTP/1.1 404 Not Found
    server: istio-envoy
    ...
    Copy to Clipboard Toggle word wrap

  6. Service タイプを LoadBalancer に設定して、ゲートウェイプロキシーをクラスター外部のトラフィックに公開します。以下のコマンドを実行します。

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

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

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

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

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

      $ INGRESS_PORT=$(oc get gtw <gateway_name> -n <gateway_namespace> -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
  8. 応答に HTTP/1.1 200 OK ステータスがあることを確認します。これは、リクエストが成功したことを示します。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2025 Red Hat