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 が設定されます。
手順
GatewayClass
オブジェクトを作成します。次の情報が含まれる YAML ファイル
openshift-default.yaml
を作成します。GatewayClass
CR の例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要Ingress Operator がこれを管理するには、コントローラー名が表示されているとおりである必要があります。このフィールドを他の値に設定すると、Ingress Operator は
GatewayClass
オブジェクトと、それに関連付けられたすべてのGateway
、GRPCRoute
、およびHTTPRoute
オブジェクトを無視します。コントローラー名は OpenShift Container Platform の Gateway API の実装に関連付けられており、許可されるコントローラー名はopenshift.io/gateway-controller/v1
のみです。次のコマンドを実行して、
GatewayClass
リソースを作成します。oc create -f openshift-default.yaml
$ oc create -f openshift-default.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
gatewayclass.gateway.networking.k8s.io/openshift-default created
gatewayclass.gateway.networking.k8s.io/openshift-default created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow GatewayClass
リソースの作成中に、Ingress Operator は Red Hat OpenShift Service Mesh の軽量バージョン、Istio カスタムリソース、およびopenshift-ingress
namespace に新しいデプロイメントをインストールします。オプション: 新しいデプロイメント
istiod-openshift-gateway
が準備され、利用可能であることを確認します。oc get deployment -n openshift-ingress
$ oc get deployment -n openshift-ingress
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME READY UP-TO-DATE AVAILABLE AGE istiod-openshift-gateway 1/1 1 1 55s router-default 2/2 2 2 6h4m
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 Copied! Toggle word wrap Toggle overflow
次のコマンドを実行してシークレットを作成します。
oc -n openshift-ingress create secret tls gwapi-wildcard --cert=wildcard.crt --key=wildcard.key
$ oc -n openshift-ingress create secret tls gwapi-wildcard --cert=wildcard.crt --key=wildcard.key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Ingress Operator のドメインを取得します。
DOMAIN=$(oc get ingresses.config/cluster -o jsonpath={.spec.domain})
$ DOMAIN=$(oc get ingresses.config/cluster -o jsonpath={.spec.domain})
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gateway
オブジェクトを作成します。次の情報が含まれる YAML ファイル
example-gateway.yaml
を作成します。Gateway
CR の例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
Gateway
オブジェクトは、openshift-ingress
namespace に作成する必要があります。- 2
Gateway
オブジェクトは、以前に作成されたGatewayClass
オブジェクトの名前を参照する必要があります。- 3
- HTTPS リスナーは、クラスタードメインのサブドメインに一致する HTTPS 要求をリッスンします。このリスナーを使用し、Gateway API
HTTPRoute
リソースを使用してアプリケーションへの Ingress を設定します。 - 4
- ホスト名は、Ingress Operator ドメインのサブドメインである必要があります。ドメインを使用する場合、リスナーはそのドメイン内のすべてのトラフィックを処理しようとします。
- 5
- 以前に作成されたシークレットの名前。
次のコマンドを実行して、リソースを適用します。
oc apply -f example-gateway.yaml
$ oc apply -f example-gateway.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション:
Gateway
オブジェクトを作成すると、Red Hat OpenShift Service Mesh は同じ名前のデプロイメントとサービスを自動的にプロビジョニングします。以下のコマンドを実行して、これを確認します。デプロイメントを確認するには、次のコマンドを実行します。
oc get deployment -n openshift-ingress example-gateway-openshift-default
$ oc get deployment -n openshift-ingress example-gateway-openshift-default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME READY UP-TO-DATE AVAILABLE AGE example-gateway-openshift-default 1/1 1 1 25s
NAME READY UP-TO-DATE AVAILABLE AGE example-gateway-openshift-default 1/1 1 1 25s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サービスを確認するには、次のコマンドを実行します。
oc get service -n openshift-ingress example-gateway-openshift-default
$ oc get service -n openshift-ingress example-gateway-openshift-default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE example-gateway-openshift-default LoadBalancer 10.1.2.3 <external_ipname> <port_info> 47s
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 Copied! Toggle word wrap Toggle overflow
オプション: 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
$ oc -n openshift-ingress get dnsrecord -l gateway.networking.k8s.io/gateway-name=example-gateway -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
すでに作成済みの namespace と
example-app/example-app
というアプリケーションにリクエストを送信するHTTPRoute
リソースを作成します。次の情報が含まれる YAML ファイル
example-route.yaml
を作成します。HTTPRoute
CR の例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、リソースを適用します。
oc apply -f example-route.yaml
$ oc apply -f example-route.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
httproute.gateway.networking.k8s.io/example-route created
httproute.gateway.networking.k8s.io/example-route created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを実行して、
Gateway
オブジェクトがデプロイされ、状態がProgrammed
であることを確認します。oc wait -n openshift-ingress --for=condition=Programmed gateways.gateway.networking.k8s.io example-gateway
$ oc wait -n openshift-ingress --for=condition=Programmed gateways.gateway.networking.k8s.io example-gateway
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
gateway.gateway.networking.k8s.io/example-gateway condition met
gateway.gateway.networking.k8s.io/example-gateway condition met
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 設定された
HTTPRoute
オブジェクトのホスト名にリクエストを送信します。curl -I --cacert <local cert file> https://example.gwapi.${DOMAIN}:443
$ curl -I --cacert <local cert file> https://example.gwapi.${DOMAIN}:443
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
リソースの例
- 1
spec.listeners[].allowedRoutes
を設定せずにGateway
リソースを作成すると、namespaces.from
フィールドの値がSame
に暗黙的に設定されます。
次の例は、専用の Gateway
オブジェクトにアタッチされる、関連付けられた HTTPRoute
リソースの sales-db
を示しています。
HTTPRoute
リソースの例
HTTPRoute
リソースをゲートウェイにアタッチするには、その parentRefs
フィールドの値として Gateway
オブジェクトの名前を指定する必要があります。暗黙的に、ルートは Gateway
オブジェクトと同じ namespace にあると想定されます。