TerraformでSpotVMが作成できるようになっていたので試してみる


はじめに

株式会社イエソドでインフラ管理を担当しています@Omasumasuです。

2021 年の 10 月ごろに発表された GCP のSpot VMですが、v4.3.0 の terraform-provider-google で対応しました!

弊社では GKE 環境にてアプリケーションを動作しているのですが、検証環境や開発環境用のクラスターではコストの関係上 preemptible ノードにアプリケーションのワークロードは優先的に配置するように設定をしていました。Spot VM がリリースされた後に preemptible ノードをすぐに Spot VM に置き換えたかったのですが、Terraform で GCP 上のリソースを管理しているため導入は見送っていました。
今回のリリースによって Spot VM を Terraform 上で組み込めるようになったので早速開発環境の GKE クラスターに Spot VM を組み込んでみました。

設定方法

Spot VM はまだ Beta 機能のためgoogle-beta providerが必要になるのでそちらの準備は事前に行ってください

まずは、provider.tfrequired_providers配下の google のバージョンを 4.13.0(執筆時最新)に書き換えてください

...

terraform {
...
  required_providers {
    google = {
      version = "~> 4.13.0"
    }
  }
}

そしてterraform init -upgradeを実行して最新版に更新をします
バージョン更新によって GCP の各サービスの設定値や設定方法が若干変わっているところがあるので、まずはterraform planを実行して差分が出なくなるまで各ファイルや変数ファイルの設定をしてください
あとはgoogle_container_clustergoogle_container_node_poolリソースのnode_configを書き換えてあげることで Spot VM の作成ができます。

resource "google_container_node_pool" "sample" {
  provider   = "google-beta"
  project    = var.project
...


  node_config {
    preemptible  = false
    spot = true
...

}

設定は簡単でこれだけです。
設定ができれば通常通りterraform applyを実行すれば spot インスタンスが生成されます。

GKE 上で Spot VM が正常に作成されたかどうかを確認するにはkubectl describe nodesで Node の Label にcloud.google.com/gke-spot=trueがあるかどうかを見てあげることで確認できます。

$ kubectl describe nodes XXXX
Name:               XXXX
Roles:              XXXX
Labels:             ...
                    cloud.google.com/gke-spot=true
...

思ったよりも簡単に作成することができました。
Spot VM は現状 Beta ですが、弊社環境では現状問題なく動作しています。

株式会社イエソドはエンジニアを募集しています

https://www.wantedly.com/projects/700440

https://www.wantedly.com/projects/700448