|
Gateway API(旧称Service API)は、SIG-NETWORKコミュニティが管理するオープンソースプロジェクトです。プロジェクトアドレスはhttps://gateway-api.sigs.k8s.io/です。このAPIが開発された主な理由は、Ingressリソースオブジェクトがネットワーク要件を十分に満たせないことです。多くのシナリオにおいて、IngressコントローラーはアノテーションやCRDを定義して機能を拡張する必要があり、これは標準的な使用方法やサポートに悪影響を及ぼしています。新たにリリースされたGateway APIは、拡張可能なロール指向インターフェースを通じてサービスネットワーキングを強化することを目的としています。 Gateway API は、GatewayClass、Gateway、HTTPRoute、TCPRoute、Service などを含む Kubernetes の API リソースのコレクションです。これらのリソースは連携して、さまざまなネットワーク ユース ケースのモデルを構築します。 Gateway API の改善により、現在の Ingress リソース オブジェクトよりも優れた設計機能が数多く追加されました。
他にも注目すべき機能がいくつかあります。
キャラクター重視のデザイン道路、電力、データセンター、Kubernetesクラスターなど、インフラは共有のために構築されています。しかし、共有インフラには共通の課題があります。それは、インフラ利用者に柔軟性を提供しつつ、所有者のコントロールを維持することです。 Gateway APIは、Kubernetesサービスネットワークにロール指向設計を採用することでこれを実現し、柔軟性と集中管理のバランスをとっています。これにより、共有ネットワークインフラストラクチャ(ハードウェアロードバランサー、クラウドネットワーク、クラスターホスト型ブローカーなど)を、クラスター運用によって設定された様々なポリシーと制約に従いながら、複数の異なるチームで利用できるようになります。次の例は、これが実際にどのように機能するかを示しています。 クラスタ運用エンジニアは、GatewayClassに基づいてGatewayリソースを作成します。このGatewayは、自身が表す基盤となるネットワークリソースを展開または構成します。クラスタ運用チームと各チームは、アプリケーションを公開するために、このGatewayに接続できるものについて話し合う必要があります。TLSなどの集中管理されたポリシーは、クラスタ運用チームがGateway上で適用できます。一方、ストアアプリケーションとサイトアプリケーションはそれぞれ独自の名前空間で実行されますが、ルートは同じ共有ゲートウェイに接続されるため、ルーティングロジックを個別に制御できます。 この関心の分離設計により、集中戦略と制御をクラスター操作に任せながら、さまざまなチームが独自のトラフィックを管理できます。 コンセプトゲートウェイAPIには、インフラストラクチャプロバイダー、クラスタ管理者、アプリケーション開発者の3つの役割が関係します。シナリオによっては、アプリケーション管理者も関与する場合があります。ゲートウェイAPIは、GatewayClass、Gateway、およびRouteという3つの主要なリソースモデルを定義します。 ゲートウェイクラスGatewayClassは、同じ設定とアクションを共有するゲートウェイのセットを定義します。各GatewayClassはコントローラーによって処理され、クラスター全体のリソースであるため、少なくとも1つのGatewayClassを定義する必要があります。 これはIngressのIngressClassに似ています。Ingress v1beta1では、アノテーション「ingress-class」は「GatewayClass」に似ていましたが、Ingress V1では最も近いのは「IngressClass」リソースオブジェクトです。 ゲートウェイゲートウェイは、トラフィックがクラスター内のサービスにどのように変換されるかを記述します。言い換えれば、Kubernetes に関連しないソースからのトラフィックをクラスター内のサービスにリダイレクトするリクエストを定義します。これには、クラウドロードバランサー、クラスター内プロキシ、または外部ハードウェアロードバランサーから Kubernetes サービス宛てのトラフィックが含まれます。 これは、GatewayClassの設定と動作仕様を実装する特定のロードバランサー設定へのリクエストを定義します。このリソースは、管理者が直接作成することも、GatewayClassを処理するコントローラーによって作成することもできます。 ゲートウェイは 1 つ以上のルート参照に接続することができ、これによりトラフィックのサブセットが特定のサービスに誘導されます。 ルートリソースルーティング リソースは、ゲートウェイから Kubernetes サービスへのリクエストをマッピングするための特定のルールを定義します。 バージョンv1alpha2以降、APIには4種類のルートリソースが含まれています。その他の未定義のプロトコルについては、特定の実装に基づいたカスタムルートタイプの使用が推奨されます。もちろん、将来的に新しいルートタイプが追加される可能性があります。 HTTPルートHTTPRoute は HTTP または HTTPS 接続に適しており、ルーティングに HTTP ヘッダーを使用したり、リクエスト処理中に HTTP ヘッダーを変更したりするなど、HTTP リクエストを検査してルーティングまたは変更するシナリオで役立ちます。 TLSルートTLSRouteはTLS接続に使用され、SNIによって区別されます。SNIを主要なルーティング方法として使用し、HTTPなどの上位プロトコルの特性を気にしない場所に適しています。接続のバイトストリームは、検査なしでバックエンドにプロキシされます。 TCPルートとUDPRouteTCPRoute(およびUDPRoute)は、1つまたは複数のポートを単一のバックエンドにマッピングするように設計されています。この場合、同じポートに対して異なるバックエンドを選択するための識別子がないため、各TCPRouteはリスナー上で異なるポートを必要とします。TLSを使用する場合は、暗号化されていないバイトストリームがバックエンドに配信されます。TLSを使用しない場合は、暗号化されたバイトストリームがバックエンドに配信されます。 組み合わせGatewayClass、Gateway、xRoute、Serviceの組み合わせにより、実装可能なロードバランサーが定義されます。次の図は、さまざまなリソース間の関係を示しています。 リバース プロキシを使用して実装されたゲートウェイの一般的なクライアント/ゲートウェイ API 要求フローを以下に示します。 1. クライアントはhttp://foo.example.comにリクエストを送信します。 2. DNS はドメイン名をゲートウェイ アドレスに解決します。 3. リバース プロキシはリスナーでリクエストを受信し、ホスト ヘッダーを使用して HTTP ルートを照合します。 4. (オプション) リバース プロキシは、HTTPRoute 一致ルールに従ってデータをルーティングできます。 5. (オプション) リバース プロキシは、HTTPRoute のフィルタリング ルールに基づいてリクエストを変更できます (つまり、ヘッダーを追加または削除します)。 6. 最後に、リバース プロキシは、HTTPRoute forwardTo ルールに従って、クラスター内の 1 つ以上のオブジェクト (サービス) に要求を転送します。 成し遂げるGateway APIには、Contour、Google Kubernetes Engine、Istio、Traefikなど、既に多くのコントローラ実装が利用可能です。ここではTraefikを例としてテストを行います。ただし、Traefikは現在v1alpha1仕様に基づいて実装されており、前述のコンセプトの一部とは若干異なる可能性があることにご注意ください。 TraefikでGateway APIを使用するには、まずGateway APIのCRDを手動でインストールする必要があります。これは以下のコマンドで実行でき、GatewayClass、Gateway、HTTPRoute、TCPRouteなどのCRDがインストールされます。
次に、Traefikでkubernetesgatewayプロバイダーを有効にする必要があります。これも、前のTraefikセクションで定義したHelm Chartパッケージに基づいており、experimental.kubernetesGateway.enabled=trueを設定します。完全なValuesファイルは以下の通りです。
次に、次のコマンドを使用して Traefik を更新します。
更新が完了したら、Traefik ダッシュボードに移動して、KubernetesGateway プロバイダーが有効になっているかどうかを確認できます。 通常の状況では、アクティベーションが成功すると、Traefik はデフォルトの GatewayClass リソース オブジェクトと Gateway インスタンスも作成します。
ご覧のとおり、デフォルトのGatewayインスタンスはtraefikという名前のGatewayClassを参照しています。listenersセクションでは、このゲートウェイに関連付けられたリスナーエントリを定義します。listenerはゲートウェイアドレスにバインドされた論理エンドポイントを定義し、少なくとも1つのリスナーを指定する必要があります。その下のHTTPRouteセクションではルーティングルールを定義します。namespacesセクションでは、ゲートウェイに選択する名前空間を指定します。デフォルトでは、ゲートウェイの名前空間に制限されています。Selectorセクションでは、ルートタグのセットを指定します。このSelectorが定義されている場合、セレクタに一致し、ゲートウェイに関連付けられているオブジェクトのみがルーティングされます。空のセレクタはすべてのオブジェクトと一致します。ここでは、app: traefikタグを持つオブジェクトと一致します。 他の名前空間からのルーティング ルールを処理するには、`namespaces.from` を `All` に変更することもできますが、テストの結果、機能しないことがわかりました。 次に、テスト用にシンプルなwhoamiサービスをインストールします。以下のリソースリストを使用して、対応するサービスを直接デプロイできます。
テスト サービスがデプロイされると、Gateway API を使用してトラフィックを構成できます。 シンプルなホストを展開するこれまでは、Ingress または IngressRoute リソース オブジェクトを作成していましたが、ここでは単純な HTTPRoute オブジェクトをデプロイします。
上記のHTTPRouteリソースは、`whoami`コマンドを使用してホスト名に送信されたリクエストをキャプチャし、上記でデプロイされた`whoami`サービスに転送します。このホスト名にリクエストを送信すると、典型的な`whoami`の出力が表示されます。
さらに、上記の HTTPRoute オブジェクトで `app:traefik` タグを定義する必要があることに注意することが重要です。そうしないと、作成された Gateway インスタンスを関連付けることができません。 パス付きホスト上記の例では、トラフィックを特定のサブパスのみにルーティングするように制限することが容易になります。
上記の変更された HTTPRoute を作成すると、以前のリクエストは 404 エラーを返す一方、/foo パス サフィックスを持つリクエストは成功を返すことがわかります。
リクエストのどの部分が一致できるかについての詳細は、公式の Gateway API ドキュメント (https://gateway-api.sigs.k8s.io/v1alpha1/api-types/httproute/#rules) で確認できます。 カナリアリリースGateway API仕様でサポートされているもう1つの機能は、カナリア公開です。1つのエンドポイントで2つの異なるサービス(または同じサービスの2つのバージョン)を実行し、リクエストの一部を各エンドポイントにルーティングしたい場合、HTTPRouteを変更することでこれを実現できます。 まず、2つ目のサービスを実行する必要があります。ここでは、テスト用のNginxインスタンスを簡単に作成します。
次に、HTTPRoute リソース オブジェクトを変更します。このオブジェクトには、次に示すように、2 つのサービスに異なる重みを割り当てることができる重みオプションがあります。
上記のHTTPRouteを作成した後、whoamiサービスに再びアクセスできるようになりました。通常、リクエストの約25%はwhoamiレスポンスではなくNginxレスポンスで返されることがわかります。 現時点では、Traefik を使用して Kubernetes Gateway API の使用をテストしています。現在、Traefik の Gateway API 実装は v1alpha1 仕様に基づいていますが、最新の仕様は v1alpha2 であるため、両者の間には若干の違いがある可能性があります。 |