KubecostでAKS上のワークロードのコスト管理
この記事では、AKS(Azure Kubernetes Service)上で動くワークロードのコストを見える化・配賦する方法をざっくり紹介します。
クラウドを運用するとき、セキュリティと並んで「コスト管理」もとても大事です。
規模が大きくなると共通基盤と各業務ワークロードに分けて管理することが多く、
これをサブスクリプション単位で分けることでコストの集計も容易になります。
ただし、Kubernetes の場合は様相が異なります。
AKS などのクラスター上では名前空間やラベル、ノードプールの分離により複数の業務が共存することが可能です。
AKS クラスターやノードが異なるケースでは、Azure Cost Management で集計が可能ですが、
名前空間や Pod ラベルになるとそれが行えません。

モチベーション
Azure では、クラウドのコスト管理機能として Azure Cost Management[1] が提供されています。
これで、Azure Kubernetes Service (AKS) のコストを見てみましょう。

見ると、AKS (クラスター名 akslab1) とそれに紐づくノードプール (仮想マシン スケールセット) のコストは分かりますが、
やはりそれ以上の分解能はありません。
そのため、この記事では Kubernetes において稼働するワークロードのコストをどのようにはじき出すかという点を見てみます。
OpenCost / Kubecost
このトピックでよく出てくる名前は OpenCost と Kubecost です。
OpenCost は CNCF 管理の オープンソースソフトウェアで、Kubecost は OpenCost をベースに企業向け機能(アラートや予測、異常検出など)を足したもの、というイメージです。[2]
Azure 側にも OpenCost ベースのコスト分析アドオン[3]がありますが、
契約種別で使えない場合があるため、本記事では Helm で Kubecost を入れて試してみます。
"Kubernetes のコストを表示する" より抜粋
Kubernetes のコスト ビューは、次のサブスクリプション契約の種類でのみ使用できます。
- Enterprise Agreement
- Microsoft 顧客契約
Kubecost の導入
まずは、Azure に AKS クラスターをデプロイしましょう。
既に AKS クラスターを展開済みの方もいるかと思うのでデプロイ手順は折りたたんでおきます。
環境構築手順
それでは、Kubecost を AKS クラスターにデプロイしてみましょう。
Helm チャートで提供されていますので、Helm のインストール[4]がまだでしたら、
インストールしておきます。
Helm チャートを使って Kubecost を入れます。Helm が無ければ先にインストールしてください。
$ helm install kubecost cost-analyzer --repo https://kubecost.github.io/cost-analyzer/ --namespace kubecost --create-namespace
Pod が Ready になったら UI をローカルで見るために port‑forward します(例: http://localhost:9090)。
$ kubectl port-forward --namespace kubecost deployment/kubecost-cost-analyzer 9090
Pod が "Ready" になっているか確認します。
Kubecost は Prometheus からメトリックスを得てコスト分割を行っています。ビルトインで Prometheus と Grafana が展開されますが、
既存の Prometheus を利用することも可能[5]です。
$ kubectl get pods -n kubecost
NAME READY STATUS RESTARTS AGE
kubecost-cost-analyzer-5d679c857b-xjhg6 4/4 Running 0 2d4h
kubecost-forecasting-8cd68f7c5-6pm68 1/1 Running 0 2d4h
kubecost-grafana-5688b4fdb5-fbwft 2/2 Running 0 2d4h
kubecost-prometheus-server-6565bdcff4-xn57l 1/1 Running 0 2d4h
それでは Kubecost の Web インターフェースにアクセスします。
公開することも可能[6]ですが、ここでは kubectl port-foward にてローカルの Web ブラウザで http://localhost:9090 を開きます。
$ kubectl port-forward --namespace kubecost deployment/kubecost-cost-analyzer 9090

コスト割り当ての画面はこちら。
既定では名前空間 (Namespace) 毎に分類されています。

グルーピングの条件を例えばラベル毎に変更することも可能です。

アセット (Assets) では Kubernetes クラスターを構成するコンポーネント (仮想マシンスケールセット、ロードバランサーなど) 毎のコストの内訳が確認できます。

価格はどうやって取得しているのかというと、Azure の小売り価格 API[7] から取得していることが分かります。
$ kubectl logs kubecost-cost-analyzer-5d679c857b-n5xcz -n kubecost -f
...
27japaneast%27+and+armSkuName+eq+%27standard_d4ds_v4%27"
2025-08-22T08:43:20.269192099Z INF starting download retail price payload from "https://prices.azure.com/api/retail/prices?$skip=0¤cyCode='USD'&$filter=armRegionName+eq+%27japaneast%27+and+armSkuName+eq+%27standard_d4ds_v4%27"
さらに、節約 (Savings) のタブでは、各節約観点において月額辺りの節約予想額が見られます。
今のところ、AKS クラスターの機能サポートはありませんが、節約の推奨に従い、
クラスターのサイジングや、名前空間のターンダウンの自動化が Actions から設定可能です。

その他、予算管理や異常検出などの機能もありますので、
興味あれば、KubeCost のドキュメント[8] を参照してください。
Azure 上のコストとの統合
最後に、Azure 上のコストと KubeCost のコストを統合してみましょう。
先ほどのように Azure リソースの価格は小売価格 API で取得されています。
一方 Enterprise Agreement 契約などお客様において割引価格が適用されているケースもあるかと思います。
その内容を反映させなければ、Kubecost の内容が予想よりも高く出ているということがあり得ますので、
それを反映させる必要があります。
方法としては、1つあります。
従量課金プランでは検証には至りませんでしたが、前者の統合オプションの方では、
AKS 以外のコストも取り込め Kubecost でコストの配賦が可能なため、お薦めです。
- Cost Management のエクスポートしたデータ (Blob) と統合
- Azure Billing Rate Card API を利用
まとめ
Kubecost を使うことで、AKS クラスター上のワークロードのコストを確認してみました。
ご契約形態に依りますが、Azure Const Management で集約するということで、AKS のコスト分析アドオンがお薦めです。[9]
Discussion