GKEでなるべく節約してcronjobを使う方法
概要
- cronjob をGKEで使っているけど、常に n1-standard 系のインスタンスが立っていると結構お高い
- しかし処理によっては g1-small などの貧弱なインスタンスでは足りないケースがある
- したがって cronjob のときだけパワーのあるマシンが使えるようにして最低限の課金で済ませたい
という状況に使えるアイディアです。
結論から言うとjobテンプレートに nodeSelector
を記載して、default node pool 以外のノードを指定する方式です。
クラスタ作成時に default node poolと cronjob 用の node pool を作成する
自分は default node pool は以下のように作っています。
- マシンタイプは g1-small
- f1-micro だとやたら不安定なのでおすすめしません
- サイズは最小の2個
- プリエンプティブノードを有効にして少しでも安くする
cronjob 用のノードは以下のように作成します。
- マシンタイプは n1-standard-1
- 処理に必要なマシンタイプを選んでください
- 自動スケーリングをオンにして最小サイズを0にする
- これで使ってないときは余計なインスタンスが立たないはずです
- プリエンプティブノードを有効にして少しでも安くする
- job実行時に不用意に失敗してほしくなければここは無効にしたほうがいいかもしれません。要件次第ですね。
jobテンプレートにて cronjob 用 node pool を指定する
今回自分は cronjob 用ノードに cronjob-pool
という名前をつけてあるので、yamlファイルのjobテンプレートで、以下のように nodeSelector
の部分に書いてあげます。
apiVersion: batch/v1beta1 kind: CronJob metadata: name: cronjob-hogehoge spec: schedule: '0 1 * * *' jobTemplate: spec: template: spec: containers: - image: gcr.io/YOUR-PROJECT/CRONJOB-IMAGE:TAG imagePullPolicy: IfNotPresent name: cronjob-hogehoge restartPolicy: OnFailure schedulerName: default-scheduler nodeSelector: cloud.google.com/gke-nodepool: cronjob-pool
これを cronjob.yaml
のような名前で保存して、 kubectl apply -f cronjob.yaml
してあげれば完成です。
以上です!頑張って節約しましょう!