現場データサイエンティスト奮闘記

とある企業で働くデータサイエンティストの日々のアウトプット

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個
  • プリエンプティブノードを有効にして少しでも安くする

f:id:kazuki_hykw:20190617130442p:plain

cronjob 用のノードは以下のように作成します。

  • マシンタイプは n1-standard-1
    • 処理に必要なマシンタイプを選んでください
  • 自動スケーリングをオンにして最小サイズを0にする
  • プリエンプティブノードを有効にして少しでも安くする
    • job実行時に不用意に失敗してほしくなければここは無効にしたほうがいいかもしれません。要件次第ですね。

f:id:kazuki_hykw:20190617130708p:plain

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 してあげれば完成です。
以上です!頑張って節約しましょう!

参考文献

qiita.com