CronJob


CronJob は Google Kubernetes Engine(GKE)バージョン 1.21 以降(一般提供)で使用できます。このドキュメントでは、GKE で CronJob を実行する方法について説明します。CronJob は Kubernetes の組み込み機能です。詳細については、CronJob に関する Kubernetes のドキュメントをご覧ください。

概要

CronJob は、繰り返しのスケジュールで Kubernetes Job を作成します。CronJob を使用すると、バックアップ、レポート作成、メール送信、クリーンアップ タスクなどの定期的なタスクを自動化できます。

CronJob は、Job と同じ方法で作成、管理、スケーリング、削除されます。作成されるジョブ オブジェクトの正確な数は、いくつかの要因によって異なります。詳細については、CronJob の制限事項をご覧ください。

ジョブの詳細については、ジョブを実行するをご覧ください。

始める前に

作業を始める前に、次のことを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。

CronJob を作成する

CronJob は、マニフェスト ファイルを使用して作成できます。たとえば、次の YAML マニフェストは、CronJob パラメータのデフォルト値を維持したまま、現在の時刻と文字列を 1 分ごとに出力します。

# cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  concurrencyPolicy: Allow
  startingDeadlineSeconds: 100
  suspend: false
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo "Hello, World!"
          restartPolicy: OnFailure

この CronJob を作成するには、YAML マニフェストをファイルに保存してクラスタに適用します。

kubectl apply -f PATH_TO_FILE

PATH_TO_FILE は、YAML マニフェストへのパスに置き換えます。

CronJob を構成する

CronJob を作成するときに、次のパラメータを指定できます。

CronJob を実行するタイミングを指定する

spec.schedule フィールドは、UNIX 標準の crontab 形式を使用して CronJob を実行する時間と間隔を定義します。すべての CronJob 時間は UTC で表示されます。スペースで区切られた 5 つのフィールドがあります。こうしたフィールドは、以下を表します。

  1. 分(0~59)
  2. 時間(0~23)
  3. 日(1~31)
  4. 月(1~12)
  5. 曜日(0~6、日曜日から始まります)

任意の spec.schedule フィールドで次の特殊文字を使用できます。

  • ? は、単一の文字と一致するワイルドカード値です。
  • * は、ゼロ個以上の文字と一致するワイルドカード値です。
  • / を使用すると、フィールドの間隔を指定できます。たとえば、最初のフィールド(分フィールド)の値が */5 の場合、「5 分ごと」を意味します。5 番目のフィールド(曜日フィールド)が 0/5 に設定されている場合、「5 回目の日曜日ごと」を意味します。

CronJob の実行内容を指定する

spec.jobTemplate は、コンテナの画像、コンテナが実行するコマンド、CronJob の再起動ポリシーなど、CronJob が実行する内容を記述します。spec.jobTemplate に含める内容の詳細については、Kubernetes CronJob のドキュメントをご覧ください。

期限を指定する

省略可の startingDeadlineSeconds フィールドは、なんらかの理由でスケジュールされた時刻に CronJob を実行できなかった場合に、CronJob を開始するまでの最大秒数を示します。実行しそこなった CronJob は失敗と見なされます。

期限を指定するには、マニフェスト ファイルで startingDeadlineSeconds の値を CronJob の spec フィールドに追加します。たとえば、次のマニフェストは、CronJob を 100 秒後に開始するように指定します。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 100
  jobTemplate:
    spec:
    ...

同時実行ポリシーを指定する

省略可の spec.concurrencyPolicy フィールドは、CronJob コントローラによって作成される 1 つのジョブの同時実行をどのように処理するかを指定します。値を設定しない場合、複数の同時実行ジョブがデフォルトで許可されます。

concurrencyPolicy の値としては次を使用できます。

意味
Allow 同時実行ジョブを許可します。これがデフォルトです。
Forbid 同時実行ジョブを禁止します。前のジョブが完了するかタイムアウトするまで、新しいジョブは開始できません。
Replace 同時実行ジョブを禁止します。新しいジョブを優先し、古いジョブはキャンセルされます。

後続の実行を一時停止する

省略可の spec.suspend フィールドを true に設定すると、新しいジョブは実行されませんが、現在の実行の終了は許可されます。

履歴制限を指定する

CronJob は、実行するたびにポッドを作成します。最近実行した CronJob の終了ステータスと各ポッドのログの表示については、CronJob の履歴を表示するを参照してください。

保存される CronJob 実行の成功と失敗の回数は、spec.successfulJobsHistoryLimitspec.failedJobsHistoryLimit の値を指定することで構成できます。デフォルトでは、successfulJobsHistoryLimit は 3、failedJobsHistoryLimit は 1 にそれぞれ設定されます。

たとえば、次のマニフェストは、最大 5 件の成功した CronJob 実行と最大 10 件の失敗した CronJob 実行を保存するように GKE に指示します。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 100
  successfulJobsHistoryLimit: 5
  failedJobsHistoryLimit: 10
  jobTemplate:
    spec:
    ...

CronJob の実行履歴の成否は、それぞれの値を 0 に設定することで無効にできます。履歴の保持を無効にすると、エラーのデバッグがより難しくなることがあります。たとえば、次のマニフェストは、失敗した CronJob 実行のみを保存するように GKE に指示します。

kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 100
  successfulJobsHistoryLimit: 0
  failedJobsHistoryLimit: 10
  jobTemplate:
    spec:
    ...

CronJob を検査する

CronJob の構成を確認するには、kubectl describe を使用します。

kubectl describe cronjob CRONJOB_NAME

CRONJOB_NAME は、検査する CronJob の名前に置き換えます。

CronJob の履歴を表示する

CronJob はポッド内で実行されます。Kubernetes がデフォルトで保持するログは、CronJob が正常に実行された最新の 3 件と失敗した最新のジョブ 1 件を表す終了したポッドのログです。これらのデフォルトは、CronJob の履歴制限を変更することで変更または無効にできます。

CronJob の履歴を表示するには、まずすべてのポッドを一覧表示します。完了した CronJob のステータスは Completed で、失敗したジョブのステータスは RunContainerErrorCrashLoopBackOff、あるいは失敗を示す別のステータスと表示されます。

NAME                                READY   STATUS              RESTARTS   AGE
hello-1556555640-9bc5r              0/1     Completed           0          3m6s
hello-1556555700-cm6wk              0/1     Completed           0          2m6s
hello-1556555760-62wf5              0/1     Completed           0          66s
hello-1556555820-rl8kl              0/1     Completed           0          5s
hello-failed-1556555820-wrvt2       0/1     RunContainerError   1          5s

特定の CronJob のログを表示するには、次のコマンドを実行します。

kubectl logs POD_NAME

POD_NAME は、検査する Pod の名前に置き換えます。

出力は次のようになります。

container_linux.go:247: starting container process caused
"exec: \"/in/sh\": stat /in/sh: no such file or directory"

CronJob を削除する

CronJob を削除するには、次のコマンドを実行します。

kubectl delete cronjob CRONJOB_NAME

CronJob を削除すると、Kubernetes ガベージ コレクタが関連するジョブを削除し、新しいジョブは開始されません。

次のステップ