概要
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 形式で指定します
restartPolicy
で OnFailure
を指定していますが特に必須ではありません
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 件のコメント:
コメントを投稿