2.2. Istio Gateway と VirtualService リソースを使用してサービスを公開する


Istio Gateway および VirtualService リソースを使用して、ゲートウェイインジェクションを使用してデプロイされたゲートウェイを設定できます。リソースは、メッシュ内のサービスをメッシュ外のトラフィックに公開します。ゲートウェイ Service タイプを LoadBalancer に設定して、クラスター外部からのトラフィックを許可できます。

前提条件

  • ゲートウェイインジェクションを使用して Istio ゲートウェイがインストールされている。
  • Istio Gateway および VirtualService リソースを使用している。
  • 既存の VirtualService 設定があり、アンビエントモードに移行する予定がない。

手順

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

    $ oc create namespace httpbin
    Copy to Clipboard Toggle word wrap
  2. namespace でサイドカーインジェクションを有効にします。InPlace アップグレードストラテジーを使用している場合は、次のコマンドを実行します。

    $ oc label namespace httpbin istio-injection=enabled
    Copy to Clipboard Toggle word wrap
    注記

    RevisionBased アップグレードストラテジーを使用している場合は、次のコマンドを実行します。

    1. <revision-name> を見つけるには、次のコマンドを実行します。

      $ oc get istiorevisions.sailoperator.io
      Copy to Clipboard Toggle word wrap

      次の例のような出力が得られます。

    NAME      TYPE    READY   STATUS    IN USE   VERSION   AGE
    default   Local   True    Healthy   True    v1.24.3   3m33s
    Copy to Clipboard Toggle word wrap
    1. サイドカーインジェクションを有効にするには、namespace にリビジョン名でラベルを付けます。

      $ oc label namespace httpbin istio.io/rev=default
      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. Istio Gateway リソースを定義する httpbin-gw.yaml という名前の YAML ファイルを作成します。このリソースは、ホスト httpbin.example.com のポート 80 (HTTP) を公開するようにゲートウェイプロキシーを設定します。

    apiVersion: networking.istio.io/v1
    kind: Gateway
    metadata:
      name: httpbin-gateway
      namespace: httpbin
    spec:
      selector:
        istio: <gateway_name> 
    1
    
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - httpbin.example.com 
    2
    Copy to Clipboard Toggle word wrap
    1
    selector を、ゲートウェイプロキシー Deployment の Pod テンプレートで指定された一意のラベルまたはラベルセットに設定します。デフォルトでは、Istio Gateway リソース設定は、すべての namespace 内の一致するゲートウェイ Pod に適用されます。
    2
    hosts フィールドを使用して、関連付けられたポートでメッシュサービスにアクセスしようとする際にクライアントが使用できるアドレスのリストを指定します。
  5. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f httpbin-gw.yaml
    Copy to Clipboard Toggle word wrap
  6. VirtualService 用に httpbin-vs.yaml という名前の YAML ファイルを作成します。VirtualService は、ゲートウェイプロキシーから httpbin サービスにトラフィックをルーティングするルールを定義します。

    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
      name: httpbin
      namespace: httpbin
    spec:
      hosts:
      - httpbin.example.com 
    1
    
      gateways:
      - httpbin-gateway 
    2
    
      http:
      - match:
        - uri:
            prefix: /status
        - uri:
            prefix: /headers
        route:
        - destination: 
    3
    
            port:
              number: 8000
            host: httpbin
    Copy to Clipboard Toggle word wrap
    1
    VirtualService のルーティングルールが適用される hosts を指定します。指定された hosts は、VirtualService がバインドされている Istio Gateway リソースによって公開される必要があります。
    2
    Gateway 名をゲートウェイのリストに追加して、前の手順で作成した Istio Gateway リソースに VirtualService をバインドします。
    3
    httpbin Servicehostport を含む destination を定義して、一致するトラフィックを以前デプロイした httpbin サービスにルーティングします。
  7. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f httpbin-vs.yaml
    Copy to Clipboard Toggle word wrap
  8. 検証のために、次のコマンドを実行して curl クライアントの namespace を作成します。

    $ oc create namespace curl
    Copy to Clipboard Toggle word wrap
  9. 次のコマンドを実行して 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
  10. 次のコマンドを実行して、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
  11. curl クライアントを使用して、Ingress ゲートウェイ Service リソースを介して httpbin アプリケーションの /headers エンドポイントにリクエストを送信します。Istio Gateway および VirtualService リソースが指定するホストと一致するように、リクエストの Host ヘッダーを httpbin.example.com に設定します。リクエストを送信するには、次の curl コマンドを実行します。

    $ oc exec $CURL_POD -n curl -- \
      curl -s -I \
        -H Host:httpbin.example.com \
        <gateway_name>.<gateway_namespace>.svc.cluster.local/headers
    Copy to Clipboard Toggle word wrap
  12. 応答には、リクエストが成功したことを示す 200 OK HTTP ステータスが含まれます。

    HTTP/1.1 200 OK
    server: istio-envoy
    ...
    Copy to Clipboard Toggle word wrap
  13. 次のコマンドを実行して、httpbin VirtualService に対応する URI プレフィックスの一致が定義されていないエンドポイントに curl リクエストを送信します。

    $ oc exec $CURL_POD -n curl -- \
      curl -s -I \
        -H Host:httpbin.example.com \
        <gateway_name>.<gateway_namespace>.svc.cluster.local/get
    Copy to Clipboard Toggle word wrap

    応答では 404 Not Found ステータスが返されます。/get エンドポイントには、httpbin VirtualService リソース内に一致する URI 接頭辞がないため、これは予想された結果です。

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

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

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

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

    1. クラスターが AWS 上で実行されている場合は、次のコマンドを実行して INGRESS_HOST 変数を設定します。

      $ INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
      Copy to Clipboard Toggle word wrap
    2. クラスターが GCP または Azure 上で実行されている場合は、次のコマンドを実行して INGRESS_HOST 変数を設定します。

      $ INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
      Copy to Clipboard Toggle word wrap
    3. 次のコマンドを実行し、ゲートウェイのホストを使用して httpbin サービスに curl リクエストを送信します。

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

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2026 Red Hat