[Kubernetes]CronJobの動作を確認する 1


はじめに

これまでJobの動作を確認してきましたが、今回からはCronJobの動作を確認してみたいと思います。
CronJobはその名の通り、スケジュールされた時間にJobを実行するリソースです。

CronJobはJobの上位概念で、Jobを管理します。DeploymentとReplicaSetの関係と同じですね。

CronJobの作成

yamlファイル

まずはyamlファイルを作成します。今回は以下のファイルを作成しました。

sampleCronJob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: sample-cronjob
spec:
  schedule: "*/1 * * * *" #cronと同じ書式で実行時間を指定
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: sample-cronjob
            image: centos:latest
            command:
            - sh
            - -c
            args:
            - date
          restartPolicy: Never
  • 「spec.schedule」にcronと同じ書式で「分、時、日、月、曜日」の順で実行時間を指定します。今回は毎分実行します。

  • 「spec.jobTemplate.spec」配下は、Jobのマニフェストと同じです。今回は特に指定していませんが、completionsなどのパラメータも設定することができます。このことからもCronJobがJobを制御していることがわかりますね。

作成

yamlファイルをapplyします。

$ kubectl apply -f sampleCronJob.yaml
cronjob.batch/sample-cronjob created

動作の確認

applyした直後だと、まだJobは作られていません。

$ kubectl get cronjobs
NAME             SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
sample-cronjob   */1 * * * *   False     0        <none>          6s
$ kubectl get job
No resources found in default namespace.

「kubectl get pod -w」と「kubectl get job -w」を別ターミナルで開きながら、1分待ちます。

$ kubectl get job -w
NAME                        COMPLETIONS   DURATION   AGE
sample-cronjob-1585228560   0/1                      0s
sample-cronjob-1585228560   0/1           0s         0s
sample-cronjob-1585228560   1/1           5s         5s
sample-cronjob-1585228620   0/1                      0s
sample-cronjob-1585228620   0/1           0s         0s
sample-cronjob-1585228620   1/1           5s         5s
sample-cronjob-1585228680   0/1                      0s
sample-cronjob-1585228680   0/1           0s         0s
sample-cronjob-1585228680   1/1           6s         6s
$ kubectl get pod -w
NAME                              READY   STATUS    RESTARTS   AGE
sample-cronjob-1585228560-qvttr   0/1     Pending   0          0s
sample-cronjob-1585228560-qvttr   0/1     Pending   0          0s
sample-cronjob-1585228560-qvttr   0/1     ContainerCreating   0          0s
sample-cronjob-1585228560-qvttr   0/1     ContainerCreating   0          1s
sample-cronjob-1585228560-qvttr   0/1     Completed           0          5s
sample-cronjob-1585228620-hcdbq   0/1     Pending             0          0s
sample-cronjob-1585228620-hcdbq   0/1     Pending             0          0s
sample-cronjob-1585228620-hcdbq   0/1     ContainerCreating   0          0s
sample-cronjob-1585228620-hcdbq   0/1     ContainerCreating   0          1s
sample-cronjob-1585228620-hcdbq   0/1     Completed           0          5s
sample-cronjob-1585228680-ghmz2   0/1     Pending             0          0s
sample-cronjob-1585228680-ghmz2   0/1     Pending             0          0s
sample-cronjob-1585228680-ghmz2   0/1     ContainerCreating   0          0s
sample-cronjob-1585228680-ghmz2   0/1     ContainerCreating   0          1s
sample-cronjob-1585228680-ghmz2   0/1     Completed           0          6s

1分おきに、JobとPodが作られるのが確認できます。

cronjobの詳細も確認しておきます。

$ kubectl describe cronjob sample-cronjob
Name:                          sample-cronjob
・・・
Events:
  Type    Reason            Age   From                Message
  ----    ------            ----  ----                -------
  Normal  SuccessfulCreate  34m   cronjob-controller  Created job sample-cronjob-1585228560
  Normal  SawCompletedJob   34m   cronjob-controller  Saw completed job: sample-cronjob-1585228560, status: Complete
  Normal  SuccessfulCreate  33m   cronjob-controller  Created job sample-cronjob-1585228620
  Normal  SawCompletedJob   33m   cronjob-controller  Saw completed job: sample-cronjob-1585228620, status: Complete
  Normal  SuccessfulCreate  32m   cronjob-controller  Created job sample-cronjob-1585228680
  Normal  SawCompletedJob   32m   cronjob-controller  Saw completed job: sample-cronjob-1585228680, status: Complete

jobの実行時間を確認して、1分おきに実行されていたか確認しておきます。

$ kubectl describe jobs.batch sample-cronjob-1585228560
Name:           sample-cronjob-1585228560
・・・
Start Time:     Thu, 26 Mar 2020 22:16:00 +0900
・・・

$ kubectl describe jobs.batch sample-cronjob-1585228620
Name:           sample-cronjob-1585228620
・・・
Start Time:     Thu, 26 Mar 2020 22:17:00 +0900
・・・

1分おきになってますね。

CronJobの一時停止

このままですと、1分おきにJobが実行され続けてしまいます。もう使わないのであれば、deleteすればよいですが、メンテナンスなどで一時的に停止したい場合もあるでしょう。
この場合は、「spec.suspend」パラメータの値を「true」にすることにより、停止することができます。(デフォルトはfalse)

マニフェストを書き換えてapplyする方法と、kubectl patchコマンドで変更する方法があります。今回は後者の方法で停止してみます。

$ kubectl patch cronjob sample-cronjob -p '{"spec":{"suspend":true}}'
cronjob.batch/sample-cronjob patched
$ kubectl get cronjob
NAME             SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
sample-cronjob   */1 * * * *   True      0        47m             50m

SUSPENDの値が「True」になって、停止しました。

まとめ

今回はCronJobの基本的な動作を確認しました。
CronJobには他にも色々なパラメータがありますので、それらの動作も今後確認していきたいと思います。