CronJob

このページでは、Kubernetes Engine で CronJob を実行する方法を説明します。CronJob は Kubernetes のネイティブ機能です。詳しくは、CronJob に関する Kubernetes のドキュメントをご覧ください。

概要

CronJob を使用すると、特定の時間または間隔でタスクを実行できます。CronJob は、バックアップ、レポート作成、メール送信、クリーンアップ タスクなどの自動タスクに適しています。

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

始める前に

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

次のいずれかの方法で gcloud のデフォルトの設定を指定します。

  • gcloud init。デフォルトの設定全般を確認する場合に使用します。
  • gcloud config。プロジェクト ID、ゾーン、リージョンを個別に設定する場合に使用します。

gcloud init の使用

エラー One of [--zone, --region] must be supplied: Please specify location を受信した場合は、このセクションの内容を実施します。

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

    gcloud init

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

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

gcloud config の使用

  • デフォルトのプロジェクト ID を設定します。
    gcloud config set project project-id
  • ゾーンクラスタを使用する場合は、デフォルトのコンピューティング ゾーンを設定します。
    gcloud config set compute/zone compute-zone
  • リージョン クラスタを使用する場合は、デフォルトのコンピューティング リージョンを設定します。
    gcloud config set compute/region compute-region
  • gcloud を最新バージョンに更新します。
    gcloud components update

CronJob を作成する

この CronJob は、現在の時刻と文字列を 1 分間隔で出力します。

# cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/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 filename

以降のセクションでは、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/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 100
  jobTemplate:
    spec:
    ...

startingDeadlineSeconds 値を指定しない場合、CronJob はタイムアウトしません。そのため、同じ CronJob が同時に複数回実行される可能性があります。この種の問題を回避するには、同時実行ポリシーを指定するをご覧ください。

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

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

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

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

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

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

履歴制限を指定する

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

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

成功または失敗したジョブのデータ保持を無効にするには、それぞれの値を 0 に設定します。ただし、失敗のデバッグがさらに難しくなることがあります。

CronJob を検査する

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

kubectl describe cronjob cronjob-name

CronJob の履歴を表示する

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

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

kubectl get pods

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 を使用します。

kubectl logs hello-failed-1556555820-wrvt2

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

CronJob を削除する

CronJob を削除するには、kubectl delete を使用します。

kubectl delete cronjob cronjob-name

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

次のステップ