🍣

【備忘録】Kubernetes と API Gateway

2022/11/13に公開約3,100字

はじめに

アルバイト先で Emissary-ingress(旧 Ambassador)を触ることになったのですが、そもそも API Gateway ってなんだっけ状態から色々と調べたので備忘録です。なかなか短時間で書いてまとめているので、間違いがあればこっそり(じゃなくてもいいので)指摘して頂けると助かります。AWS に関連する部分は基本的には文献調査のみに基づいて書いています。

※ 本記事は任意のタイミングで予告なく内容が更新される可能性があります

API Gateway とは?

API Gateway について簡単に説明します。僕自身 API Gateway についてフワッとしか理解していなかったのですが、簡単にいえば「ルーティング、認証、認可、レート制限などの様々な機能を提供するプロキシ」と言えそうです。例えば、Nginx では API Gateway を以下のように説明しています。

The term API gateway describes a proxy (such as a reverse proxy or Ingress controller) that routes API calls to backend applications and can provide other services for API traffic, including – but not limited to – authentication, authorization, traffic shaping, and rate limiting. In short, it is a traffic management tool.

[1] より引用

マイクロサービスアーキテクチャを採用するアプリケーションでは、クライアントからのリクエストを単一のエンドポイントに集約して様々な機能を提供することを目的として導入されるようです(そしてこれを API Gateway pattern と読んだりするそうです)。詳しいことは [2] に書かれていますが、API Gateway pattern を導入する動機はいくつかあります。[2] では、API Gateway pattern を導入しなかった場合に生じる問題について分かりやすく説明しているため、一度読んでみるとよいかもしれません。具体的な説明は省略しますが、クライアントとマイクロサービスが密結合になる、ラウンドトリップが増える、すべてのマイクロサービスを公開することになる、など直観的に理解できるものです。

ただ、実際には他にも様々な理由があってこのパターンが採用されているようです [4]。例えば、レガシーシステムをリプレイスする手法として Strangler Fig pattern というものがあります。この手法では、クライアントからのリクエストは Strangler Facade によってレガシーシステムとモダンシステムのそれぞれにルーティングされます。考え方としてはいわゆる Canary Release とほとんど同じかと思われます。ここまで説明すればおそらくお気づきのように、ここでルーティングを振り分ける Strangler Facade の役割を API Gateway が担うことができます。

Kubernetes と API Gateway

Kubernetes で特定のアプリケーションを外部公開したい場合、Load Balancer リソースか Ingress リソースのどちらかを利用することが多いと思います。両者の違いは色々ありますが、Load Balancer リソースは Service リソースを紐付いているため、複数の Service に対してのルーティングを定義することはできません。一方で、Ingress では複数の Service へのルーティングが可能です。負荷分散という意味では Load Balancer リソースは L4 レベルでの負荷分散を提供しますが、Ingress リソースは L7 レベルでの負荷分散を提供します。Ingress リソースは外部のロードバランサーを使わずに実装することもできますが、パブリッククラウドを利用している場合は外部のロードバランサーを利用することもできます。例えば、Amazon の資料では EKS 上に構築されたマイクロサービスを外部公開するための手段として ALB と Amazon API Gateway が提案されています [3] 。しかし、外部からの通信がすべて集約される API Gateway に外部のロードバランサーを利用すること、コスト面での懸念が生じる可能性もあります。

参考文献

Discussion

ログインするとコメントできます