2019年6月12日水曜日

k8s の CronJob を試してみた

概要

CronJob は k8s の Pod を指定の時間に起動することができるコントローラです
定期的に実行する Pod を作りたい場合に便利です
時間の指定は crond と同じフォーマットが使えます

環境

  • macOS 10.14.5
  • minikube 1.10.0

CronJob 作成

  • vim echo_cron_job.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo "Hello, World!"
          restartPolicy: OnFailure

schedule で起動するスケジュールを crond 形式で指定します
restartPolicyOnFailure を指定していますが特に必須ではありません

  • kubectl apply -f echo_cron_job.yaml

CronJob の一覧確認

  • kubectl get cj
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        42s             111s

CronJob の詳細確認

  • kubectl describe cj hello
Name:                       hello
Namespace:                  default
Labels:                     <none>
Annotations:                kubectl.kubernetes.io/last-applied-configuration:
                              {"apiVersion":"batch/v1beta1","kind":"CronJob","metadata":{"annotations":{},"name":"hello","namespace":"default"},"spec":{"jobTemplate":{"...
Schedule:                   */1 * * * *
Concurrency Policy:         Allow
Suspend:                    False
Starting Deadline Seconds:  <unset>
Selector:                   <unset>
Parallelism:                <unset>
Completions:                <unset>
Pod Template:
  Labels:  <none>
  Containers:
   hello:
    Image:      busybox
    Port:       <none>
    Host Port:  <none>
    Args:
      /bin/sh
      -c
      date; echo "Hello, World!"
    Environment:     <none>
    Mounts:          <none>
  Volumes:           <none>
Last Schedule Time:  Fri, 07 Jun 2019 15:45:00 +0900
Active Jobs:         <none>
Events:
  Type    Reason            Age    From                Message
  ----    ------            ----   ----                -------
  Normal  SuccessfulCreate  2m23s  cronjob-controller  Created job hello-1559889780
  Normal  SawCompletedJob   2m13s  cronjob-controller  Saw completed job: hello-1559889780
  Normal  SuccessfulCreate  83s    cronjob-controller  Created job hello-1559889840
  Normal  SawCompletedJob   73s    cronjob-controller  Saw completed job: hello-1559889840
  Normal  SuccessfulCreate  23s    cronjob-controller  Created job hello-1559889900
  Normal  SawCompletedJob   12s    cronjob-controller  Saw completed job: hello-1559889900

CronJob は指定の時間になると Job を生成して実行します

Job 確認

  • kubectl get job
NAME               COMPLETIONS   DURATION   AGE
hello-1559889840   1/1           5s         2m18s
hello-1559889900   1/1           7s         78s
hello-1559889960   1/1           6s         17s

ジョブは最新のジョブから 3 つまで保存されます
この値は successfulJobsHistoryLimit で変更できます

Job の詳細確認

  • describe job hello-1559889900
Name:           hello-1559889900
Namespace:      default
Selector:       controller-uid=c841b114-88ef-11e9-b7f1-0800273a058b
Labels:         controller-uid=c841b114-88ef-11e9-b7f1-0800273a058b
                job-name=hello-1559889900
Annotations:    <none>
Controlled By:  CronJob/hello
Parallelism:    1
Completions:    1
Start Time:     Fri, 07 Jun 2019 15:45:04 +0900
Completed At:   Fri, 07 Jun 2019 15:45:11 +0900
Duration:       7s
Pods Statuses:  0 Running / 1 Succeeded / 0 Failed
Pod Template:
  Labels:  controller-uid=c841b114-88ef-11e9-b7f1-0800273a058b
           job-name=hello-1559889900
  Containers:
   hello:
    Image:      busybox
    Port:       <none>
    Host Port:  <none>
    Args:
      /bin/sh
      -c
      date; echo "Hello, World!"
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age    From            Message
  ----    ------            ----   ----            -------
  Normal  SuccessfulCreate  2m45s  job-controller  Created pod: hello-1559889900-grgjl

Job は Pod を起動します
最終的なコマンドの結果は Pod のログを確認します

Pod でログの確認

  • kubectl logs hello-1559889900-grgjl

Job もそうだが Pod も最新 3 世代分しか残りません
削除された Pod のログは確認できないのでご注意ください
今回の場合のように 1 分ごとに実行される Job ですべてのログを残したい場合は DaemonSet + fluentd を使って外部にログを飛ばすようにしましょう

お掃除

  • kubectl delete cj hello

最後に

k8s の CronJob コントローラを使ってみました
CronJob -> Job -> Pod という流れでコンテナが作成されるのがポイントです
定義の仕方は crond と同じなので直感的に使えるのが Good です

k8s 上で定期バッチを動かす場合などに使いましょう
ロギング戦略は少し考える必要がありそうですが DaemonSet と組み合わせるのが手っ取り早いと思います

参考サイト

0 件のコメント:

コメントを投稿