Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

GKEコスト配分でクラウド支出を詳細に可視化する方法

By Matan BordoNov 15, 20237 min read

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

GKEコスト配分の概要と、そのデータをDoiT Cloud Intelligence™のコスト配分機能と組み合わせて、GKE支出を詳細に可視化する方法を解説します。

Kubernetes支出のコストを十分に可視化することの難しさは、Kubernetesの登場以来ずっと語られ続けてきた課題です。

動的なリソース割り当てとコンテナのライフサイクルの短さにより、特定のアプリケーションやサービスにコストを紐付けるのは簡単ではありません。さらに、複数のコンポーネント間でリソースが共有されているという事情も加わります。

それでも、効率的なリソース管理とコスト管理を実現するうえで、Kubernetesにおけるコストの可視化は欠かせません。

こうした課題を解消するため、Google Cloudは昨年末にGKEコスト配分をリリースし、クラスタコストの詳細な内訳を確認できるようにしました。

本記事では、GKEコスト配分の概要と、そのデータをDoiT Cloud Intelligenceのコスト配分機能と組み合わせて、GKE支出を詳細に把握する方法をご紹介します。

具体的には、架空のゲーム会社を例に、GKEコストを各ゲームに対応づけて整理し、共有コストをゲーム間で按分したうえで、各ゲームのコストが環境ごとにどのように分かれているかを把握する流れを解説します。

GKEコスト配分とは

GKEコスト配分は、クラスタの課金情報を取得する方法としてGoogle Cloudが推奨する方式です。前身のGKE使用量メータリングと比べ、GKE Cost Allocationを使えばクラスタコストをユーザーに割り当てる作業が格段にシンプルになり、クラスタやネームスペースのコストを他のGoogle Cloudサービスのコストと並べて確認できるようになります。これは使用量メータリングでは実現できなかったポイントです。Google Cloudは将来的に、GKE Usage MeteringをGKEコスト配分に置き換えていく方針を示しています。

GKEコスト配分の有効化はGKE使用量メータリングよりも非常にシンプルで、クラスタごとにgcloudコマンドを1つ実行するか、Google Cloudコンソールでチェックボックスをオンにするだけで完了します。有効化すると、クラスタ上で稼働するworkloadsのCPU、メモリ消費量、ディスクに関するメトリクスを含むBQデータセットが作成されます。

これにより、クラスタやネームスペース単位のコストはもちろん、GKEラベルが付与されたリソースの情報も簡単に確認できます。

GKE cost allocation disabled

Enable GKE Cost Allocation

GKE cost allocation enabled

クラスタでGKEコスト配分を有効化すると、次のような疑問に答えられるようになります。

  • クラスタコストのうち、どのテナントがどれくらいを占めているのか?
  • クラスタ外のコスト(CloudSQL、GCSなど)はクラスタ内のコストとどう関係しているのか?
  • バックエンドアプリケーションにいくらかかっているのか?

さらに、有効化するとクラスタとネームスペースの詳細な課金情報がDoiT Cloud Intelligenceにも連携され、より複雑なコスト配分を実行できるようになります。次のセクションでは、その具体例を見ていきましょう。

GKEコストをビジネス区分にマッピングする

コスト配分の第一歩は、コストを割り当てたいビジネス区分を定義することです。DoiT Cloud Intelligenceでは、これをAttributionsで実現します。Attributionsを使うと、クラウドリソースをまとめてグループ化し、配分したい形に合わせてコストを整理できます。

ここでは、ユーザーに複数のゲームを提供している架空のゲーム会社を想定してみましょう。

ゲームごと、さらにそれぞれのゲームが稼働する環境ごとに、リソースを配分したいケースが考えられます。

下の例では、自社のゲームのひとつ(アクションゲーム)に関連するGKEコストを、「action」という単語を含むネームスペースとして定義しています。正規表現を活用することで、今後新たに作成されるアクションゲーム関連のネームスペースのコストも自動的に取り込めるため、Attributionを手動で更新する必要がありません。

さらに、本番環境に関連するクラスタや、開発・ステージング・ベータの各環境のクラスタも個別に定義しています。下の例は、名前に「prod」を含むクラスタを正規表現で抽出し、本番クラスタとして定義したものです。

Prod clusters

ビジネス区分を整理する

次に、関連するAttributionsをAttribution Groupsにまとめます。Attribution Groupsを使えば、複数のAttributions間で共有コストを按分したり、あるAttributionsのセットを別のセットでブレイクダウンしたりできます。次のセクションでは、その両方を実演します。

下の例では、以下のAttributionsを含む「Games」Attribution Groupを作成しました。

  1. 架空のゲーム会社が運営する4つのゲーム
  2. クラスタ内の共有コストおよび未割り当てコスト。内訳は次のとおりです。
  3. kube:systemとkube:system-overhead: K8sのシステムコンポーネント/ネームスペース。(kube-systemがネームスペースで、Googleがそのオーバーヘッドを表す追加メトリクスを生成します)
  4. kube:unallocated: workloadsからもシステムオーバーヘッドからも要求されていないリソース。
  5. goog-k8s-unknown: 新しいCompute VMが起動した際やクラスタがスケールアップした際に、コスト配分でエラーが発生したケース(SKUを処理できなかった場合)です。
  6. goog-k8s-unsupported-sku: 既存ではあるものの、サポート対象外のSKU(例: E2インスタンス)
  7. クラスタ外の共有コスト: Kubernetes外でGoogle Cloud上で稼働しており、クラスタ上にデプロイされたアプリケーションから利用される、Kubernetes以外のリソースのコスト
  8. Cloud SQLやBigQueryなどのデータベース
  9. Google Cloud Storageなどのオブジェクトストレージ
  10. Pub/sub、Kafkaなどのメッセージキュー
  11. 上記のAttributionsで捕捉できないその他すべて

ゲーム以外のAttributionsも含めているのは、これらが共有コストであり、次のセクションでゲーム間に按分したいからです。

同様に、すべての環境に対するAttribution Groupも作成しました。

これは、共有コストをゲーム間で按分したあとに、各ゲームの環境ごとの支出額を把握したいためです。

クラスタ内・クラスタ外の共有コストを按分する

まず、ゲームと共有コストを含むAttribution Groupを確認するためのレポートを実行します。

そのために、以下の手順を実行します。

続いて、2つの共有コスト — クラスタ内の共有・未割り当てコストクラスタ外の共有コスト — をゲーム間で按分します。

これらのコストは、均等に分割する、各ゲームの支出額が総支出に占める比率に応じて按分する、または任意のカスタム値で分割するのいずれかから選択できます。

按分後は、各ゲームについて以下を確認できます。

  1. そのゲームの稼働コスト
  2. 共有・クラスタ内/未割り当てコストの按分額
  3. 共有・クラスタ外コストの按分額

見やすくするため、これら3つの項目を各ゲームのコストとしてひとつに集約します。

ゲームごとのコストを環境別にブレイクダウンする

これで、各ゲームの総コストが環境ごとにどう分かれているかを把握する準備が整いました。「GKE Environments」Attribution Groupをブレイクダウンに追加します。

下の図では、先ほど作成した各環境のAttributionsごとに各ゲームのコストがどう分かれているか、また未割り当てコストも確認できます。これらの未割り当てコストは、ここで使用しているAttribution Groups内の_いずれの_Attributionsでも捕捉されていないリソースです。

未割り当てコストを掘り下げて要因を特定し、必要に応じて既存のAttributionsを修正してそれらのリソースを取り込むことも可能です。

下の例では、「GKE Environments」Attribution Group内の未割り当てコストのみにフィルタをかけ、ブレイクダウンに「Service」を追加しています。

こうすることで、ラベル付け可能なサービスに含まれるラベル未付与のリソースや、本来_含まれるべき_なのにAttributionに含まれていないプロジェクトを特定できます。

下の例では、Attribution Groupsに含まれていないGCE、GCS、Cloud SQLのコストがあることが分かります。

さらにCompute Engineの未割り当てリソースに踏み込めば、どのリソースが含まれていないかを正確に特定できます。この情報をもとに、Attributionを修正してそれらのリソースを取り込むこともできます。

このようにして、未割り当てコストを減らし、GKE支出の可視性を高めていけます。

まとめ

従来、Kubernetes workloadsがクラウド請求全体に与える影響を把握するには、Cast AIKubecostといったツールに頼る必要がありました。

これらの製品はGKEコスト配分よりも高機能ですが、Google Cloudは主要ハイパースケーラーの中でもユニークで、コスト可視化機能の多くを標準で備えており、クラスタで簡単に有効化できます。

そして本記事で示したように、GKEコスト配分が提供するデータを活用すれば、コストの内訳をより透明に把握し、クラウド請求に関するより踏み込んだ問いにも答えられるようになります。

すでにGKEコスト配分を有効化されているDoiTのお客様は、ぜひ今日からDoiT Cloud Intelligenceでデータの分析を始めてみてください。まだお客様でない方も、K8sをはじめとする当社の製品やコンサルティングサービスについて詳しく知りたい場合は、お気軽にお問い合わせください