GKEのAutopilotモードを使ってのコストカット
こんばんは、フリューのジョンです。
GKEなにもわからないと言い続けて1年を軽く過ぎましたが、まだ何もわかりません。ずっと手探りです。
新規事業としてGKE(Google Kubernetes Engine)を触ってきて、円安などの背景もあり、コストなどが気になってきました。地道に、コストカットできないかをいろいろ調べておりましたが、今回はその際に、Spot Podに出会い、実際にやってコストカットができたと言うことを、紹介します。
GCPからの紹介としては https://cloud.google.com/blog/ja/products/containers-kubernetes/announcing-spot-pods-for-gke-autopilot になりますので、詳しくはこちらを参考にしてください。
環境
GKE 1.21.4以降
いきなりの結果
ひとまずGKEについてのコストのグラフを載せます。具体的な数値は載せられないですが、青い部分がCPUの部分の値段になります。入れ始めて、およそ半分ぐらいのコストカットができるというのがおわかりになったかと思います。
そもそも、GKE Autopilotって?
従来のGKE(Kubernetes)では、ノードの管理をしておく必要がありましたが、Autopilotでは、ノードを気にする必要がありません。そのため、設定ファイルのみの管理になり、インフラを意識せずにシステムを作ることができます。
いや、spotって何?
GCPのcomputeリソースが値引きされるインスタンスのオプションになります。GCPの説明としては https://cloud.google.com/spot-vms?hl=ja になります。
制限としては、インスタンスの起動が最大1日であるというものです。
これは裏を返すと死活監視をして、アプリケーションを新しく建てるということを続けていれば、とても安くシステムを構築することができます。そして、GKEは、基本アプリケーションの死活監視とノードの監視もしてくれます。
ですが、GKE Autopilotの場合はノードの設定はできません。どうすればいいでしょうか? 実はpodに対して設定することができます。
どうやってやるの?
先程も述べたとおりpodに対して設定をするだけです。弊社のシステムではDeploymentに設定しています。
apiVersion: apps/v1 kind: Deployment spec: template: spec: nodeSelector: cloud.google.com/gke-spot: "true"
デメリットは?
これも先程述べたとおり「インスタンスの起動が最大1日である」ということです。ただ、いきなり再起動されると困る場合も多いと思います。
それを解消するために、terminationGracePeriodSeconds
の設定を使う事ができます。
これを使うと、停止時にコンテナはSIGTERM シグナルを受け取り、終了まで少しの猶予を持つことができます。そのため、SIGTERM シグナルを受け取り再起動できるようにコンテナを設計してください。
以下の例だと、強制的な終了まで25秒の猶予が与えられます。
apiVersion: apps/v1 kind: Deployment spec: template: spec: terminationGracePeriodSeconds: 25
最後に
GKE Autopilotは本当に便利だと思います。statelessなアプリケーションであれば、使わない手は無いです。
急激な円安に負けずにコストカットを地道にやって、GCP使っていきましょう!