Kubernetesのコスト推測はやめよう:Kubecost実践ガイド

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

Kubernetesの課金というブラックボックス

Kubernetes上でマイクロサービスを運用することは、スケーラビリティの面では大きなメリットですが、財務部門にとっては頭の痛い問題になることがよくあります。AWS、GCP、Azureを利用している場合、毎月の請求書にはEC2やVMインスタンスの総額が表示されます。しかし問題は、クラウドプロバイダーはクラスターの内部で何が起きているかまでは把握していないということです。1つのクラスターに対して5,000ドルの請求が来ていても、具体的にどのチームやマイクロサービスがその予算を消費したのかを特定することはできません。

私は、DevOpsチームがコストを正当化するために、毎月何時間もかけてスプレッドシートを手作業で照合している姿を見てきました。1つのノードが5つの異なるプロジェクトからなる20個のPodをホストしていることも珍しくないため、標準的なクラウドタグでは対応できません。粒度の高い可視化ができなければ、誰もリソースの無駄に責任を持たない「予算の推測ゲーム」に陥ってしまいます。Kubecostは、インフラのコストをネームスペース、デプロイメント、ラベルといったKubernetes特有の概念に直接マッピングすることで,この問題を解決します。

コアコンセプト:コストをPodに紐付ける

Kubecostは単に推測するだけではありません。クラウドプロバイダーからリアルタイムの価格データを取得し、それをPrometheusからのリソース使用状況メトリクスと統合します。そして、リクエストしたリソース量と実際に使用したリソース量の差を分析します。

コスト配分の4つの柱

支出の全体像を把握するために、Kubecostはコストを主に4つのバケットに分類します。

  • Compute(コンピューティング): コンテナに割り当てられたCPUとRAMのコスト。
  • Storage(ストレージ): 高性能なSSD層を含む、Persistent Volume Claims (PVC) に関連する支出。
  • Network(ネットワーク): ゾーン間、リージョン間、およびパブリックインターネット間のデータ転送。これは、気づかないうちに発生していたリージョン間トラフィックで1,200ドルの請求が来るなど、「予期せぬ」コストが隠れがちな場所です。
  • Efficiency Score(効率性スコア): 実際のリソース使用量とリクエスト量の比率。たとえば、8GBのRAMをリクエストしているのにアプリが500MBしか使用していない場合、Kubecostはそれを93%の「無駄な支出」としてフラグを立てます。

これらのコストは即座に集約して表示できます。マルチテナントクラスターでNamespace(ネームスペース)ごとの支出を確認したい場合でも、特定のDeploymentが予算を圧迫していないかController(コントローラー)ごとに確認したい場合でも、クリック一つでデータにアクセスできます。

実践:Kubecostのデプロイ

Kubecostのインストールは5分で完了します。PrometheusとGrafanaが同梱されており、手動設定の手間が省けるため、Helmチャートの使用をお勧めします。

1. 準備

kubectlのコンテキストが正しいクラスターに設定されていることを確認してください。デプロイを管理するために、ローカルにHelmがインストールされている必要があります。

# Kubecostリポジトリを追加
helm repo add kubecost https://kubecost.github.io/cost-analyzer/
helm repo update

2. インストールコマンド

クラスターを整理された状態に保つため、専用のkubecostネームスペースを使用します。EKSやGKEを使用している場合、Kubecostはクラウドプロバイダーの課金APIを介してノードの価格を自動的に検出します。

# ネームスペースを作成
kubectl create namespace kubecost

# アナライザーをインストール
helm install kubecost kubecost/cost-analyzer \
    --namespace kubecost \
    --set kubecostToken="Ym9ncy5idW5ueUBleGFtcGxlLmNvbQ=="

注:トークンは無料枠では任意ですが、追加のコミュニティ機能やアップデートを利用できるようになります。

3. ダッシュボードの表示

Podが初期化されるまで約2分待ちます。複雑なIngressルールやLoadBalancerを設定しなくても、ポートフォワーディングを使用してすぐにUIにアクセスできます。

kubectl port-forward --namespace kubecost deployment/kubecost-cost-analyzer 9090

ブラウザでhttp://localhost:9090にアクセスしてください。ある本番環境では、このダッシュボードのおかげで、ロギング用のサイドカーのメモリリークが原因で月額400ドルを浪費していたステージング環境のネームスペースを発見できました。数ヶ月放置することなく、わずか数分で特定できたのです。

4. クイックウィン(即効性のある改善点)を見つける

データが表示されたら、「Savings」タブを確認しましょう。Kubecostは、以下のような「すぐに着手できる改善点」を探し出してくれます。

  • ライトサイジング(最適化): 過去7日間の履歴データに基づき、CPUリクエストを2.0から0.5に下げるよう提案してくれる場合があります。
  • 放置されたワークロード: 何日もネットワークリクエストを1件も受けていないにもかかわらず、リソースを消費し続けているPodを特定します。
  • スポットインスタンス: 非クリティカルな開発用ワークロードをプリエンプティブルノード(スポットインスタンス)に移行した場合に、どれだけ節約できるかを計算します。

高度な設定:実際のクラウド請求データとの連携

公開されている定価で支払っているケースは稀です。100%の精度を得るには、KubecostをAWSのコストと使用状況レポート(CUR)やGCPの課金エクスポートに連携させる必要があります。これにより、企業固有の割引やリザーブドインスタンスを考慮した算出が可能になります。

設定には通常、cloud-integration.jsonというシークレットの作成が含まれます。以下は標準的なAWSのテンプレートです。

{
    "aws": {
        "athenaBucketName": "billing-data-prod",
        "athenaRegion": "us-east-1",
        "athenaDatabase": "athenacurdb",
        "athenaTable": "k8s_usage",
        "projectID": "123456789012"
    }
}

このデータを統合することで、Kubecostは単なる監視ツールから「財務上の信頼できる唯一の情報源(Source of Truth)」へと進化します。CFOに提示する数字と、月末の実際の銀行振込額が一致することを保証できるのです。

まとめ:FinOps文化の構築

Kubernetesのコスト管理は、単に予算を削ることだけが目的ではありません。インフラの投資対効果(ROI)を理解することが重要です。特定の機能の運用に月額200ドルかかっていることをステークホルダーに示すことができれば、議論は「なぜ請求額が高いのか?」から「この機能にはそのコストに見合う価値があるか?」へと変わります。

可視化は、責任ある運用の第一歩です。まずは毎週の効率性レポートをチェックすることから始めましょう。リソースリクエストにいくつかの小さな調整を加えるだけで、インストールに費やした時間の10倍以上のリターンが得られるはずです。まだPodレベルのコストを確認していないのであれば、今すぐHelmでのインストールを試してみてください。クラスターの中に何が隠れているか、驚くことになるかもしれません。

Share: