技術ブログ

(技術系中心)基本自分用備忘録なので、あくまで参考程度でお願いします。

kubernetesのCronJobについて

kubernetesのCronJobについて

業務でk8sのクローンジョブを利用して、定期バッジ処理をする機会があった。

忘れない為に学んだ内容を記載する

クローンジョブを行うようなケースは下記のようなものがあります。

1. 定期的に送信メールを送る
2. 1日一回ユーザー情報を取得して、不正ユーザーがいない確認する

k8sのcronjobの仕組み

k8sを利用すれば、CronJobというリソースで定期バッジ処理を行うことが可能です。

K8s CronJob ではコントローラーがスケジュールを管理し、実行ごとに Pod を作成して、終了したらそれを破棄します。(コンテナを stateless, immutable, ephemeral に保てます)

lhiroki1205.hatenablog.com

cronJobの作成方法

例)

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *" ※1
  concurrencyPolicy: Forbid ※2
  startingDeadlineSeconds: 10 ※3
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure ※4

※1 実行時間の指定

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │                                   7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * *

例)毎日午前0時01分に定期実行したい場合

1 0 * * *

※2 古いJobがまだ動いてる際に、新しいJobを実行するかどうかのポリシーを設定する

Allow(default):同時実行に対して制限を行わない
Forbid:前のJobが終了していない場合は次のJobは実行しない(同時実行を行わない)
Replace:前のJobをキャンセルし、新たにJobを開始する

※3 開始時刻が遅れた場合に許容できる秒数

※4 kebectl runによってpodを作成する時のrestart policy

--restart=AlwaysならDeploymentが作成される
--restart=OnFailureならJobがが作成される
--restart=Neverなら通常のpodが作成される

参考

kubernetes.io

kubernetes.io