CronJobで決まった時間のみにJob実行させたいときにはstartingDeadlineSecondsが必要


まとめ

  • CronJobがJobが生成出来ない場合(Masterがdownしていた,suspend=trueなど)にしていた場合、デフォルトではJobが生成出来るようになったときに再実行されてしまう。
  • しかし、深夜・早朝バッチなど実行してもよい時間帯が限定されているときにJobが実行されてしまうと困る。
  • Jobを実行が出来る時間帯の範囲指定が必要な場合にはstartingDeadlineSecondsを設定して、Jobを生成してもよい時間を限定する必要がある

実験

  • KubernetesのCronJobのサンプルを利用して実験します。

    • 環境はminikube v1.8.2,kubernetes v1.14を利用
  • application/job/cronjob.yaml


apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
  • 一分毎にechoをするCronJobです。

  • まずはapply

kubectl get cronjob
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        <none>          24s
  • JobとPodの実行状況を確認する
  • Job kubectl get job NAME COMPLETIONS DURATION AGE hello-1585028460 1/1 5s 70s hello-1585028520 1/1 4s 10s
  • Pod kubectl get po NAME READY STATUS RESTARTS AGE hello-1585028460-kw8lh 0/1 Completed 0 84s hello-1585028520-wqqc9 0/1 Completed 0 24s
  • 無事一分毎に実行されています。

  • Jobのsuspendをする。

  • CronJobではsuspendというパラメーターをfalseにすることで、CronJobの実行を一時止めることが出来ます。suspendを利用することでCronJobがJobを生成出来ない状態を再現します。

    kubectl patch cronjob hello -p '{"spec":{"suspend":true}}'
    cronjob.batch/hello patched

  • ここから待ってからsuspendをfalseに戻して、Jobが実行出来る状況に変更します。

  • 数分経過

kubectl get cronjob
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   True      0        4m              13m
  • suspend=falseにする。
kubectl patch cronjob hello -p '{"spec":{"suspend":false}}'
cronjob.batch/hello patched
  • jobの実行状況を確認
k get job
NAME               COMPLETIONS   DURATION   AGE
hello-1585108380   1/1           9s         70m # suspend=true前に作ったやつ
hello-1585112580   1/1           6s         6s  # suspend=falseにしたらすぐ実行される
  • startingDeadlineSeconds: 300 を追記します。

参考資料