EC2からEKSにシステムを載せ替えしている話
ファンズでSREをしているあらきです。
今日はEC2からEKSに絶賛載せ替えしている話を書きたいと思います。
Fundsは2019年1月にローンチして以来、EC2の上ですべてのアプリケーションを動かしていましたが、システムが大きくなってきたこと、柔軟に機能追加をしたいという要望の高まりもありコンテナ化を進めています。
EKSへの載せ替え自体は2020年4月頃から行っており現在に至るまでをつらつらと書いていきます。
EKSを選んだ理由
筆者はECSの経験はありましたが、当時はあまり設定の柔軟性がなく、また、新しいAMIイメージに載る新しいecs-agentの不具合を何度か踏んだことがあり、
ECSに移行するより、コミュニティが充実しているエコシステムのあるKubernetesの方を選びました。
EKS fargateについては、DaemonSetが動作しないこともあり、見送りました。
EKSに載せているシステム
現状だと、funds.jp, 管理画面、ETL、開発ツール、funds.jpサービスサイトに付随するサテライトなどを載せ替えしました。
コア機能やジョブシステムについてはまだEC2で稼働しているのでこれらも今後載せ替えて行く予定です。
採用しているツール
Kustomize Version 3を使用しています。弊社の場合は環境をQA, ステージング、本番と分けているため、Overlay する形で使っています。
ArgoRollout Podのデプロイを柔軟に配置してくれます。ただこちらとKustomizeを組み合わせるとDeploymentの設定が反映されないことがあるので、Kustomizeの良い部分が活かせないことがあります。
Appmesh サービス間の通信の手前に配置しています。デプロイの際に一時リクエストが受けられないPodなどがある時やリトライなどをアプリで対応していない場合などに重宝しています。今年の夏にGAになったので今後の機能追加に注目しています。
External Secrets System Manager, Secret Manager にあるシークレットを取ってきてくれるツールです。
fluentbit 各種ログをs3やCloudwatchに送るために使っています。以前はFirehose経由でしか送れず、そういう使い方をしていましたが、現在はs3に直接置くことができるようになり、こちらを使用しています。
amazon-k8s-node-drainer これはHelmで用意されているGoで書かれたものもありますが、Lambdaとしてクラスタとは別にしたかったのでこちらを使用しています。
Container Insights Datadogも使用していますが、こちらの方もPod, Appmesh, EC2 Nodeの状態がプルダウンで見やすいのでよく利用しています。
Kube bench セキュリティのベストプラクティスに沿っているか確かめるツールです。定期的に動かしています。Amazonの公式で提示しているセキュリティベストプラクティスはまとまって便利です。
大変だったこと
エコシステムの多いk8s、どのツールを使うかはかなり迷います。しかも都度検証が必要になります。
また、Terraform Cloudを使っていますが、EKSを作る際にエラーになったりします。
Issue:
直近であった現象としては、ノードのインスタンスサイズのメモリが80%程度になっていた時に `NotReady` と `Ready`の状態が変わるがわる不安定な状態になりました。こちらの原因としては、クラスタとノードのバージョン差異もありましたが、ノードのリソースに余裕を持たせたところ、そういった現象は納まりました。
今後も載せ替えていないアプリケーションに関しての載せ替えも随時やっていく予定です。