EKS上でKubecostの検証
初めまして、今回 RECRUIT Job for Student 2022 Autumn Engineer に参加させていただいていた@masaki12-sです。 私は本アルバイトでスタディサプリ小中高のSREチームに配属され、Kubecostと呼ばれるツールの調査を行いました。本記事ではEKS上でのKubecostの導入から調査の結果を軽くまとめています。
本記事での貢献
- EKS上へのKubecostの導入方法(Cost&Usage Report統合は未完了)
- Kubecostの概要や詳細についての説明
調査のきっかけ
スタディサプリ小中高では複数のマイクロサービスで構成されていて、各チームがそれぞれマイクロサービスを開発運用しています。 開発運用をしていく中で各チームがマイクロサービスにかかるコストを把握することができれば、どの部分でコストが発生しているのかを特定しマイクロサービス運用コストの改善につなげることができます。 そのためにはKubernetesで運用しているマイクロサービスのコストをチーム単位に集計できる構造が必要になってきます。そこでKubecostと呼ばれるツールを導入することにより、マイクロサービスごとにかかるコストの監視ができるのか調査しました。
Kubecostとは
Kubecostは2019年に公開されて、Kubernetesクラスターの運用にかかるコストをアプリケーション、プロジェクト、チーム単位に集計して監視することができるツールです。 Kubecostの主な機能として公式が提唱しているのが以下の4つです。
- コストの割り当て(Cost Allocation)
- Deployment、Service、Namespace等Kubernetesのリソースごとにコストを分類
- 総合的なコスト監視(Unified cost monitoring)
- 最適化(Optimization Insights)
- コストとパフォーマンスを考え、節約すべき箇所を提示
- アラートとガバナンス(Alerts & Governance)
- リアルタイムのアラートと定期的なレポートの発行でチームのインフラ制御に貢献
KubecostはKubernetesのクラスターからリアルタイムデータを収集して分析し、詳細なコストの内訳を正確に把握できます。 またKubecostはGCP、AWS、Azure等のクラウドサービスとも統合することができ、各クラウドサービスで使用しているアーキテクチャごとのコストを算出できます。 今回の調査ではAWSを使用していますが、AWSとKubecostは2022年8月に共同でコスト監視ツールを発表しました。そのためEKS上へのKubecostの導入やKubecostとAWSとの統合を楽に行うことができます。またKubecostを運用していく上でAWS側のサポートを受けることができます。
調査内容
今回の調査内容は以下の通りです。
- Kubecostの仕組み
- Kubecost運用にかかるコスト
本記事では上記の3点について調査できなかったことを含め記述します。
Kubecostの導入
調査の前にKubecostの導入手順を示します。KubecostをEKSのクラスター上にデプロイするためには、いくつか方法があります。 今回はAWS EKSのノード上にKubecostを導入するため、AWSのコストモニタリングの公式ページと同様の手順で進めていきます。
各種バージョン
- Kubernetesクラスターのバージョン:
1.23
- Kubecostのバージョン:
1.96.0
Kubecostのインストール
helm upgrade -i kubecost oci://public.ecr.aws/kubecost/cost-analyzer --version 1.96.0 \ --namespace kubecost --create-namespace \ -f https://raw.githubusercontent.com/kubecost/cost-analyzer-helm-chart/develop/cost-analyzer/values-eks-cost-monitoring.yaml
kubectl get pods -n kubecost
を実行して
kubecost-cost-analyzer
kubecost-kube-state-metrics
kubecost-prometheus-server
が作成されていて、STATUSがRunning
になっていれば成功です。
この段階でポートフォワーディングを行うことでフロントエンドのアプリケーションを見ることが可能になります。 以下のコマンドを実行した場合、127.0.0.1:9090でアクセスすることが可能です。
kubectl port-forward --namespace kubecost deployment/kubecost-cost-analyzer 9090
アクセスするとこんな感じのページが表示されます。
Kubecostでは以下のようにnodeやpod,name等の単位で各コストを監視することが可能です。またKubecost自体のコストも監視することが可能です。
またAWSのMarketplaceからデプロイすることも可能です。 細かい設定を調整したい場合は、helmを利用してカスタマイズすることも可能です。
しかしこの段階ではAWSでの正確なコストを可視化できているわけではありません。理由としてはAWSの詳細なデータを取り込んでいないためです。後述しますがKubecostではAWSの公開価格データとCost&Usage Report Data(以下CUR)を使用してコストを計算しています。しかしこの段階ではAWSの公開価格データのみを参照しています。 CURを参照するにはCUR統合を行う必要があります。 後述しますが、今回の調査ではCUR統合がうまくいかなかった部分があるため手順は割愛しますが、公式が示している手順はこちらを参考にしてください。 CUR統合を行うことでEC2やECSなどのAWSの各アーキテクチャごとにかかる料金も監視することが可能です。詳しくはこのページを参照してください。
他にできること
今回実践していない内容もありますが、Kubecostを使用してできることを示します。
- 複数クラスターの監視 今回は単一クラスターをコスト監視の対象としていましたが、複数のクラスターでのコスト監視も可能です。
- APIの使用 KubecostはAPIが提供されており、各APIを介してコストデータを含んだjsonデータを取得することが可能です。
Kubecostのしくみ
Kubecostのアーキテクチャは以下のような図になります。