CronJob

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

概要

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

CronJob は、実行するたびに Job を作成します。CronJob は、Job と同じ方法で作成、管理、スケーリング、削除されます。ジョブの詳細については、ジョブを実行するをご覧ください。

始める前に

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

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • Google Kubernetes Engine API の有効化
  • Cloud SDK がインストール済みであることを確認します。
  • 次のいずれかの方法で、プロジェクトにデフォルトの gcloud コマンドライン ツールを設定します。
    • プロジェクトのデフォルトの設定全般を確認する場合は、gcloud init を使用します。
    • gcloud config を使用して、プロジェクト ID、ゾーン、リージョンを個別に設定します。

    gcloud init

    1. gcloud init を実行して、次の操作を行います。

      gcloud init

      リモート サーバーで SSH を使用している場合は、--console-only フラグを指定して、コマンドがブラウザを起動しないようにします。

      gcloud init --console-only
    2. Google Cloud アカウントを使用できるように、gcloud の承認手順を行います。
    3. 新しい構成を作成するか、既存の構成を選択します。
    4. Google Cloud プロジェクトを選択します。
    5. デフォルトの Compute Engine ゾーンを選択します。
    6. デフォルトの Compute Engine リージョンを選択します。

    gcloud config

    1. デフォルトのプロジェクト ID を設定します。
      gcloud config set project PROJECT_ID
    2. デフォルトの Compute Engine リージョン(例: us-central1)を設定します。
      gcloud config set compute/region COMPUTE_REGION
    3. デフォルトの Compute Engine ゾーン(例: us-central1-c)を設定します。
      gcloud config set compute/zone COMPUTE_ZONE
    4. gcloud を最新バージョンに更新します。
      gcloud components update

    デフォルトのロケーションを設定することで、gcloud ツール(One of [--zone, --region] must be supplied: Please specify location など)のエラーを防止できます。

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 つの Job の同時実行をどのように処理するかを指定します。値を設定しない場合、複数の同時実行 Job がデフォルトで許可されます。

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

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

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

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

履歴制限を指定する

CronJob は、実行するたびにポッドを作成します。最近実行した CronJob の終了ステータスと各 Pod のログの表示については、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 は Pod 内で実行されます。Kubernetes がデフォルトで保持するログは、CronJob が正常に実行された最新の 3 件と失敗した最新の Job 1 件を表す終了した Pod のログです。これらのデフォルトは、CronJob の履歴制限を変更することで変更または無効にできます。

CronJob の履歴を表示するには、まずすべての Pod を一覧表示します。完了した CronJob のステータスは Completed で、失敗した Job のステータスは 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 ガベージ コレクタが関連する Job を削除し、新しい Job は開始されません。

次のステップ