Cloud Ace Tech Blog
💰

開発環境の Autopilot GKE のコストを削減する方法

こんにちは!クラウドエースの kazz です。
この記事では、開発環境において Autopilot モードの Google Kubernetes Engine (以下、GKE) のコストを削減する方法について紹介します。

TL;DR

  • 止まっても問題のない Pod を Spot VM に移行することで、Pod にかかるリソースコストを最大 91% 削減できる
  • 作業時間外の夜間や休日は Pod を停止することで、課金を抑えられる

Autopilot モードの GKE のコスト

Autopilot モードの GKE は、大きく分けて以下の 2 つのコストがかかります。

  • クラスタ管理費
  • ワークロードにかかるコスト

https://cloud.google.com/kubernetes-engine/pricing

クラスタ管理費

クラスタ管理費用は、コントロールプレーンの維持にかかる費用で、1 クラスタあたり $0.10/時間で課金されます。
請求先アカウントごとに毎月 $74.40 の無料クレジットが提供されるため、毎月 1 クラスタは無料で運用できます。

ワークロードにかかるコスト

Pod や PersistentVolume など、クラスタ上で稼働するワークロードに対して発生する費用です。
この記事では、主に Pod のコンピューティングリソース(vCPU, メモリ, エフェメラルストレージ)にかかる費用を削減する方法を解説します。

Spot VMで Pod にかかるリソースコストを下げよう

GKE では Spot VM を利用することができます。

https://cloud.google.com/compute/docs/instances/spot

Spot VM は、標準の VM よりも大幅に低料金で利用できる、可用性を保証しない Compute Engine の VM です。

Google Cloud のリソースが不足した場合、Spot VM はプリエンプト(強制的に停止)される可能性があります。

そのため、本番環境での利用は推奨されませんが、開発環境のような可用性が厳しく問われない、システムが止まっても問題がないような場面では、Spot VM を活用することでコストを大幅に削減できます。

実装

マニフェストに以下のように nodeSelectorcloud.google.com/gke-spot: "true" を設定するだけで、Pod を Spot VM 上で実行できます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        cloud.google.com/gke-spot: "true"
      containers:
      - name: nginx
        image: nginx

どれくらいコストが削減できるのか

コスト削減例として、筆者チームの環境を例に挙げます。
以前は、約 4CPU・10GiB メモリを通常の Pod で運用していました。そのうち、停止しても影響の少ない約 3.5CPU・9GiB 分の Pod を Spot VM へ移行したところ、コストを大幅に削減できました。
結果として費用を半額以下に抑えることができており、Spot VM の効果を実感できます。

image01

作業していない夜間や休日は Pod を停止しよう

データベースのようなステートフルなアプリケーションをホストしている場合を除き、作業時間外は Pod を停止することでコストを節約できます。
多くの場合、開発環境は夜間や休日に利用されないため、この方法は効果的でしょう。

Pod を停止する方法はいくつか考えられますが、今回は Cloud Build と Cloud Scheduler を使用して、 Deployment のレプリカ数を 0 にすることで、指定した時間に Pod を停止・起動する方法を紹介します。

実装

kubectl scale コマンドで Deployment のレプリカ数を0にしたり、元の数に戻したりする手動実行のトリガーを作成します。
以下にビルドファイルの例を示します。

steps:
  - name: gcr.io/google.com/cloudsdktool/cloud-sdk
    args:
      - container
      - clusters
      - get-credentials
      - my-cluster
      - '--location=asia-northeast1'
    entrypoint: gcloud
  - name: gcr.io/google.com/cloudsdktool/cloud-sdk
    args:
      - scale
      - deployment
      - my-deployment
      - '--replicas=0' #起動する場合は1以上にする
    entrypoint: kubectl
options:
  logging: CLOUD_LOGGING_ONLY

作成したトリガーを Cloud Scheduler で指定した時間に実行するように設定します。
トリガーの編集画面を開くと、上部に「スケジュールで実行」というボタンがあるので、これをクリックして cron 形式でスケジュールを設定します。

image02

これで、指定した時間に Pod が自動的に停止・起動するようになります。
今回は GKE 上の Pod のみを停止・起動していますが、Cloud SQL などの他のリソースを使用している場合は、同様に停止することでよりコストを削減できると思います。

まとめ

Cloud Run のようなサーバーレス環境と比較すると、GKE は柔軟性や安定性が高い一方でコストも高くなる傾向があります。
しかし、今回紹介したような工夫を取り入れることで、GKE の運用コストを効果的に削減することが可能です。
ぜひこれらのテクニックを活用してみてください!

Cloud Ace Tech Blog
Cloud Ace Tech Blog

Discussion