CronJob

このページでは、Kubernetes Engine で CronJob を実行する方法について説明します。

概要

CronJob を作成して、指定された時間に 1 回だけまたは繰り返し実行される有限の時間関連タスクを実行できます。CronJob は、バックアップ、レポート作成、メール送信などの時間が決まっている自動タスクに使用できます。

CronJob は、ジョブ オブジェクトを使用してタスクを実行します。また、CronJob は、そのスケジュールの実行時間ごとに約 1 回ジョブ オブジェクトを作成します。

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

始める前に

このタスクを準備するには、次の手順を実行します。

  • Cloud SDK がインストール済みであることを確認します。
  • デフォルトのプロジェクト ID を設定します。
    gcloud config set project [PROJECT_ID]
  • デフォルトのコンピューティング ゾーンを設定します。
    gcloud config set compute/zone [COMPUTE_ZONE]

CronJob を作成する

1 分ごとに現在時刻と 1 つの文字列を出力する CronJob の例を以下に示します。

config.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 は、必須の jobTemplate フィールドを使用します。このフィールドには、作成するジョブのジョブ仕様である jobTemplate: spec が含まれています。ジョブ仕様には、指定されたタスクを実行するために作成されるポッドのポッド仕様spec: template: spec)が含まれています。

CronJob は、Unix 標準の crontab 形式で時間を受け取る、必須の schedule フィールドを使用します。

  • 1 つ目の値は分を示す(0〜59)
  • 2 つ目の値は時を示す(0〜23)
  • 3 つ目の値は日を示す(1〜31)
  • 4 つ目の値は月を示す(1〜12)
  • 5 つ目の値は曜日を示す(0〜6)

schedule はワイルドカード値として *? も受け入れます。/ と範囲を組み合わせ、タスクを定期的な間隔で繰り返す必要があることを指定します。上記の例で、*/1 * * * * は、毎月の毎日の毎分にタスクを繰り返す必要があることを示しています。

この CronJob を作成するには、上記のマニフェストを config.yaml として保存してから、次のコマンドを実行します。

kubectl create -f config.yaml

または、マニフェスト ファイルを作成せずに CronJob を作成するには、kubectl run を使用します。

kubectl run hello --schedule="*/1 * * * *" --restart OnFailure \
--image busybox -- /bin/sh -c "date; echo Hello, World\!"

期限を指定する

オプションの 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 の値が指定されなかった場合は、期限が使用されません。

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

オプションの concurrencyPolicy フィールドは、CronJob コントローラによって作成される 1 つのジョブの同時実行をどのように処理するかを指定します。concurrencyPolicy は CronJob の spec フィールドで指定します。

concurrencyPolicy には次の値を使用できます。

  • Allow: 同時実行ジョブを許可します。デフォルトです。
  • Forbid: 同時実行ジョブを禁止して、前の実行がまだ完了していない場合は、次の実行をスキップします。
  • Replace: 現在実行中のジョブを取り消し、新しいジョブに置き換えます。

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

オプションの suspend フィールドは、true に設定された場合に、後続のすべての実行を一時停止します。現在の実行は中断されません。suspend は CronJob の spec フィールドで指定します。

suspend のデフォルト値は false です。

履歴制限を指定する

オプションの successfulJobsHistoryLimitfailedJobsHistoryLimit は、保持する完了したジョブと失敗したジョブの数を指定します。これらのフィールドは CronJob の spec フィールドで指定します。

デフォルトで、successfulJobsHistoryLimit は 3 に設定され、failedJobsHistoryLimit は 1 に設定されます。これらのフィールドのどちらかの値を 0 に設定すると、どのジョブも完了後に保持されなくなります。

CronJob を検査する

CronJob のステータスをチェックするには、次のコマンドを実行します。

kubectl describe cronjob my-job

完了した CronJob によって作成されたポッドを含め、クラスタ内のすべてのポッドリソースを表示するには、次のコマンドを実行します。

kubectl get pods -a

-a フラグは、指定されたタイプのすべてのリソース(この場合はポッド)を表示するように指定します。

CronJob を削除する

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

kubectl delete cronjob [CRON_JOB]

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

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...