Kubernetes の CronJob を使って Job を定期的に実行するときに,マニフェストに設定できるフィールド concurrencyPolicy
と suspend
を試す機会があった.振り返りながら整理しておく.
Concurrency Policy とは?
CronJob では,例えば「ジョブの実行時間が長時間化した(突き抜けた)場合」のために「同時実行ポリシー (Concurrency Policy)」を設定できる.具体的なフィールドは concurrencyPolicy
となり,以下の3種類から選べる.デフォルトは Allow となり,同時実行を許容する.
- Allow : 同時実行を許容する
- Forbid : 同時実行を許容せず,実行中のジョブがあれば,新規ジョブをスキップする
- Replace : 同時実行を許容せず,実行中のジョブがあれば,新規ジョブに置き換える
concurrencyPolicy
のイメージを図解してみた.青は Running で,赤は Terminating などを意味する.
concurrencyPolicy
検証 : Allow
Kubernetes のドキュメントを参考に簡単なマニフェストを作成した.Cron 表記は「1分間隔」とし,単純に「300秒スリープする」 Job にした.そして,今回検証する concurrencyPolicy
は Allow にした(デフォルト設定).
apiVersion: batch/v1beta1 kind: CronJob metadata: name: kakakakakku spec: schedule: "*/1 * * * *" concurrencyPolicy: Allow jobTemplate: spec: template: spec: containers: - name: sleep image: busybox args: - /bin/sh - -c - date; sleep "300"; date restartPolicy: OnFailure
マニフェストを適用し,少し待ってから Pod を確認すると,同時実行になっていた.
$ kubectl apply -f cronjob.yaml cronjob.batch/kakakakakku created $ kubectl get pods NAME READY STATUS RESTARTS AGE kakakakakku-1585740960-kvq28 0/1 Completed 0 6m6s kakakakakku-1585741020-fmjl7 0/1 Completed 0 5m6s kakakakakku-1585741080-x88r2 1/1 Running 0 4m6s kakakakakku-1585741140-f7sbh 1/1 Running 0 3m6s kakakakakku-1585741200-jpxnj 1/1 Running 0 2m5s kakakakakku-1585741260-6lbc7 1/1 Running 0 65s kakakakakku-1585741320-s54b2 0/1 ContainerCreating 0 5s
concurrencyPolicy
検証 : Forbid
次は concurrencyPolicy
を Forbid にしてマニフェストを適用する.
apiVersion: batch/v1beta1 kind: CronJob metadata: name: kakakakakku spec: schedule: "*/1 * * * *" concurrencyPolicy: Forbid (中略)
Forbid は同時実行を許容せず,実行中のジョブがあれば,新規ジョブをスキップする.Running になっている kakakakakku-1585741620-spbnk
が Completed になってから,新しく kakakakakku-1585741920-phjzs
が Running になっている.
$ kubectl get pods NAME READY STATUS RESTARTS AGE kakakakakku-1585741620-spbnk 1/1 Running 0 4m50s $ kubectl get pods NAME READY STATUS RESTARTS AGE kakakakakku-1585741620-spbnk 0/1 Completed 0 5m20s kakakakakku-1585741920-phjzs 1/1 Running 0 10s
concurrencyPolicy
検証 : Replace
最後は concurrencyPolicy
を Replace にしてマニフェストを適用する.
apiVersion: batch/v1beta1 kind: CronJob metadata: name: kakakakakku spec: schedule: "*/1 * * * *" concurrencyPolicy: Replace (中略)
Replace は同時実行を許容せず,実行中のジョブがあれば,新規ジョブに置き換える.実行中だった kakakakakku-1585743600-ftmb8
が Terminating になり,新しく kakakakakku-1585743660-4gb5v
が Running になっている.
$ kubectl get pods NAME READY STATUS RESTARTS AGE kakakakakku-1585743600-ftmb8 1/1 Terminating 0 70s kakakakakku-1585743660-4gb5v 1/1 Running 0 10s
Suspend とは?
CronJob では,例えば「メンテナンス時に実行を止める」など,「一時停止 (Suspend)」を設定できる.具体的なフィールドは suspend
となり,true
と false
を設定できる(デフォルトは false
).
suspend
検証
同じマニフェスト(concurrencyPolicy
は Forbid にしておく)に suspend: false
を設定し,マニフェストを適用する.
apiVersion: batch/v1beta1 kind: CronJob metadata: name: kakakakakku spec: schedule: "*/1 * * * *" concurrencyPolicy: Forbid suspend: false (中略)
一時停止を有効化する場合,マニフェストを suspend: true
に更新することもできるけど,今回は kubectl patch
コマンドを使って一時的に suspend: true
に変更する.その後に CronJob と Pod を確認すると,SUSPEND: True
になり,新しく Pod はスケジューリングされなくなった.
$ kubectl patch cronjob kakakakakku -p '{ "spec": { "suspend": true } }' cronjob.batch/kakakakakku patched $ kubectl get cronjob,pods NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE cronjob.batch/kakakakakku */1 * * * * True 0 7m14s 13m NAME READY STATUS RESTARTS AGE pod/kakakakakku-1585746240-296mt 0/1 Completed 0 12m pod/kakakakakku-1585746540-8spgm 0/1 Completed 0 7m
一時停止を無効化する(戻す)ために,同じく kubectl patch
コマンドを使う.
$ kubectl patch cronjob kakakakakku -p '{ "spec": { "suspend": false } }' cronjob.batch/kakakakakku patched
なお,kubectl patch
コマンドを使った方法は「Kubernetes 完全ガイド」の第5章にも載っている.
Kubernetes完全ガイド (impress top gear)
- 作者:青山 真也
- 発売日: 2018/09/21
- メディア: 単行本(ソフトカバー)
まとめ
Kubernetes の CronJob に設定できるフィールド concurrencyPolicy
と suspend
を試す機会があり,検証結果を整理した.Kubernetes 関連の記事は今まであまり書いてなく,今後はどんどん書いていく.