💰

開発環境の 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 の運用コストを効果的に削減することが可能です。
ぜひこれらのテクニックを活用してみてください!

Discussion