【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を作成します。

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は定期的にタスクを実行

参考

タイトルとURLをコピーしました