ゲートウェイ


Red Hat OpenShift Service Mesh 3.0

ゲートウェイと OpenShift Service Mesh

Red Hat OpenShift Documentation Team

概要

このドキュメントでは、OpenShift Service Mesh でゲートウェイを使用する方法を説明します。

第1章 ゲートウェイについて

ゲートウェイは、スタンドアロンの Envoy プロキシーデプロイメントと、サービスメッシュのエッジで動作する関連する Kubernetes サービスです。ゲートウェイを設定すると、メッシュに出入りするトラフィックをきめ細かく制御できます。Red Hat OpenShift Service Mesh では、ゲートウェイインジェクションを使用してゲートウェイをインストールします。

1.1. ゲートウェイインジェクションについて

ゲートウェイインジェクションは、サイドカーインジェクションと同じメカニズムを利用して、Envoy プロキシーをゲートウェイ Pod に注入します。ゲートウェイインジェクションを使用してゲートウェイをインストールするには、Istio コントロールプレーンに表示される namespace に Kubernetes Deployment オブジェクトと関連する Kubernetes Service オブジェクトを作成します。Deployment オブジェクトを作成するときに、Istio コントロールプレーンがプロキシーを注入し、プロキシーがゲートウェイとして設定されるように、オブジェクトにラベルおよびアノテーションを付けます。ゲートウェイをインストールしたら、Istio GatewayVirtualService リソースを使用して、Ingress と Egress トラフィックを制御するようにゲートウェイを設定します。

1.1.1. ゲートウェイインジェクションを使用したゲートウェイのインストール

この手順では、ゲートウェイインジェクションを使用してゲートウェイをインストールする方法を説明します。

注記

この手順を使用して、Ingress または Egress ゲートウェイを作成できます。

前提条件

  • OpenShift Service Mesh Operator バージョン 3.0 以降がインストールされている。
  • Istio コントロールプレーンを作成している。
  • IstioCNI リソースを作成している。

手順

  1. ゲートウェイのインストールに使用する namespace を作成します。

    $ oc create namespace <gateway_namespace>
    Copy to Clipboard Toggle word wrap
    注記

    ゲートウェイと Istio コントロールプレーンを異なる namespace にインストールします。

    ゲートウェイを専用のゲートウェイ namespace にインストールできます。このアプローチにより、異なる namespace で動作する多くのアプリケーションでゲートウェイを共有できるようになります。または、ゲートウェイをアプリケーション namespace にインストールすることもできます。このアプローチでは、ゲートウェイはその namespace 内のアプリケーション専用のゲートウェイとして機能します。

  2. ゲートウェイデプロイメントのサービスアカウント、ロール、およびロールバインディングを定義する secret-reader.yml という名前の YAML ファイルを作成します。これらの設定により、ゲートウェイは TLS 認証情報を取得するために必要なシークレットを読み取ることができます。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: secret-reader
      namespace: <gateway_namespace>
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: secret-reader
      namespace: <gateway_namespace>
    rules:
      - apiGroups: [""]
        resources: ["secrets"]
        verbs: ["get", "watch", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name:  secret-reader
      namespace: <gateway_namespace>
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: secret-reader
    subjects:
      - kind: ServiceAccount
        name:  secret-reader
    Copy to Clipboard Toggle word wrap
  3. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f secret-reader.yml
    Copy to Clipboard Toggle word wrap
  4. ゲートウェイの Kubernetes Deployment オブジェクトを定義する、gateway-deployment.yml という名前の YAML ファイルを作成します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: <gateway_name>
      namespace: <gateway_namespace>
    spec:
      selector:
        matchLabels:
          istio: <gateway_name>
      template:
        metadata:
          annotations:
            inject.istio.io/templates: gateway 
    1
    
          labels:
            istio: <gateway_name> 
    2
    
            sidecar.istio.io/inject: "true" 
    3
    
        spec:
          containers:
            - name: istio-proxy
              image: auto 
    4
    
              securityContext:
                capabilities:
                  drop:
                  - ALL
                allowPrivilegeEscalation: false
                privileged: false
                readOnlyRootFilesystem: true
                runAsNonRoot: true
              ports:
              - containerPort: 15090
                protocol: TCP
                name: http-envoy-prom
              resources:
                limits:
                  cpu: 2000m
                  memory: 1024Mi
                requests:
                  cpu: 100m
                  memory: 128Mi
          securityContext:
            sysctls:
            - name: net.ipv4.ip_unprivileged_port_start
              value: "0"
          serviceAccountName: secret-reader 
    5
    Copy to Clipboard Toggle word wrap
    1
    Istio コントロールプレーンがデフォルトのサイドカーテンプレートではなく、ゲートウェイインジェクションテンプレートを使用することを示します。
    2
    ゲートウェイのデプロイメントに一意のラベルが設定されていることを確認します。Istio Gateway リソースがゲートウェイワークロードを選択できるようにするには、一意のラベルが必要です。
    3
    sidecar.istio.io/inject ラベルを true に設定して、ゲートウェイインジェクションを有効にします。Istio リソースの名前が default でない場合は、代わりに istio.io/rev: <istio_revision> ラベルを使用する必要があります。ここで、リビジョンは Istio リソースのアクティブなリビジョンを表します。
    4
    Pod が起動するたびにイメージが自動的に更新されるように、イメージフィールドを auto に設定します。
    5
    serviceAccountName を、以前作成した ServiceAccount の名前に設定します。
  5. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f gateway-deployment.yml
    Copy to Clipboard Toggle word wrap
  6. 次のコマンドを実行して、ゲートウェイ Deployment ロールアウトが正常に行れたことを確認します。

    $ oc rollout status deployment/<gateway_name> -n <gateway_namespace>
    Copy to Clipboard Toggle word wrap

    以下のような出力が表示されるはずです。

    出力例

    Waiting for deployment "<gateway_name>" rollout to finish: 0 of 1 updated replicas are available...
    deployment "<gateway_name>" successfully rolled out
    Copy to Clipboard Toggle word wrap

  7. ゲートウェイの Kubernetes Service オブジェクトを含む、gateway-service.yml という名前の YAML ファイルを作成します。

    apiVersion: v1
    kind: Service
    metadata:
      name: <gateway_name>
      namespace: <gateway_namespace>
    spec:
      type: ClusterIP 
    1
    
      selector:
        istio: <gateway_name> 
    2
    
      ports:
        - name: status-port
          port: 15021
          protocol: TCP
          targetPort: 15021
        - name: http2
          port: 80
          protocol: TCP
          targetPort: 80
        - name: https
          port: 443
          protocol: TCP
          targetPort: 443
    Copy to Clipboard Toggle word wrap
    1
    spec.typeClusterIP に設定すると、ゲートウェイ Service オブジェクトにはクラスター内からのみアクセスできるようになります。ゲートウェイがクラスター外部からの Ingress トラフィックを処理する必要がある場合は、spec.typeLoadBalancer に設定します。または、OpenShift Routes を使用することもできます。
    2
    selector を、以前作成したゲートウェイデプロイメントの Pod テンプレートで指定された一意のラベルまたはラベルセットに設定します。
  8. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f gateway-service.yml
    Copy to Clipboard Toggle word wrap
  9. 次のコマンドを実行して、ゲートウェイサービスがゲートウェイ Pod のエンドポイントをターゲットにしていることを確認します。

    $ oc get endpoints <gateway_name> -n <gateway_namespace>
    Copy to Clipboard Toggle word wrap

    次の例のような出力が表示されるはずです。

    出力例

    NAME              ENDPOINTS                             AGE
    <gateway_name>    10.131.0.181:8080,10.131.0.181:8443   1m
    Copy to Clipboard Toggle word wrap

  10. オプション: ゲートウェイの Horizontal Pod Autoscaler を定義する、gateway-hpa.yml という名前の YAML ファイルを作成します。次の例では、最小レプリカを 2 に、最大レプリカを 5 に設定し、平均 CPU 使用率が CPU リソース制限の 80% を超えたときにレプリカをスケールアップします。この制限は、ゲートウェイのデプロイメントの Pod テンプレートで指定されます。

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: <gateway_name>
      namespace: <gateway_namespace>
    spec:
      minReplicas: 2
      maxReplicas: 5
      metrics:
      - resource:
          name: cpu
          target:
            averageUtilization: 80
            type: Utilization
        type: Resource
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: <gateway_name> 
    1
    Copy to Clipboard Toggle word wrap
    1
    spec.scaleTargetRef.name を、以前作成したゲートウェイデプロイメントの名前に設定します。
  11. オプション: 次のコマンドを実行して YAML ファイルを適用します。

    $ oc apply -f gateway-hpa.yml
    Copy to Clipboard Toggle word wrap
  12. オプション: ゲートウェイの Pod Disruption Budget を定義する、gateway-pdb.yml という名前の YAML ファイルを作成します。次の例では、ゲートウェイ Pod のエビクション後も、クラスター上に少なくとも 1 つの正常なゲートウェイ Pod が残る場合にのみ、ゲートウェイ Pod のエビクションが許可されます。

    apiVersion: policy/v1
    kind: PodDisruptionBudget
    metadata:
      name: <gateway_name>
      namespace: <gateway_namespace>
    spec:
      minAvailable: 1
      selector:
        matchLabels:
          istio: <gateway_name> 
    1
    Copy to Clipboard Toggle word wrap
    1
    spec.selector.matchLabels を、以前作成したゲートウェイデプロイメントの Pod テンプレートで指定された一意のラベルまたはラベルセットに設定します。
  13. オプション: 次のコマンドを実行して YAML ファイルを適用します。

    $ oc apply -f gateway-pdb.yml
    Copy to Clipboard Toggle word wrap

第2章 トラフィックをメッシュに取り込む

Istio API を使用すると、ゲートウェイインジェクションを使用してインストールされたゲートウェイプロキシーを設定して、メッシュ外部からのトラフィックを受け入れ、そのトラフィックをメッシュ内のサービスにルーティングできます。

LoadBalancer タイプの Service または OpenShift Routes のいずれかを使用して、ゲートウェイプロキシーをクラスター外部のトラフィックに公開できます。

ゲートウェイインジェクションを使用してゲートウェイをインストールすると、Istio GatewayVirtualService リソースを組み合わせて Ingress トラフィックを受信するようにゲートウェイを設定できます。Istio Gateway リソースは、着信または発信の HTTP/TCP 接続を受信するメッシュのエッジで動作するロードバランサーを表します。Gateway 仕様には、公開する必要があるポートのセット、使用するプロトコルのタイプ、およびロードバランサーの Server Name Indication (SNI) 設定が記述されています。VirtualServices は、VirtualServices を使用して内部メッシュトラフィックのルーティングルールを定義するのと同様に、Istio Gateway に適用するルーティングルールを定義します。

次の例では、Istio Gateway リソースは、外部トラフィックのエントリーポイントとして機能するゲートウェイプロキシーを設定します。この設定では、ホスト info.com のポート 443 (HTTPS) が公開されます。この設定例は、istio: ingressgateway ラベルを持つ Pod に適用されます。tls モードは SIMPLE と設定され、例で提供される証明書と秘密鍵を使用して着信 HTTPS トラフィックを終了します。

設定例

apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: info-gateway
  namespace: info
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 443
      name: https-443
      protocol: HTTPS
    hosts:
    - info.com
    tls:
      mode: SIMPLE
      serverCertificate: /etc/certs/servercert.pem
      privateKey: /etc/certs/privatekey.pem
Copy to Clipboard Toggle word wrap

次の VirtualService は、前の設定例に示されている Istio Gateway リソースにバインドされています。この仕様では、/reviews/ パス接頭辞を持つトラフィックを info namespace のレビューサービスにルーティングするためのルールが定義されています。VirtualService は、前に示した Gateway リソースを明示的に参照します。これにより、指定されたゲートウェイを通じて入ってくるトラフィックにのみルーティングルールが適用されるようになります。

設定例

kind: VirtualService
metadata:
  name: info-rule
  namespace: info
spec:
  hosts:
  - info.com
  gateways:
  - info/bookinfo-gateway
  http:
  - match:
    - uri:
        prefix: /reviews/
    route:
    - destination:
        port:
          number: 9080
        host: reviews.info.svc.cluster.local
Copy to Clipboard Toggle word wrap

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

この手順では、Istio Gateway および VirtualService リソースを使用して、ゲートウェイインジェクションを使用してデプロイされたゲートウェイを設定します。リソースは、メッシュ内のサービスをメッシュ外のトラフィックに公開するようにゲートウェイを設定します。次に、ゲートウェイの ServiceLoadBalancer タイプに設定して、ゲートウェイをクラスター外部のトラフィックに公開します。

前提条件

  • ゲートウェイインジェクションを使用して Istio ゲートウェイをインストールしている。

手順

  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

    2. サイドカーインジェクションを有効にするには、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 ステータスがあることを確認します。これは、リクエストが成功したことを示します。

2.2. クラスター外のトラフィックにサービスを公開することについて

OpenShift クラスターの外部からのトラフィックがメッシュ内のサービスにアクセスできるようにするには、Service タイプを LoadBalancer に設定するか、OpenShift Router を使用して、ゲートウェイプロキシーを公開する必要があります。

Kubernetes ロードバランシングを使用して、受信トラフィックを受信ゲートウェイ経由で直接処理すると、データ暗号化に関連するレイテンシーを削減できます。受信ゲートウェイで暗号化を管理することで、メッシュ内で発生しがちな中間的な復号化と再暗号化の処理を回避し、レイテンシーを削減できます。このアプローチにより、メッシュトラフィックは 1 回だけ暗号化および復号化できるため、一般的にはより効率的となります。

OpenShift Router は Ingress トラフィックを管理するための標準的なアプローチを提供し、ルーターを使用して同じ方法ですべてのクラスター Ingress トラフィックの証明書を管理できます。ただし、OpenShift Router は、受信トラフィックとメッシュアプリケーションの間に追加のホップを導入します。通常、トラフィックをルーターで復号し、サービスメッシュ Ingress ゲートウェイで再暗号化することでルーティングしますが、これによりレイテンシーが発生します。

2.2.1. OpenShift Routes を使用してゲートウェイをクラスター外のトラフィックに公開する

OpenShift Routes を使用すると、ゲートウェイをクラスター外部のトラフィックに公開できます。このアプローチは、ゲートウェイをクラスター外部のトラフィックに公開する必要がある場合に、Kubernetes ロードバランサーサービスの代わりに使用できます。

前提条件

  • Istio Gateway と VirtualService リソースを使用してサービスを公開する の手順を完了している。

手順

  1. 次のコマンドを実行して、Service タイプが ClusterIP に設定されていることを確認します。

    $ oc patch service <gateway_name> -n <gateway_namespace> -p '{"spec": {"type": "ClusterIP"}}'
    Copy to Clipboard Toggle word wrap
  2. httpbin サービスの Route を定義する httpbin-route.yaml という名前の YAML ファイルを作成します。

    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      name: httpbin
      namespace: <gateway_namespace>
    spec:
      host: httpbin.example.com
      port:
        targetPort: http2
      to:
        kind: Service
        name: <gateway_name>
        weight: 100
      wildcardPolicy: None
    Copy to Clipboard Toggle word wrap
  3. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f httpbin-route.yaml
    Copy to Clipboard Toggle word wrap
  4. Ingress ルーターを介してクラスターの外部から httpbin サービスにアクセスできることを確認します。クラスターが実行されている環境に合わせて、INGRESS_HOST 変数を適切に設定してください。

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

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

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

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

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 ステータスがあることを確認します。これは、リクエストが成功したことを示します。

第3章 ゲートウェイ経由で送信トラフィックを誘導する

Istio API を使用すると、ゲートウェイインジェクションを使用してインストールされたゲートウェイプロキシーを設定して、外部サービスに送信されるトラフィックを誘導できます。

3.1. ゲートウェイ経由での Egress トラフィックの誘導について

ゲートウェイインジェクションを使用してインストールされたゲートウェイを、サービスメッシュから出るトラフィックの出口ポイントとして設定できます。この設定では、ゲートウェイはメッシュ外部のサービスに送信されるリクエストのフォワードプロキシーとして機能します。

Egress トラフィック用のゲートウェイを設定すると、セキュリティー要件を満たすのに役立ちます。たとえば、トラフィック制限により、メッシュから出るすべてのトラフィックが専用のノードセットを通過する必要がある環境では、Egress ゲートウェイを使用できます。同様に、ネットワークポリシーによってアプリケーションノードが外部サービスに直接アクセスできない場合は、ゲートウェイを使用できます。このようなシナリオでは、ゲートウェイプロキシーは、外部サービスにアクセスできる専用の Egress ノードにデプロイされます。これらのノードは、その後、セキュリティー強化のために厳格なネットワークポリシーの適用や追加のモニタリングを受けることができます。

ゲートウェイインジェクションを使用してインストールされたゲートウェイを設定して Egress トラフィックを誘導するには、Istio ServiceEntryGatewayVirtualService、および DestinationRule リソースの組み合わせを使用します。ServiceEntry リソースを使用して、外部サービスのプロパティーを定義します。外部サービスはメッシュの Istio サービスレジストリーに追加されます。これにより、メッシュを出て外部サービスに向かうトラフィックに対して、モニタリングやルーティングルールなどの Istio 機能を適用できます。GatewayVirtualService、および DestinationRule リソースを使用し、ゲートウェイプロキシーを使用してメッシュから外部サービスにトラフィックをルーティングするルールをセットアップします。

3.2. Istio API を使用してゲートウェイ経由で Egress トラフィックを誘導する

Istio API を使用して、ゲートウェイインジェクションを使用してインストールされたゲートウェイを介して送信 HTTP トラフィックを誘導します。

前提条件

  • ゲートウェイインジェクションを使用してゲートウェイをインストールしている。

手順

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

    $ oc create namespace curl
    Copy to Clipboard Toggle word wrap
  2. 使用している更新ストラテジーに応じて、適切なコマンドを実行して namespace でサイドカーインジェクションを有効にします。

    1. InPlace 更新ストラテジーを使用している場合は、次のコマンドを実行します。

      $ oc label namespace curl istio-injection=enabled
      Copy to Clipboard Toggle word wrap
    2. RevisionBased 更新ストラテジーを使用している場合は、次のコマンドを実行します。

      1. 次のコマンドを実行してリビジョン名を表示します。

        $ 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

      2. 次のコマンドを実行して、namespace にリビジョン名のラベルを付け、サイドカーインジェクションを有効にします。

        $ oc label namespace curl istio.io/rev=default
        Copy to Clipboard Toggle word wrap
  3. 次のコマンドを実行して、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
  4. curl Pod の名前で初期化された CURL_POD 環境変数をエクスポートします。

    $ export CURL_POD=$(oc get pod -n curl -l app=curl -o jsonpath='{.items[0].metadata.name}')
    Copy to Clipboard Toggle word wrap
  5. メッシュから外部サービスにトラフィックを誘導する http-se.yaml という名前の YAML ファイルを作成します。次の例では、URL の ServiceEntry を定義します。

    設定例

    apiVersion: networking.istio.io/v1
    kind: ServiceEntry
    metadata:
      name: egress-se
      namespace: curl
    spec:
      hosts:
        - docs.redhat.com
      ports:
        - number: 80
          name: http-port
          protocol: HTTP
      location: MESH_EXTERNAL
      resolution: DNS
    Copy to Clipboard Toggle word wrap

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

    $ oc apply -f http-se.yaml
    Copy to Clipboard Toggle word wrap
  7. ServiceEntry 設定が正しく適用されていることを確認します。次のコマンドを実行して、前の手順で指定したホストに HTTP リクエストを送信します。

    $ oc exec "$CURL_POD" -n curl -c curl -- curl -sSL -o /dev/null -D - http://docs.redhat.com
    Copy to Clipboard Toggle word wrap

    このコマンドは、接続が機能していることを示す 301 (リダイレクト) または 200 (成功) などの HTTP ステータスコードを返します。

  8. Egress Gateway を作成し、メッシュからのトラフィックを外部サービスに指定されたホストにルーティングする http-gtw.yaml という名前の YAML ファイルを作成します。

    設定例

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: egress-gw
      namespace: <gateway_namespace> # Namespace where the egress gateway is deployed
    spec:
      selector:
        istio: <gateway_name> # Selects the egress-gateway instance to handle this traffic
      servers:
        - port:
            number: 80
            name: http
            protocol: HTTP
          hosts:
            - docs.redhat.com # External service host, not a full URL.
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      name: egress-dr
      namespace: <gateway_namespace> # Namespace where the egress gateway is deployed
    spec:
      host: <gateway_name>.<gateway_namespace>.svc.cluster.local
      subsets:
        - name: rh-docs
    Copy to Clipboard Toggle word wrap

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

    $ oc apply -f http-gtw.yaml
    Copy to Clipboard Toggle word wrap
  10. アプリケーションサイドカーから Egress ゲートウェイを経由して外部ホストまでのトラフィックのフローを管理する VirtualService をセットアップする http-vs.yaml という名前の YAML ファイルを作成します。

    設定例

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: egress-vs
      namespace: curl # Namespace where the curl pod is running
    spec:
      hosts:
        - docs.redhat.com # External service host, not a full URL.
      gateways:
        - mesh
        - <gateway_namespace>/egress-gw # Egress gateway name defined in the file that you used in the previous step.
      http:
        - match:
            - gateways:
                - mesh
              port: 80
          route:
            - destination:
                host: <gateway_name>.<gateway_namespace>.svc.cluster.local
                subset: rh-docs
                port:
                  number: 80
              weight: 100
        - match:
            - gateways:
                - <gateway_namespace>/egress-gw # Egress gateway name defined in the file that you used in the previous step.
              port: 80
          route:
            - destination:
                host: docs.redhat.com
                port:
                  number: 80
              weight: 100
    Copy to Clipboard Toggle word wrap

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

    $ oc apply -f http-vs.yaml
    Copy to Clipboard Toggle word wrap
  12. HTTP リクエストを URL に再送信します。

    $ oc exec "$CURL_POD" -n curl -c curl -- curl -sSL -o /dev/null -D - http://docs.redhat.com
    Copy to Clipboard Toggle word wrap

    ターミナルには、以下の出力に似た情報が表示されます。

    出力例

    ...
    HTTP/1.1 301 Moved Permanently
    ...
    location: <example_url>
    ...
    
    HTTP/2 200
    Content-Type: text/html; charset=utf-8
    Copy to Clipboard Toggle word wrap

  13. 次のコマンドを実行して、リクエストがゲートウェイ経由でルーティングされたことを確認します。

    $ oc logs deployment/<gateway_name> -n <gateway_namespace> | tail -1
    Copy to Clipboard Toggle word wrap
    注記

    この検証手順を実行するには、アクセスロギングを有効にする必要があります。Istio リソースで spec.values.meshConfig.accessLogFile フィールドを /dev/stdout に設定することで、標準出力へのアクセスロギングを有効にできます。

    ターミナルには、以下の出力に似た情報が表示されます。

    出力例

    [2024-11-07T14:35:52.428Z] "GET / HTTP/2" 301 - via_upstream - "-" 0 0 24 24 "10.128.2.30" "curl/8.11.0" "79551af2-341b-456d-b414-9220b487a03b" "docs.redhat.com" "23.55.176.201:80" outbound|80||docs.redhat.com 10.128.2.29:49766 10.128.2.29:80 10.128.2.30:38296 -
    Copy to Clipboard Toggle word wrap

3.3. Kubernetes Gateway API を使用してゲートウェイ経由で Egress トラフィックを送信する

Kubernetes Gateway API を使用して、送信 HTTP トラフィックを Egress ゲートウェイ経由で送信します。

前提条件

  • Istio コントロールプレーンをインストールした。
  • Istio および IstioCNI リソースを設定した。

手順

  1. オプション: {k8} Gateway API カスタムリソース定義 (CRD) を有効にします。

    注記

    Kubernetes 1.28 および OpenShift Container Platform 4.18 以前のバージョンの Red Hat OpenShift Service Mesh では、Kubernetes Gateway API CRD はデフォルトでは使用できないため、使用する前に CRD を有効にする必要があります。OpenShift Container Platform 4.19 以降のバージョンでは、CRD がデフォルトで有効になっています。

    1. Kubernetes Gateway API CRD を有効にする、gateway-cr.yaml という名前の YAML ファイルを作成します。

      Kubernetes Gateway カスタムリソース (CR) ファイルの例

      apiVersion: gateway.networking.k8s.io/v1
      kind: Gateway
      metadata:
        name: info-gateway
      spec:
        gatewayClassName: istio
        listeners:
        - name: http
          port: 80
          protocol: HTTP
          allowedRoutes:
            namespaces:
              from: Same
      ---
      apiVersion: gateway.networking.k8s.io/v1
      kind: HTTPRoute
      metadata:
        name: info
      spec:
        parentRefs:
        - name: info-gateway
        rules:
        - matches:
          - path:
              type: Exact
              value: /productpage
          - path:
              type: PathPrefix
              value: /static
          - path:
              type: Exact
              value: /login
          - path:
              type: Exact
              value: /logout
          - path:
              type: PathPrefix
              value: /api/v1/products
          backendRefs:
          - name: productpage
            port: 9080
      Copy to Clipboard Toggle word wrap

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

      $ oc apply -f gateway-cr.yaml
      Copy to Clipboard Toggle word wrap
  2. 次のコマンドを実行して、Egress-gateway という namespace を作成します。

    $ oc create namespace egress-gateway
    Copy to Clipboard Toggle word wrap
  3. 次のコマンドを実行して、その namespace に istio-injection ラベルを適用します。

    $ oc label namespace egress-gateway istio-injection=enabled
    Copy to Clipboard Toggle word wrap
  4. Egress ゲートウェイを定義する、egress -gateway-cr.yaml という名前の YAML ファイルを作成します。

    Egress ゲートウェイ CR ファイルの例

    # ServiceEntry to allow traffic to httpbin.org
    apiVersion: networking.istio.io/v1
    kind: ServiceEntry
    metadata:
      name: httpbin-ext
    spec:
      hosts:
      - httpbin.org
      ports:
      - number: 80
        name: http
        protocol: HTTP
      location: MESH_EXTERNAL
      resolution: DNS
    ---
    # Gateway API Gateway for egress
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: httpbin-egress-gateway
      annotations:
        networking.istio.io/service-type: ClusterIP
    spec:
      gatewayClassName: istio
      listeners:
      - name: http
        hostname: httpbin.org
        port: 80
        protocol: HTTP
        allowedRoutes:
          namespaces:
            from: Same
    ---
    # HTTPRoute to direct traffic from sidecars to the egress gateway
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: direct-httpbin-to-egress-gateway
    spec:
      parentRefs:
      - kind: ServiceEntry
        group: networking.istio.io
        name: httpbin-ext
      rules:
      - backendRefs:
        - name: httpbin-egress-gateway-istio
          port: 80
    ---
    # HTTPRoute to forward traffic from the egress gateway to httpbin.org
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: forward-httpbin-from-egress-gateway
    spec:
      parentRefs:
      - name: httpbin-egress-gateway
      hostnames:
      - httpbin.org
      rules:
      - backendRefs:
        - kind: Hostname
          group: networking.istio.io
          name: httpbin.org
          port: 80
    Copy to Clipboard Toggle word wrap

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

      $ oc apply -f egress-gateway-cr.yaml
      Copy to Clipboard Toggle word wrap

検証

  1. 次のコマンドを実行して、ゲートウェイ設定のステータスを確認します。

    $ oc describe gateway -n egress-gateway
    Copy to Clipboard Toggle word wrap

    目的の出力の Status 列には、Programmed が表示されます。

  2. 次のコマンドを実行して、Egress-gateway namespace に curl Pod を作成します。

    $ oc run test-pod --image=curlimages/curl:latest -n egress-gateway --rm -it --restart=Never -- sh
    Copy to Clipboard Toggle word wrap
  3. curl クライアントを使用し、次のコマンドを入力して Egress ゲートウェイ経由で httpbin.org にアクセスできることを確認します。

    $ curl -v http://httpbin.org/get
    Copy to Clipboard Toggle word wrap

    目的の出力には、設定されたゲートウェイを通過する Egress トラフィックのルートを示す httpbin.org からのレスポンスが表示されます。

法律上の通知

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2026 Red Hat