Job と CronJob
Deployment、StatefulSet、DaemonSet といったコントローラーは、主に常時稼働するアプリケーション(オンライン業務)の管理を目的としています。例として Nginx、MySQL などのアプリケーションを考えると、これらのアプリケーションは稼働後、エラー発生または停止を除き、常に実行状態(Running)にあります。
しかし、ある種のタスクはこの条件に適合しません。それが「バッチ処理」です。この種のタスクは処理が完了すると終了しますが、Deployment で管理しようとすると、Pod が終了後に再起動を試みるようになります。また、Rolling Update などの機能も適応できません。
そこで、Kubernetes 社区は v1.4 以降、離線業務を管理するための API オブジェクトとして Job を導入しました。
Job
Job は特定のタスクを実行するためのリソースです。以下は、カウンター機能を実行する Job の定義例です(job-demo.yaml):
apiVersion: batch/v1
kind: Job
metadata:
name: job-timer
spec:
template:
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox:1.32
command: ["/bin/sh", "-c", "for i in 10 9 8 7 6 5 4 3 2 1; do echo $i; sleep 3; done"]
Job は Pod テンプレートを含むため、Deployment と似ていますが、Job は一度限りのタスクを実行します。Job は restartPolicy を Never または OnFailure に設定する必要があります。restartPolicy が Always に設定されると、Job が永続的に再起動し続けるためです。
Job を作成し、状態を確認します:
# kubectl get job
NAME COMPLETIONS DURATION AGE
job-timer 1/1 30s 3m
Pod が完了した後、Job は Completed 状態になります。Pod に問題が発生した場合、Job は spec.backoffLimit で指定された回数だけ再試行します。再試行の間隔は指数関数的に増えます(10秒、20秒、40秒など)。
Job で並列処理や完了数を管理する場合は、spec.parallelism と spec.completions を指定します:
apiVersion: batch/v1
kind: Job
metadata:
name: job-timer
spec:
parallelism: 3
completions: 5
backoffLimit: 3
template:
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox:1.32
command: ["/bin/sh", "-c", "for i in 10 9 8 7 6 5 4 3 2 1; do echo $i; sleep 3; done"]
作成後、完了数を確認します:
# kubectl get job
NAME COMPLETIONS DURATION AGE
job-timer 5/5 60s 4m
CronJob
CronJob は Job に時刻スケジューリングを追加したものです。指定された時刻にタスクを実行したり、定期的にタスクを実行したりできます。Linux での crontab と非常に似ています。
以下は CronJob での定義例です(cronjob-demo.yaml):
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-timer
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox:1.32
command: ["/bin/sh", "-c", "for i in 10 9 8 7 6 5 4 3 2 1; do echo $i; sleep 3; done"]
schedule で cron 形式の時刻を指定します。jobTemplate は実行する Job そのものの定義です。spec には成功/失敗した Job を保持する数を制限する successfulJobsHistoryLimit と failedJobsHistoryLimit を指定できます。
CronJob 作成後、Pod を確認します:
# kubectl get pods
NAME READY STATUS RESTARTS AGE
cronjob-timer- 0/1 Completed 0 2m
定期実行を停止するには:
# kubectl delete cronjob cronjob-timer
cronjob.batch "cronjob-timer" deleted