kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Kubernetes の CronJob に設定できる concurrencyPolicy と suspend を試した

Kubernetes の CronJob を使って Job を定期的に実行するときに,マニフェストに設定できるフィールド concurrencyPolicysuspend を試す機会があった.振り返りながら整理しておく.

kubernetes.io

Concurrency Policy とは?

CronJob では,例えば「ジョブの実行時間が長時間化した(突き抜けた)場合」のために「同時実行ポリシー (Concurrency Policy)」を設定できる.具体的なフィールドは concurrencyPolicy となり,以下の3種類から選べる.デフォルトは Allow となり,同時実行を許容する.

  • Allow : 同時実行を許容する
  • Forbid : 同時実行を許容せず,実行中のジョブがあれば,新規ジョブをスキップする
  • Replace : 同時実行を許容せず,実行中のジョブがあれば,新規ジョブに置き換える

concurrencyPolicy のイメージを図解してみた.青は Running で,赤は Terminating などを意味する.

f:id:kakku22:20200406113227p:plain

concurrencyPolicy 検証 : Allow

Kubernetes のドキュメントを参考に簡単なマニフェストを作成した.Cron 表記は「1分間隔」とし,単純に「300秒スリープする」 Job にした.そして,今回検証する concurrencyPolicyAllow にした(デフォルト設定).

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

次は concurrencyPolicyForbid にしてマニフェストを適用する.

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: kakakakakku
spec:
  schedule: "*/1 * * * *"
  concurrencyPolicy: Forbid

(中略)

Forbid は同時実行を許容せず,実行中のジョブがあれば,新規ジョブをスキップする.Running になっている kakakakakku-1585741620-spbnkCompleted になってから,新しく kakakakakku-1585741920-phjzsRunning になっている.

$ 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

最後は concurrencyPolicyReplace にしてマニフェストを適用する.

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: kakakakakku
spec:
  schedule: "*/1 * * * *"
  concurrencyPolicy: Replace

(中略)

Replace は同時実行を許容せず,実行中のジョブがあれば,新規ジョブに置き換える.実行中だった kakakakakku-1585743600-ftmb8Terminating になり,新しく kakakakakku-1585743660-4gb5vRunning になっている.

$ 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 となり,truefalse を設定できる(デフォルトは false).

suspend 検証

同じマニフェスト(concurrencyPolicyForbid にしておく)に suspend: false を設定し,マニフェストを適用する.

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: kakakakakku
spec:
  schedule: "*/1 * * * *"
  concurrencyPolicy: Forbid
  suspend: false

(中略)

一時停止を有効化する場合,マニフェストを suspend: true に更新することもできるけど,今回は kubectl patch コマンドを使って一時的に suspend: true に変更する.その後に CronJobPod を確認すると,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)

Kubernetes完全ガイド (impress top gear)

  • 作者:青山 真也
  • 発売日: 2018/09/21
  • メディア: 単行本(ソフトカバー)

まとめ

Kubernetes の CronJob に設定できるフィールド concurrencyPolicysuspend を試す機会があり,検証結果を整理した.Kubernetes 関連の記事は今まであまり書いてなく,今後はどんどん書いていく.