ALB Ingress Controller から Istio Ingress Gateway + AWS Load Balancer Controller に変更する

タイトルに書かれているように個人のKubernetes クラスタで使用していた「ALB Ingress Controller」を「AWS Load Balancer Controller」に変更してさらに「Istio Ingress Gateway」を導入したので、それを書いていきます。

変更前の構成

外部からトラッフィックを受けるサービスが1つ(+色々)稼働しており、このサービスは ALB Ingress Controller を使って作成された ALB からトラフィックを受けています。
また Route53 は Ingress resource にある host を External DNS が参照してDNS レコードを登録してドメインと ALB を紐づけていました。

f:id:hatappi1225:20201231173400p:plain

なぜこの構成を変更しようと思ったか

1番の理由は今稼働しているサービスとは別のサービスを作ったのでそれをデプロイしたかったからです。
もちろん ALB Ingress Controller を使い続けても運用は開始できます。

ただ各サービスは別々の namespace で動いており、それぞれに Ingress を作ってしまうと2つの ALB ができてしまいます。
コストは可能な限り抑えたいです。

そこで ALB Ingress Controller の後継の AWS Load Balancer Controller をみるとグルーピング機能があることが分かったのでこれを使用してみることにしました。

github.com

変更後の構成

変更前と比べて大きく変わったところが3つあります。

  1. 前述したサービスが1つ増えています
    • Argo は構成変更前からいれていたのですが、kubectl port-forward で毎回接続していました。今回複数のドメインが紐づけられるようになったので ALB に紐づけて外部からアクセスできるようになったので図に載せました
  2. ALB からのトラフィックは各サービスの NodePort Service ではなくまず Istio Ingress Gateway に入り、その後 Istio Ingress Gateway が VirtualService を通して各サービスにトラフィックを流すようになりました
  3. ALB, Route53 は Terrafrom で管理する
    • Istio Ingress Gateway と ALB は AWS Load Balancer Controller の TargetGroupBinding を使って紐づけてます。

f:id:hatappi1225:20201231165451p:plain

なぜこの構成になったのか

構成を変更するキッカケの部分では ALB Ingress Controller から AWS Load Balancer Controller に変更してグルーピング機能を使うだけでしたが、変更前後の図を見てわかるように結構構成が変わっています。

変わっている部分は多く分けると ALB, Route53 が Terraform 管理になっている部分と Istio Ingress Gateway がある部分なので、それぞれなぜそうなったのかを書いていきます。

ALB, Route53 を Terraform で管理する

ALB Ingress Controller から AWS Load Balancer Controllerに変更するにあたってドキュメントを読んでいました。
その時下記の TargetGroupBinding という機能をみつけました。

kubernetes-sigs.github.io

This will allow you to provision the load balancer infrastructure completely outside of Kubernetes but still manage the targets with Kubernetes Service.

これはドキュメントに書かれているように TargetGroupBinding を使用すると ALB のリソースを自分で管理しつつ AWS Load Balancer Controller は k8s の Service と ALB の TargetGroup の紐づけだけを行います。

元々 AWS の他のリソース (RDSとかACM, etc...) は Terraform で管理していたので、k8s 側のライフサイクルから外れて Terraform 管理できるようになるのは魅力的でした。
さらに ALB だけでなく Route53 も Terraform で管理できるようになるので、ExternalDNSも使用しなくてよくなるのも嬉しいポイントでした。

ALB Ingress Controller から AWS Load Balancer Controller に変更するのは下記のドキュメントにもあるのですが、そこまで大変ではなくて簡単にいうと古いの消して新しいの入れるだけでした。
AWS Load Balancer Controller は Helm を使ってインストールしました。

kubernetes-sigs.github.io

Istio Ingress Gateway

istio.io

これは完全な趣味です。

最後に

Istio で遊べる環境ができたのは嬉しいので今後色々試していきたい!