CronJob

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

概要

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

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

始める前に

このタスクの準備として、次の手順を行います。

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • Google Kubernetes Engine API の有効化
  • Cloud SDK がインストール済みであることを確認します。
  • デフォルトのプロジェクト 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 が実行する内容について説明します。

期限を指定する

オプションの 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 [CRON_JOB]

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 get logs に Pod の名前を使用します。

kubectl get 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 [CRON_JOB]

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

次のステップ

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

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

Kubernetes Engine のドキュメント