Kubecost の使用
Kubecost は、Kubernetes 環境におけるコストとリソース効率の可視化を提供します。 概要として、Amazon EKS のコストモニタリングは、オープンソースのモニタリングシステムおよび時系列データベースである Prometheus を含む Kubecost によってデプロイされます。 Kubecost は Prometheus からメトリクスを読み取り、コスト配分の計算を実行し、その結果を Prometheus に書き戻します。 最後に、Kubecost フロントエンドが Prometheus からメトリクスを読み取り、Kubecost ユーザーインターフェース (UI) に表示します。 アーキテクチャは以下の図のとおりです:

Kubecost を使用する理由
お客様がアプリケーションをモダナイズし、Amazon EKS を使用してワークロードをデプロイする際、アプリケーションの実行に必要なコンピューティングリソースを統合することで効率性を獲得できます。 しかし、この利用効率の向上は、アプリケーションコストの測定が難しくなるというトレードオフを伴います。 現在、テナントごとのコスト配分には以下のいずれかの方法を使用できます:
- ハードマルチテナンシー — 専用の AWS アカウントで個別の EKS クラスターを実行します。
- ソフトマルチテナンシー — 共有 EKS クラスター内で複数のノードグループを実行します。
- 消費ベースの課金 — 共有 EKS クラスター内のリソース消費量に基づいてコストを計算します。
ハードマルチテナンシーでは、ワークロードは個別の EKS クラスターにデプロイされ、各テナントの支出を判断するためのレポートを実行することなく、クラスターとその依存関係のコストを特定できます。 ソフトマルチテナンシーでは、Node Selectors や Node Affinity などの Kubernetes の機能を使用して、Kubernetes Scheduler にテナントのワークロードを専用のノードグループで実行するよう指示できます。 ノードグループ内の EC2 インスタンスに識別子(製品名やチーム名など)でタグを付け、タグ を使用してコストを配分できます。 上記 2 つのアプローチの欠点は、未使用のキャパシティが発生する可能性があり、密にパックされたクラスターを実行した場合のコスト削減効果を十分に活用できない可能性があることです。 また、Elastic Load Balancing やネットワーク転送料金などの共有リソースのコストを配分する方法も必要です。
マルチテナント Kubernetes クラスターでコストを追跡する最も効率的な方法は、ワークロードが消費したリソースの量に基づいて発生したコストを配分することです。 このパターンでは、異なるワークロードがノードを共有できるため、ノード上の Pod 密度を高めることができ、EC2 インスタンスの使用率を最大化できます。 しかし、ワークロードや名前空間ごとのコストを計算することは困難な作業です。 ワークロードのコスト責任を理解するには、一定期間に消費または予約されたすべてのリソースを集計し、リソースのコストと使用期間に基づいて料金を評価する必要があります。 これが Kubecost が取り組んでいる課題です。
Kubecost のハンズオン体験をするには、One Observability Workshop をご覧ください。
推奨事項
コスト配分
Kubecost のコスト配分ダッシュボードでは、名前空間、k8s ラベル、サービスなど、すべてのネイティブな Kubernetes の概念に対する配分された支出と最適化の機会を素早く確認できます。 また、チーム、製品/プロジェクト、部門、環境などの組織の概念にコストを配分することもできます。 日付範囲やフィルターを変更して、特定のワークロードに関するインサイトを導き出し、レポートを保存することができます。 Kubernetes のコストを最適化するには、効率性とクラスターのアイドルコストに注意を払う必要があります。

効率性
Pod のリソース効率は、一定の時 間枠におけるリソースの使用量とリソースのリクエスト量の比率として定義されます。
これはコストで重み付けされ、以下のように表現できます:
(((CPU Usage / CPU Requested) * CPU Cost) + ((RAM Usage / RAM Requested) * RAM Cost)) / (RAM Cost + CPU Cost)
ここで、CPU Usage = 時間枠における rate(container_cpu_usage_seconds_total)、RAM Usage = 時間枠における avg(container_memory_working_set_bytes) です。
AWS では明示的な RAM、CPU、GPU の価格は提供されていないため、Kubecost モデルは提供された CPU、GPU、RAM の基本価格の比率を使用します。
これらのパラメータのデフォルト値はクラウドプロバイダーの限界リソースレートに基づいていますが、Kubecost 内でカスタマイズすることができます。
これらの基本リソース(RAM/CPU/GPU)の価格は、プロバイダーの課金レートに基づいて、各コンポーネントの合計がプロビジョニングされたノードの総価格と等しくなるように正規化されます。
最大効率を目指し、ワークロードを微調整してゴールを達成することは、各サービスチームの責任です。