EKSからkopsで構築したKubernetesクラスタに乗り換えた

Anket は今まで EKS を使って Kubernetes を運用してきました。

blog.hatappi.me

EKS を使って運用し始めたのが4ヶ月くらいですが、今回 kops で構築した Kubernetes (k8s) クラスタに乗り換えました。
このエントリではなぜ乗り換えたかなどを書いていこうと思います。
kops とは何かなどを説明する前になぜ乗り換えたのかを説明したいと思います。

なぜ EKS をやめたのか?

とてもシンプルで 高いから です。
正確には僕のケースの場合には高く感じたというところです。

EKS の料金はシンプルで 1 時間あたり 0.20 USD の料金が発生します。
aws.amazon.com

つまり (0.2 USD * 24h) * 30d = 144 USD となりだいたい16000円になります。
EKS自体は時間で課金されるので 数 pod 規模のアプリケーションでも数百 pod の規模のアプリケーションでも1つのクラスターで運用していればEKSの料金は変わりません。

EKS は コントロールプレーンの管理が不要だったりAWSによって自動Security Patchがあたったりと便利です。
事実4ヶ月このあたりを意識せずにアプリケーションの開発に集中できました。
そのためこのコストを払えば恩恵をうけられるので安い!!と思うかもしれません。

しかし Anket は 2node で apibot がそれぞれ 2pod で運用されています。
僕のケースだと月の半分くらいがEKSのコストだったので、わりに合わないのではと考え移行を検討しました。

EKS の移行先は??

移行先としては次の二つを考えました。

今回は後者の自分でクラスタを構築・運用するほうを選んだのですがその理由は二つあります。

  1. コスト
  2. 移行しやすさ

コスト

GKE は GCP が提供するマネージド Kubernetes です。
しかも今は何ノードでもEKSのような管理コストはかかりません。
昔は6ノード以上は管理コストがかかってたみたいです

GKE は Google Compute Engine のインスタンスをノードとして扱うので、このインスタンスの料金がかかります。
これは EKS も EC2 をノードとして扱う時 EC2 の料金はかかるので一緒ですね。

https://cloud.google.com/products/calculator/#id=e4b0839f-4b0f-404c-a759-0aadec408ab3
ざっくり見積もってみましたが今よりは安くなりそうでした。

自前で構築しようと思うと 今の 2node とは別に master node が最低1台必要になるので、その料金がかかります。
とはいえ EKS を使い続けるよりはやすそうです。

移行しやすさ

移行前の構成はこんな感じでした。
f:id:hatappi1225:20190505221535p:plain

これを見るとわかるように EKS 以外にも Rails API の DB として Amazon Aurora MySQL を利用していて Bot から Redis (ElasticCache) を利用しています。
AWS でそのまま利用するのであれば良いですが、 ElasticCache は VPC 外からアクセスできない?等のため GKE を使うために GCP を使うとなるとデータ移行が発生します。
GEK を使えばマネージドを使いつつも今よりも安く運用できますが、データ移行やネットワークを再設計したりとちょっと面倒そうです。。。。

自分でクラスタを構築・運用することにしました

コストと移行のしやすさの両方を見て自分でクラスタを組むことにしました。

1つきになるとすればマネージドでなくて良いのか問題があります。
これは選定の後付けですがもともと勉強目的で Kubernetes を使い始めたのでコントロールプレーンを自分で管理するか!と思ったのも自分で構築する後押しをしてくれました。

kops を選んだ理由

自前でクラスタを作るとなった時に kopskube-aws などが選択肢としてあがります。
kops を使うことにしたのは kubernetes リポジトリ配下で提供されている安心さと Terraform で構築することができる点で選びました。

現在 Anket は VPC や IAM や SecurityGroup などの各種リソースを Terraform で管理しているので Kubernetes も Terraform で管理できれば統一感出て良さそう!!

kops と 既存VPC の共存

kops は AWS 上に VPC から AutoScalingGroup など kubectl get ~~ するのに必要なものを作ってくれます。
参考: https://github.com/kubernetes/kops/blob/master/docs/aws.md

しかし今回は既に VPC が存在するのでこの VPC 内にクラスタを構築したいです。
kops はこういったケースにも対応していてドキュメント もあります。

このドキュメントを見るとわかるように kops で使うYAMLファイルに VPC ID や subnet ID などを指定していきます。
Anket は VPC を Terraform で構築しているので、 terraform output したものを良い感じにわたせると良さそうです。

どうやるのが良いかなぁーと考えていたらまさに同じことをした人の記事を見つけました。

medium.com

記事中にも書いてありますが流れとしては

  1. 自分で用意したVPCなどを構築する Terraform を apply
  2. output values を使って VPC ID や subnet idを terraform output した時に出力できるようにする。
  3. kopsにはテンプレートに値を埋め込む kops toolbox template が用意されているので terraform output した値を渡して kops 用の YAML ファイルを出力する。
  4. YAMLファイルを使って Kubernetes 用のtfファイルを出力して terraform apply !!

良さそうな感じです。

出来上がったもの

最終的にこんな感じのものが出来上がりました。
f:id:hatappi1225:20190506105604p:plain

CNI には EKS でも使われている amazon-vpc-cni-k8s を使いました。

クラスタやRDSなど各種サービスはすべて Private subnet の中にいれて Kubernetes 運用時に使う kubectl が使用する API や Anket に必要な API などは LB 経由でアクセスするようにしました。
Private subnet は外にでるためには Nat が必要で Nat Gateway を元々使っていたのですが、時間と処理データに課金されるNat Gatewayは時間のほうは 1時間 0.062 USD なので1ヶ月で4, 5千くらいになるのでこれもばかにならなかったので、今回 Nat instanceにしてコストを抑えるようにしてみました。

結果コストはどのくらい下がったのか?

まだ1ヶ月たってないので、最終的な結果は出てないですが試算したところ

+/-
今までの月々のコスト $382
EKSの削除 -$144
master node用のインスタンス (t2.micro) +$11
nat gateway 削除 -$45
nat instance 追加 (t3.nano) +$5

$209 !!!!

半分近くまで安くなりそう!!!

最後に

今までは EKS の更新情報を追ってましたがこれからは Kubernetes 自体の情報を追っていきつつ、最新のバージョンが出たら自分でバージョンアップしたりと面白そう〜