開発環境の Autopilot GKE のコストを削減する方法
こんにちは!クラウドエースの kazz です。
この記事では、開発環境において Autopilot モードの Google Kubernetes Engine (以下、GKE) のコストを削減する方法について紹介します。
TL;DR
- 止まっても問題のない Pod を Spot VM に移行することで、Pod にかかるリソースコストを最大 91% 削減できる
- 作業時間外の夜間や休日は Pod を停止することで、課金を抑えられる
Autopilot モードの GKE のコスト
Autopilot モードの GKE は、大きく分けて以下の 2 つのコストがかかります。
- クラスタ管理費
- ワークロードにかかるコスト
クラスタ管理費
クラスタ管理費用は、コントロールプレーンの維持にかかる費用で、1 クラスタあたり $0.10/時間で課金されます。
請求先アカウントごとに毎月 $74.40 の無料クレジットが提供されるため、毎月 1 クラスタは無料で運用できます。
ワークロードにかかるコスト
Pod や PersistentVolume など、クラスタ上で稼働するワークロードに対して発生する費用です。
この記事では、主に Pod のコンピューティングリソース(vCPU, メモリ, エフェメラルストレージ)にかかる費用を削減する方法を解説します。
Spot VMで Pod にかかるリソースコストを下げよう
GKE では Spot VM を利用することができます。
Spot VM は、標準の VM よりも大幅に低料金で利用できる、可用性を保証しない Compute Engine の VM です。
Google Cloud のリソースが不足した場合、Spot VM はプリエンプト(強制的に停止)される可能性があります。
そのため、本番環境での利用は推奨されませんが、開発環境のような可用性が厳しく問われない、システムが止まっても問題がないような場面では、Spot VM を活用することでコストを大幅に削減できます。
実装
マニフェストに以下のように nodeSelector
に cloud.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 の効果を実感できます。
作業していない夜間や休日は 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 形式でスケジュールを設定します。
これで、指定した時間に Pod が自動的に停止・起動するようになります。
今回は GKE 上の Pod のみを停止・起動していますが、Cloud SQL などの他のリソースを使用している場合は、同様に停止することでよりコストを削減できると思います。
まとめ
Cloud Run のようなサーバーレス環境と比較すると、GKE は柔軟性や安定性が高い一方でコストも高くなる傾向があります。
しかし、今回紹介したような工夫を取り入れることで、GKE の運用コストを効果的に削減することが可能です。
ぜひこれらのテクニックを活用してみてください!
Discussion