2.13. OpenShift Container Platform ネットワーキングにおける Gateway API


OpenShift Container Platform では、Ingress Operator で Gateway API を使用することにより、ネットワークトラフィックを設定するための追加の方法が提供されます。

重要

Gateway API はユーザー定義ネットワーク (UDN) をサポートしていません。

2.13.1. Gateway API の概要

Gateway API は、オープンソースのコミュニティー管理された Kubernetes ネットワークメカニズムです。これは、クラスターのトランスポートレイヤー (L4) とアプリケーションレイヤー (L7) 内のルーティングに重点を置いています。さまざまなベンダーが Gateway API の実装 を多数提供しています。

このプロジェクトは、幅広いコミュニティーのサポートを受けた移植可能な API を使用して、標準化されたエコシステムを提供するための取り組みです。Gateway API 機能を Ingress Operator に統合することで、既存のコミュニティーとアップストリーム開発の取り組みに沿ったネットワークソリューションが可能になります。

Gateway API は Ingress Operator の機能を拡張し、よりきめ細かいクラスタートラフィックとルーティング設定を処理します。これらの機能を使用すると、Gateway API のカスタムリソース定義 (CRD) のインスタンスを作成できます。OpenShift Container Platform クラスターの場合、Ingress Operator は次のリソースを作成します。

Gateway
このリソースでは、トラフィックをクラスター内のサービスに変換する方法を説明します。たとえば、特定のロードバランサー設定などです。
GatewayClass
このリソースは、共通の設定と動作を共有する Gateway オブジェクトのセットを定義します。たとえば、パブリックアプリケーションまたはプライベートアプリケーションに使用される Gateway リソースのセットを区別するために、2 つの個別の GatewayClass オブジェクトが作成される場合があります。
HTTPRoute
このリソースは、Gateway からサービスへの HTTP 要求のルーティング動作を指定し、HTTP 接続または終了した HTTPS 接続を多重化する場合に特に役立ちます。
GRPCRoute
このリソースは、gRPC リクエストのルーティング動作を指定します。
ReferenceGrant
このリソースは、namespace 間の参照を可能にします。たとえば、ルートが別の namespace にあるバックエンドにトラフィックを転送できるようになります。

OpenShift Container Platform では、Gateway API の実装は gateway.networking.k8s.io/v1 に基づいており、このバージョンのすべてのフィールドがサポートされています。

2.13.1.1. Gateway API の利点

Gateway API には次の利点があります。

  • 移植性: OpenShift Container Platform は Ingress のパフォーマンスを向上させるために HAProxy を使用しますが、Gateway API は特定の動作を提供するためにベンダー固有のアノテーションに依存することはありません。HAProxy と同等のパフォーマンスを得るには、Gateway オブジェクトを水平方向にスケーリングするか、関連するノードを垂直方向にスケーリングする必要があります。
  • 関心の分離: Gateway API は、そのリソースに対してロールベースのアプローチを採用しています。これにより、大規模な組織における責任分担やチーム体制と、よりうまく適合します。プラットフォームエンジニアは GatewayClass リソースに重点を置き、クラスター管理者は Gateway リソースの設定に重点を置き、アプリケーション開発者は HTTPRoute リソースを使用したサービスのルーティングに重点を置く可能性があります。
  • 拡張性: 追加機能は標準化された CRD として開発されます。

2.13.1.2. Gateway API の制限

Gateway API には次の制限があります。

  • バージョンの非互換性: Gateway API エコシステムは急速に変化しており、一部の実装は、その機能セットが異なるバージョンの Gateway API に基づいているため、他の実装と連携しません。
  • リソースのオーバーヘッド: より柔軟ではありますが、Gateway API は結果を達成するために複数のリソースタイプを使用します。小規模なアプリケーションの場合、従来の Ingress のシンプルさがより適している可能性があります。

2.13.2. OpenShift Container Platform の Gateway API 実装

Ingress Operator は、他のベンダー実装が OpenShift Container Platform クラスターで定義された CRD を利用できるように、Gateway API CRD のライフサイクルを管理します。

Gateway API が提供するフィールドの中に、特定のベンダーによる実装ではサポートされていないものが含まれる場合があります。しかしその場合でも、サポートされていないフィールドを除けば、その実装は残りのフィールドとスキーマレベルで互換性があります。これらの「デッドフィールド」により、Ingress ワークロードが中断され、アプリケーションとサービスが不適切にプロビジョニングされ、セキュリティー関連の問題が発生する可能性があります。OpenShift Container Platform は特定のバージョンの Gateway API CRD を使用するため、サードパーティーの Gateway API 実装を使用する場合は、すべてのフィールドが期待どおりに機能するように、OpenShift Container Platform 実装に準拠する必要があります。

OpenShift Container Platform 4.19 クラスター内で作成されたすべての CRD は、Ingress Operator によって互換性のあるバージョン管理とメンテナンスが行われます。CRD がすでに存在するものの、以前は Ingress Operator によって管理されていなかった場合、Ingress Operator は、それらの設定が OpenShift Container Platform がサポートする Gateway API バージョンと互換性があるかをチェックします。その後、CRD の管理を引き継ぐことへの承認をユーザーに求める admin-gate を作成します。

重要

Gateway API CRD を含む以前の OpenShift Container Platform バージョンからクラスターを更新する場合は、それらのリソースを変更して、OpenShift Container Platform でサポートされているバージョンと完全に一致するようにします。そうしないと、それらの CRD は OpenShift Container Platform によって管理されていなかったため、Red Hat でサポートされていない機能が含まれている可能性があり、クラスターを更新できません。

2.13.3. Ingress Operator の Gateway API を使い始める

最初のステップに示すように GatewayClass を作成すると、クラスターで使用するための Gateway API が設定されます。

手順

  1. GatewayClass オブジェクトを作成します。

    1. 次の情報が含まれる YAML ファイル openshift-default.yaml を作成します。

      GatewayClass CR の例

      apiVersion: gateway.networking.k8s.io/v1
      kind: GatewayClass
      metadata:
        name: openshift-default
      spec:
        controllerName: openshift.io/gateway-controller/v1 
      1
      Copy to Clipboard Toggle word wrap

      1 1
      コントローラーの名前。
      重要

      Ingress Operator がこれを管理するには、コントローラー名が表示されているとおりである必要があります。このフィールドを他の値に設定すると、Ingress Operator は GatewayClass オブジェクトと、それに関連付けられたすべての GatewayGRPCRoute、および HTTPRoute オブジェクトを無視します。コントローラー名は OpenShift Container Platform の Gateway API の実装に関連付けられており、許可されるコントローラー名は openshift.io/gateway-controller/v1 のみです。

    2. 次のコマンドを実行して、GatewayClass リソースを作成します。

      $ oc create -f openshift-default.yaml
      Copy to Clipboard Toggle word wrap

      出力例

      gatewayclass.gateway.networking.k8s.io/openshift-default created
      Copy to Clipboard Toggle word wrap

      GatewayClass リソースの作成中に、Ingress Operator は Red Hat OpenShift Service Mesh の軽量バージョン、Istio カスタムリソース、および openshift-ingress namespace に新しいデプロイメントをインストールします。

    3. オプション: 新しいデプロイメント istiod-openshift-gateway が準備され、利用可能であることを確認します。

      $ oc get deployment -n openshift-ingress
      Copy to Clipboard Toggle word wrap

      出力例

      NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
      istiod-openshift-gateway   1/1     1            1           55s
      router-default             2/2     2            2           6h4m
      Copy to Clipboard Toggle word wrap

  2. 次のコマンドを実行してシークレットを作成します。

    $ oc -n openshift-ingress create secret tls gwapi-wildcard --cert=wildcard.crt --key=wildcard.key
    Copy to Clipboard Toggle word wrap
  3. 次のコマンドを実行して、Ingress Operator のドメインを取得します。

    $ DOMAIN=$(oc get ingresses.config/cluster -o jsonpath={.spec.domain})
    Copy to Clipboard Toggle word wrap
  4. Gateway オブジェクトを作成します。

    1. 次の情報が含まれる YAML ファイル example-gateway.yaml を作成します。

      Gateway CR の例

      apiVersion: gateway.networking.k8s.io/v1
      kind: Gateway
      metadata:
        name: example-gateway
        namespace: openshift-ingress 
      1
      
      spec:
        gatewayClassName: openshift-default 
      2
      
        listeners:
        - name: https 
      3
      
          hostname: "*.gwapi.${DOMAIN}" 
      4
      
          port: 443
          protocol: HTTPS
          tls:
            mode: Terminate
            certificateRefs:
            - name: gwapi-wildcard 
      5
      
          allowedRoutes:
            namespaces:
              from: All
      Copy to Clipboard Toggle word wrap

      1
      Gateway オブジェクトは、openshift-ingress namespace に作成する必要があります。
      2
      Gateway オブジェクトは、以前に作成された GatewayClass オブジェクトの名前を参照する必要があります。
      3
      HTTPS リスナーは、クラスタードメインのサブドメインに一致する HTTPS 要求をリッスンします。このリスナーを使用し、Gateway API HTTPRoute リソースを使用してアプリケーションへの Ingress を設定します。
      4
      ホスト名は、Ingress Operator ドメインのサブドメインである必要があります。ドメインを使用する場合、リスナーはそのドメイン内のすべてのトラフィックを処理しようとします。
      5
      以前に作成されたシークレットの名前。
    2. 次のコマンドを実行して、リソースを適用します。

      $ oc apply -f example-gateway.yaml
      Copy to Clipboard Toggle word wrap
    3. オプション: Gateway オブジェクトを作成すると、Red Hat OpenShift Service Mesh は同じ名前のデプロイメントとサービスを自動的にプロビジョニングします。以下のコマンドを実行して、これを確認します。

      • デプロイメントを確認するには、次のコマンドを実行します。

        $ oc get deployment -n openshift-ingress example-gateway-openshift-default
        Copy to Clipboard Toggle word wrap

        出力例

        NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
        example-gateway-openshift-default    1/1     1            1           25s
        Copy to Clipboard Toggle word wrap

      • サービスを確認するには、次のコマンドを実行します。

        $ oc get service -n openshift-ingress example-gateway-openshift-default
        Copy to Clipboard Toggle word wrap

        出力例

        NAME                                TYPE           CLUSTER-IP   EXTERNAL-IP         PORT(S)      AGE
        example-gateway-openshift-default   LoadBalancer   10.1.2.3     <external_ipname>   <port_info>  47s
        Copy to Clipboard Toggle word wrap

    4. オプション: Ingress Operator は、リスナーからのホスト名を使用して DNSRecord CR を自動的に作成し、ラベル gateway.networking.k8s.io/gateway-name=example-gateway を追加します。次のコマンドを実行して、DNS レコードのステータスを確認します。

      $ oc -n openshift-ingress get dnsrecord -l gateway.networking.k8s.io/gateway-name=example-gateway -o yaml
      Copy to Clipboard Toggle word wrap

      出力例

      kind: DNSRecord
        ...
      status:
        ...
        zones:
        - conditions:
          - message: The DNS provider succeeded in ensuring the record
            reason: ProviderSuccess
            status: "True"
            type: Published
          dnsZone:
            tags:
              ...
        - conditions:
          - message: The DNS provider succeeded in ensuring the record
            reason: ProviderSuccess
            status: "True"
            type: Published
          dnsZone:
            id: ...
      Copy to Clipboard Toggle word wrap

  5. すでに作成済みの namespace と example-app/example-app というアプリケーションにリクエストを送信する HTTPRoute リソースを作成します。

    1. 次の情報が含まれる YAML ファイル example-route.yaml を作成します。

      HTTPRoute CR の例

      apiVersion: gateway.networking.k8s.io/v1
      kind: HTTPRoute
      metadata:
        name: example-route
        namespace: example-app-ns 
      1
      
      spec:
        parentRefs: 
      2
      
        - name: example-gateway
          namespace: openshift-ingress
        hostnames: ["example.gwapi.${DOMAIN}"] 
      3
      
        rules:
        - backendRefs: 
      4
      
          - name: example-app 
      5
      
            port: 8443
      Copy to Clipboard Toggle word wrap

      1
      アプリケーションをデプロイする namespace。
      2
      このフィールドは、以前に設定した Gateway オブジェクトを指している必要があります。
      3
      ホスト名は、Gateway オブジェクトで指定されたホスト名と一致する必要があります。この場合、リスナーはワイルドカードホスト名を使用します。
      4
      このフィールドは、サービスを指すバックエンド参照を指定します。
      5
      アプリケーションの Service の名前。
    2. 次のコマンドを実行して、リソースを適用します。

      $ oc apply -f example-route.yaml
      Copy to Clipboard Toggle word wrap

      出力例

      httproute.gateway.networking.k8s.io/example-route created
      Copy to Clipboard Toggle word wrap

検証

  1. 次のコマンドを実行して、Gateway オブジェクトがデプロイされ、状態が Programmed であることを確認します。

    $ oc wait -n openshift-ingress --for=condition=Programmed gateways.gateway.networking.k8s.io example-gateway
    Copy to Clipboard Toggle word wrap

    出力例

    gateway.gateway.networking.k8s.io/example-gateway condition met
    Copy to Clipboard Toggle word wrap

  2. 設定された HTTPRoute オブジェクトのホスト名にリクエストを送信します。

    $ curl -I --cacert <local cert file> https://example.gwapi.${DOMAIN}:443
    Copy to Clipboard Toggle word wrap

2.13.4. Gateway API デプロイメントトポロジー

Gateway API は、共有ゲートウェイと専用ゲートウェイの 2 つのトポロジーに対応するように設計されています。各トポロジーには独自の利点があり、セキュリティー上の意味合いも異なります。

専用ゲートウェイ
ルートおよびロードバランサーやプロキシーは、同じ namespace から提供されます。Gateway オブジェクトは、特定のアプリケーション namespace へのルートを制限します。これは、OpenShift Container Platform に Gateway API リソースをデプロイする場合のデフォルトのトポロジーです。
共有ゲートウェイ
ルートは、複数の namespace から、または複数のホスト名で提供されます。Gateway オブジェクトフィルターは、spec.listeners.allowedRoutes.namespaces フィールドを使用して、アプリケーション namespace からのルートを許可します。

2.13.4.1. 専用ゲートウェイの例

次の例は、専用の Gateway リソースの fin-gateway を示しています。

専用 Gateway リソースの例

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: fin-gateway
  namespace: openshift-ingress
spec:
  listeners: 
1

  - name: http
    protocol: HTTP
    port: 8080
    hostname: "example.com"
Copy to Clipboard Toggle word wrap

1
spec.listeners[].allowedRoutes を設定せずに Gateway リソースを作成すると、namespaces.from フィールドの値が Same に暗黙的に設定されます。

次の例は、専用の Gateway オブジェクトにアタッチされる、関連付けられた HTTPRoute リソースの sales-db を示しています。

HTTPRoute リソースの例

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: sales-db
  namespace: openshift-ingress
spec:
  parentRefs:
  - name: fin-gateway
  hostnames:
  - sales-db.example.com
  rules:
    - backendRefs:
        - name: sales-db
        ¦ port: 8080
Copy to Clipboard Toggle word wrap

HTTPRoute リソースをゲートウェイにアタッチするには、その parentRefs フィールドの値として Gateway オブジェクトの名前を指定する必要があります。暗黙的に、ルートは Gateway オブジェクトと同じ namespace にあると想定されます。

2.13.4.2. 共有ゲートウェイの例

次の例は、spec.listeners.allowedRoutes.namespaces ラベルセレクターが shared-gateway-access: "true" を含む任意の namespace と一致するように設定された Gateway リソースの devops-gateway を示しています。

共有 Gateway リソースの例

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: devops-gateway
  namespace: openshift-ingress
listeners:
  - name: https
    protocol: HTTPS
    hostname: "example.com"
    allowedRoutes:
      namespaces:
        from: Selector
        selector:
        ¦ matchLabels:
        ¦   shared-gateway-access: "true"
Copy to Clipboard Toggle word wrap

次の例は、devops-gateway リソースに許可される namespace を示しています。

Namespace リソースの例

apiVersion: v1
kind: Namespace
metadata:
  name: dev
  labels:
    shared-gateway-access: "true"
---
apiVersion: v1
kind: Namespace
metadata:
  name: ops
  labels:
    shared-gateway-access: "true"
Copy to Clipboard Toggle word wrap

この例では、dev-portalops-home という 2 つの HTTPRoute リソースが異なる namespace にありますが、共有ゲートウェイに接続されています。

apiVersion: v1
kind: HTTPRoute
metadata:
  name: dev-portal
  namespace: dev
spec:
  parentRefs:
  - name: devops-gateway
    namespace: openshift-ingress
  rules:
  - backendRefs:
    - name: dev-portal
      port: 8080
---
apiVersion: v1
kind: HTTPRoute
metadata:
  name: ops-home
  namespace: ops
spec:
  parentRefs:
  - name: devops-gateway
    namespace: openshift-ingress
  rules:
  - backendRefs:
    - name: ops-home
      port: 8080
Copy to Clipboard Toggle word wrap

共有ゲートウェイトポロジーでは、各ルートは、アタッチしたい Gateway オブジェクトの namespace を指定する必要があります。複数の Gateway オブジェクトを namespace 間でデプロイして共有できます。共有ゲートウェイが複数ある場合、このトポロジーは概念的には Ingress Controller シャーディングに似たものになります。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2025 Red Hat