[Kubernetes]Jobの動作を確認する 2

#はじめに
Jobの並列動作を設定するパラメータとして、以下の3つがあります。
今回はこれらのパラメーターの動作を確認してみたいと思います。

|パラメータ|説明|デフォルト値|
|:---|:---|:---|
|spec.completions|指定した回数Podが正常終了したら、Jobが終了する|1|
|spec.parallelism|指定した数値分Podを並列で起動する|1|
|spec.backoffLimit|~~指定した回数Podが異常終了したら、Jobが終了する~~ 指定した回数Podをリトライして、リトライ回数が指定した値に達したらJobをエラーとする（2020/3/30修正）|6|


#シリアルでのJob実行
まずは簡単なところで、spec.completionsだけ指定します。
作成したyamlファイルはこちらです。

```sampleJob-com.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: sample-job-com
spec:
  completions: 5
  parallelism: 1
  backoffLimit: 0
  template:
    spec:
      containers:
      - name: sample-job1
        image: centos:latest
        command: ["echo"]
        args: ["hoge"]
      restartPolicy: Never
```
5回Podを起動して、Jobが終了するはずです。

確認します。

```
$ kubectl apply -f sampleJob-com.yaml
job.batch/sample-job-com created
$ kubectl get job
NAME             COMPLETIONS   DURATION   AGE
sample-job-com   0/5           6s         6s
・・・
$ kubectl get pod
NAME                   READY   STATUS              RESTARTS   AGE
sample-job-com-5cnpl   0/1     ContainerCreating   0          2s
sample-job-com-7k6lw   0/1     Completed           0          13s
sample-job-com-hsmd2   0/1     Completed           0          8s
sample-job-com-zx9sb   0/1     Completed           0          20s
・・・
$ kubectl get pod
NAME                   READY   STATUS      RESTARTS   AGE
sample-job-com-5cnpl   0/1     Completed   0          15s
sample-job-com-7k6lw   0/1     Completed   0          26s
sample-job-com-drztz   0/1     Completed   0          10s
sample-job-com-hsmd2   0/1     Completed   0          21s
sample-job-com-zx9sb   0/1     Completed   0          33s
$ kubectl get job
NAME             COMPLETIONS   DURATION   AGE
sample-job-com   5/5           28s        40s
```
少し時間を置きながらPodを確認すると、シリアルに一つずつPodがデプロイされていることが確認できます。
kubectl get jobの「COMPLETIONS」の値もそれに合わせて増えていきます。

kubectl describeコマンドでもPodがシリアルにデプロイされていることが確認できます。

```
$ kubectl describe jobs sample-job-com
Name:           sample-job-com
・・・
Events:
  Type    Reason            Age   From            Message
  ----    ------            ----  ----            -------
  Normal  SuccessfulCreate  88s   job-controller  Created pod: sample-job-com-zx9sb
  Normal  SuccessfulCreate  81s   job-controller  Created pod: sample-job-com-7k6lw
  Normal  SuccessfulCreate  76s   job-controller  Created pod: sample-job-com-hsmd2
  Normal  SuccessfulCreate  70s   job-controller  Created pod: sample-job-com-5cnpl
  Normal  SuccessfulCreate  65s   job-controller  Created pod: sample-job-com-drztz
```

#パラレルでのJob実行
今度はspec.completionsとspec.parallelismを指定します。
作成したyamlファイルはこちらです。

```sampleJob-com-par.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: sample-job-com-par
spec:
  completions: 5
  parallelism: 2
  backoffLimit: 0
  template:
    spec:
      containers:
      - name: sample-job
        image: centos:latest
        command: ["echo"]
        args: ["hoge"]
      restartPolicy: Never
```
5回のPodのデプロイを2並列で実施します。

確認します。

```
$ kubectl apply -f sampleJob-com-par.yaml
job.batch/sample-job-com-par created
$ kubectl get job
NAME                 COMPLETIONS   DURATION   AGE
sample-job-com-par   0/5           5s         5s
・・・
$ kubectl get pod
NAME                       READY   STATUS              RESTARTS   AGE
sample-job-com-par-bs4fp   0/1     Pending             0          1s
sample-job-com-par-flwcz   0/1     Completed           0          8s
sample-job-com-par-w2rf8   0/1     ContainerCreating   0          8s
・・・
$ kubectl get pod
NAME                       READY   STATUS              RESTARTS   AGE
sample-job-com-par-7zfbg   0/1     ContainerCreating   0          1s
sample-job-com-par-bs4fp   0/1     Completed           0          8s
sample-job-com-par-flwcz   0/1     Completed           0          15s
sample-job-com-par-k6h6s   0/1     ContainerCreating   0          5s
sample-job-com-par-w2rf8   0/1     Completed           0          15s
・・・
$ kubectl get pod
NAME                       READY   STATUS      RESTARTS   AGE
sample-job-com-par-7zfbg   0/1     Completed   0          11s
sample-job-com-par-bs4fp   0/1     Completed   0          18s
sample-job-com-par-flwcz   0/1     Completed   0          25s
sample-job-com-par-k6h6s   0/1     Completed   0          15s
sample-job-com-par-w2rf8   0/1     Completed   0          25s
```
すぐに終わってしまうJobなので分かりづらいですけど、2並列でデプロイされていそうです。

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

```
$ kubectl describe jobs sample-job-com-par
Name:           sample-job-com-par
・・・
Events:
  Type    Reason            Age   From            Message
  ----    ------            ----  ----            -------
  Normal  SuccessfulCreate  67s   job-controller  Created pod: sample-job-com-par-w2rf8
  Normal  SuccessfulCreate  67s   job-controller  Created pod: sample-job-com-par-flwcz
  Normal  SuccessfulCreate  60s   job-controller  Created pod: sample-job-com-par-bs4fp
  Normal  SuccessfulCreate  57s   job-controller  Created pod: sample-job-com-par-k6h6s
  Normal  SuccessfulCreate  53s   job-controller  Created pod: sample-job-com-par-7zfbg
```

#エラー時の動作
最後にspec.backoffLimitの動作を確認します。

作成したyamlファイルはこちらです。

```sampleJob-back.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: sample-job-back
spec:
  completions: 5
  parallelism: 1
  backoffLimit: 3
  template:
    spec:
      containers:
      - name: sample-job1
        image: centos:latest
        command: ["sh", "-c"]
        args: ["ls; exit 1"]
      restartPolicy: Never
```
Podをデプロイしたら、lsコマンドを実行して、exit 1で終了します。
completionsは「5」ですが、backoffLimitが「3」なので、~~3回エラーになって~~3回リトライしてJobが終了するはずです。

確認してみましょう。（2020/3/30修正）

```
$ kubectl apply -f sampleJob-back.yaml
job.batch/sample-job-back created
$ kubectl get job
NAME              COMPLETIONS   DURATION   AGE
sample-job-back   0/5           5s         5s
・・・
$ kubectl get pod
NAME                    READY   STATUS   RESTARTS   AGE
sample-job-back-99l5g   0/1     Error    0          107s
sample-job-back-gft9w   0/1     Error    0          117s
sample-job-back-wg6n6   0/1     Error    0          2m4s
sample-job-back-x2kmz   0/1     Error    0          86s
```

Podが3回~~デプロイして、~~リトライして、（デプロイされるPodは4つ）全てErrorになって終了しています。
一応、Podのログを確認しておくと、lsコマンドは実行されていることが確認できます。

```
$ kubectl logs sample-job-back-rj72t
bin
dev
etc
・・・
```

Jobの詳細を確認します。（2020/3/30修正）

```
$ kubectl describe jobs
Name:           sample-job-back
・・・
Events:
  Type     Reason                Age   From            Message
  ----     ------                ----  ----            -------
  Normal   SuccessfulCreate      88s   job-controller  Created pod: sample-job-back-wg6n6
  Normal   SuccessfulCreate      81s   job-controller  Created pod: sample-job-back-gft9w
  Normal   SuccessfulCreate      71s   job-controller  Created pod: sample-job-back-99l5g
  Normal   SuccessfulCreate      50s   job-controller  Created pod: sample-job-back-x2kmz
  Warning  BackoffLimitExceeded  10s   job-controller  Job has reached the specified backoff limit
```

~~Podが3つデプロイされていますが、 backoff limitの「3」に達したことがEventに書かれていますね。~~（2020/3/30修正）
Podが4つデプロイされていますが、（リトライ回数は3回）backoff limitの「3」に達したことがEventに書かれていますね。

#まとめ
今回はJobの3つのパラメータの動作を確認しました。
一つ一つの動作はわかりやすいですが、業務に合わせてこの3つのパラメータを設定するのは、色々なパターンがありますので難しそうですね。

（2020/3/30追記）
BackoffLimitの動作を誤って記載していました。先入観があったため最後まで動作を確認せずに途中で止めてしまっていたのかなと思います。（記憶があいまいですが）
先入観を捨てて、事実をちゃんと確認したいと思います。