はじめに
KubernetesのJobとCronJobについて、ざっくりどんなものか解説し実際に動かしてみたいと思います。
JobとCronJobとは
Job
Jobとは、1つ以上のPodを作成し、指定された数のPodの処理が成功するまで動き続けるオブジェクトです。
Jobは1回しか動かさないような処理を実行する場合に便利です。
Jobには以下のような特性があります。
- 1つ以上のPodを作成
- 指定された数が成功したら完了
- 成功するまで動き続ける
- 並列処理が可能
CronJob
CronJobとは、スケジュールに基づきJobを作成するオブジェクトです。
cron形式で記述されたスケジュールでJobが作成されます。バックアップやメール送信のような定期的に行うタスクに便利です。
Jobを動かしてみる
まずはJobを実際に動かしてみます。
Jobのマニフェストjob.yml
を作成します。
apiVersion: batch/v1
kind: Job
metadata:
name: hoge
spec:
parallelism: 3
completions: 3
template:
metadata:
labels:
app: hoge
spec:
containers:
- name: hoge
image: alpine:latest
command: ["/bin/sh"]
args:
- "-c"
- |
echo hoge!
sleep 5
echo hogehoge!
sleep 5
echo hogehogehoge!
restartPolicy: Never
こちらは3つのPodを並列で処理し、3つのPodが正常処理したら完了になるJobです。実行する内容はシンプルに3つのメッセージを表示するだけになっています。
Jobを作成します。
❯ kubectl apply -f job.yml
job.batch/hoge created
JobとPodを確認してみると、3つのPodが作成され、それぞれのPodが正常終了していることがわかります。
❯ kubectl get job
NAME COMPLETIONS DURATION AGE
hoge 3/3 25s 30s
❯ kubectl get pod
NAME READY STATUS RESTARTS AGE
hoge-2qbww 0/1 Completed 0 34s
hoge-fj6mh 0/1 Completed 0 34s
hoge-z7njc 0/1 Completed 0 34s
Jobでのログを確認すると3つのPod分のメッセージが確認できます。
❯ kubectl logs -l app=hoge
hoge!
hogehoge!
hogehogehoge!
hoge!
hogehoge!
hogehogehoge!
hoge!
hogehoge!
hogehogehoge!
それぞれのPodでのログを確認する場合は、以下のように作成されたPodを確認してからログを取得します。
❯ kubectl describe job
Name: hoge
Namespace: default
Selector: controller-uid=b2f305f8-f1a1-48e9-aefd-c3839671293a
Labels: app=hoge
controller-uid=b2f305f8-f1a1-48e9-aefd-c3839671293a
job-name=hoge
Annotations: <none>
Parallelism: 3
Completions: 3
~~ 中略 ~~
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 5m5s job-controller Created pod: hoge-2qbww
Normal SuccessfulCreate 5m5s job-controller Created pod: hoge-fj6mh
Normal SuccessfulCreate 5m5s job-controller Created pod: hoge-z7njc
Normal Completed 4m40s job-controller Job completed
以下のように個別のPodのログが確認できます。
❯ kubectl logs hoge-2qbww
hoge!
hogehoge!
hogehogehoge!
Jobが完了しても、Jobと関連するPodはログが確認できるように残っているので、削除しておきます。
❯ kubectl delete -f job.yml
job.batch "hoge" deleted
CronJobを動かしてみる
続いて、CronJobを動かしてみます。
CronJobのマニフェストcronjob.yml
を作成します。
apiVersion: batch/v1
kind: CronJob
metadata:
name: hoge
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
metadata:
labels:
app: hoge
spec:
containers:
- name: hoge
image: alpine:latest
command: ["/bin/sh"]
args:
- "-c"
- |
echo hoge!
sleep 5
echo hogehoge!
sleep 5
echo hogehogehoge!
restartPolicy: OnFailure
こちらのCronJobは1分ごとにJobを作成します。
CronJobを作成します。
❯ kubectl apply -f cronjob.yml
cronjob.batch/hoge created
しばらくしてからCronJob、Job、Podを確認してみます。
❯ kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hoge */1 * * * * False 0 24s 3m2s
❯ kubectl get job
NAME COMPLETIONS DURATION AGE
hoge-27247746 1/1 14s 2m27s
hoge-27247747 1/1 15s 87s
hoge-27247748 1/1 14s 27s
❯ kubectl get pod
NAME READY STATUS RESTARTS AGE
hoge-27247746-x58st 0/1 Completed 0 2m29s
hoge-27247747-nrbjb 0/1 Completed 0 89s
hoge-27247748-gtjlb 0/1 Completed 0 29s
JobとPodが定期的に作成され、実行していることがわかります。
このままではずっと動き続けてしまうので、最後に削除しておきます。
❯ kubectl delete -f cronjob.yml
cronjob.batch "hoge" deleted
まとめ
- Jobは1回限りのタスクを実行
- CronJobは定期的にタスクを実行