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

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

CronJobはJobの上位概念で、Jobを管理します。[DeploymentとReplicaSetの関係](https://qiita.com/dingtianhongjie/items/46e44fefce097ba3e3cf)と同じですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/095279de-5392-5121-cde9-ae61fb71626e.png)

#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などのパラメータ](https://qiita.com/dingtianhongjie/items/e4f8cbdf914725d40c84)も設定することができます。このことからも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には他にも色々なパラメータがありますので、それらの動作も今後確認していきたいと思います。