Kubernetes コントローラー - Job と CronJob

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

タグ: Kubernetes Job CronJob バッチ処理 並列処理

8月12日 05:34 投稿