#はじめに
Jobの並列動作を設定するパラメータとして、以下の3つがあります。
今回はこれらのパラメーターの動作を確認してみたいと思います。
パラメータ | 説明 | デフォルト値 |
---|---|---|
spec.completions | 指定した回数Podが正常終了したら、Jobが終了する | 1 |
spec.parallelism | 指定した数値分Podを並列で起動する | 1 |
spec.backoffLimit |
|
6 |
#シリアルでのJob実行
まずは簡単なところで、spec.completionsだけ指定します。
作成した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ファイルはこちらです。
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ファイルはこちらです。
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の動作を誤って記載していました。先入観があったため最後まで動作を確認せずに途中で止めてしまっていたのかなと思います。(記憶があいまいですが)
先入観を捨てて、事実をちゃんと確認したいと思います。