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