1. はじめに
Amazon Elastic Container Service for Kubernetes(以下EKS)を本番運用するにあたって各要素について検討を行なっています。
今回はその中で、EKS で API Gateway を使用するにあたり、どのような構成を採用するかについて検討した内容をご紹介します。
もし指摘点等あればドシドシいただきたいです。
2. 構成パターン
色々調べた結果。下記の4つの構成パターンについて検討しました。
- Terraform で API Gateway と NLB を構築後、nodePort で各サービスを立ち上げる
- Terraform で API Gateway 構築後 Nginx Ingress Controller で NLB を利用する。また Nginx Ingress Controller と NLB は全サービス共用とする
- Terraform で API Gateway 構築後、Nginx Ingress Controller で NLB を利用する。また Nginx Ingress Controller と NLB は各サービスごとに構築する
- API Gateway Ingress Controller を使用する
2-1. Terraform で API Gateway と NLB を構築後、nodePort で各サービスを立ち上げる
メリット
- Terraform と k8s の境界が明確。そのため k8s 初心者に優しい。
- Ingress が存在しないため障害点が少ない。
デメリット
- ポートをかなり意識する必要がある。
所感
使用するリソースが少ないためシンプルな構成です。特に Nginx Ingress Controller を使用しなくてよいので、 負荷が増えてきたら Nginx のレプリカ数をどうしようか?とか考えなくてよいです。
ただ K8s は本来動的にリソースが決定され IP や Port は抽象化されるはずですが、この構成だと サービスと Port の紐付けを人力で管理する必要がでてきます。ちょっとかっこ悪い?
2-2. Terraform で API Gateway 構築後 Nginx Ingress Controller で NLB を利用する。また Nginx Ingress Controller と NLB は全サービス共用とする
メリット
- 公式ドキュメントにもある導入方法
- Nginx Ingress Controller の豊富なオプションを利用できる
- サービスの振り分けを Ingress に任せられるため APIGateway 側はサービスをあまり意識しなくてよい。
デメリット
- NginxIngressController の面倒を見る必要がある。
所感
一番 k8s っぽい。
2-3. Terraform で API Gateway 構築後、Nginx Ingress Controller で NLB を利用する。また Nginx Ingress Controller と NLB は各サービスごとに構築する
メリット
- NLBまで含めてサービスごとに構築されるため、よりマイクロサービス化されていると言える。
デメリット
- サービスごとにNLBが構築されるため費用がかさむ。
- Nginx Ingress Controller があまり意味を成さない。
- APIGateway でサービスの振り分けをする必要がある。
所感
マイクロサービス化されていると言えばそうだが、L4ロードバランサをサービスごとに用意する意味はあまりない気がする...。
2-4. API Gateway Ingress Controller を使用する
メリット
- 初期構築や設定反映が簡単。
- サービスやAPIが増えたときも対応が簡単。
- 全てをk8sのマニフェストで管理ができる。
デメリット
- API Gatewayの豊富なオプションを使用できない。できたとしても柔軟性が無い。
- API GatewayのバックエンドとしてEKS以外を使用できない。
所感
デメリットが致命的。例えばAWSの設定で、ある新規パスのバックエンドにLambdaを設定したとしても、k8sのマニフェストを適用した際に消えてします。K8sのマニフェストの設定内容で全て上書かれてしまう。
結論
検討した結果、 『2-2. Terraform で API Gateway 構築後 Nginx Ingress Controller で NLB を利用する。また Nginx Ingress Controller と NLB は全サービス共用とする』 を採用することにしました。
またこの構成であれば、将来必要になった際に簡単に**『2-3. Terraform で API Gateway 構築後、Nginx Ingress Controller で NLB を利用する。また Nginx Ingress Controller と NLB は各サービスごとに構築する』**に拡張することができます。
サービス毎にNLBを分けることはしませんが、k8s の NodeGroup が複数できた際にも、 API Gateway が1つで対応可能となります。