やること
KubernetesでCronJobを動かすためのマニフェストファイル(Manifests)を作成します。
設定値などのメモも記載します。
CronJobを作成
YAMLファイルを作成
apiVersion: batch/v1beta1
kind: CronJob
metadata:
# Jobの名前
name: my-cronjob
spec:
# スケジュールはcron形式
schedule: "*/1 * * * *"
# スケジュール対象外にするか
suspend: false
# ジョブを同時実行するかどうか
concurrencyPolicy: Forbid
# ジョブの開始期限(秒)
startingDeadlineSeconds: 100
# ジョブ成功の履歴数
successfulJobsHistoryLimit: 7
# ジョブ失敗の履歴数
failedJobsHistoryLimit: 3
# 実行内容を指定
jobTemplate:
spec:
# 正常終了回数
completions: 1
# 並列数
parallelism: 1
# リトライ回数
backoffLimit: 0
template:
spec:
# 再起動の設定
restartPolicy: OnFailure
containers:
- name: my-cronjob
# imageを設定
image: busybox
# コマンドを設定
args:
- /bin/sh
- -c
- date
補足事項
上記で作成したCronJobの設定値についての補足です。
オプションは、不要であれば行ごと削除しても問題ありません。そのときはデフォルト値が有効になります。
suspend
このフィールドはオプションです。デフォルトはfalse。
スケジュール実行を一時的に止めたいなど、対象外にしたいときはtrueを設定してください。
concurrencyPolicy
このフィールドはオプションです。デフォルトはAllow。
Allow:並列実行を許可。
Forbid:前回のジョブが終わってないときは、ジョブをスキップします。並列実行はしません。
Replace:前回のジョブが終わってないときは、ジョブをキャンセルし新しいジョブを実行します。
startingDeadlineSeconds
このフィールドはオプションです。
何らかの理由でジョブのスケジュールが遅れたときに、開始する期限(秒単位)を設け、startingDeadlineSecondsに到達するまでジョブの再試行を続けます。
値を指定しないときは、CronJobはタイムアウトしません。
successfulJobsHistoryLimit
このフィールドはオプションです。デフォルトは3。
0を設定すると、ジョブ終了後の履歴は保持されません。
failedJobsHistoryLimit
このフィールドはオプションです。デフォルトは1。
0を設定すると、ジョブ終了後の履歴は保持されません。
completions
このフィールドはJobのオプションです。
Jobの正常終了した回数を指定できます。この値に達するとJobが完了となります。
parallelism
このフィールドはJobのオプションです。デフォルトは1。
Jobの並列数です。
backoffLimit
このフィールドはJobのオプションです。デフォルトは6。
Jobのリトライ回数です。
0を設定すると、リトライしません。1を設定すると、1回リトライするのでジョブは2回動くことになります。
restartPolicy
これは、再起動するかどうかを設定する訳ではなく、どのように再起動するかを設定します。
Never:起動するごとに失敗のカウントをして、新しいPodを作成し再実行します。
OnFailure:起動するごとに失敗のカウントをせず、同じPodで再実行します。
image/args
この辺りはCronJob特有ではなくKubernetes共通なので省略します。以下のあたりを参考にしてみてください。
https://kubernetes.io/docs/concepts/containers/images/
https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/
ちなみにですが、imageは最速でCronJobを実行したかったのでbusyboxを利用させていただきました。
https://hub.docker.com/_/busybox
さいごに
これでManifestファイルの作成はできました。
linuxのcronと比較すると、Dockerのimageを準備しておくなど面倒なこともありますが、時間の設定や環境変数、コマンドラインなど似ているところも多いですね。
それに加えて随分と高機能になっていると思います。
このManifestファイルをもとに、kubectlコマンドを使用して実際に動かしてる記事はこちらです。
https://qiita.com/boutan/items/ec6c0f410bf32e9caa78