Kubernetes CronJob:コンテナ環境での定期実行

Kubernetes CronJob

コンテナ環境での定期実行:Kubernetes CronJob の概要と基本的な使い方

従来のLinuxサーバーでは、cron や systemd timer を使って 定期実行を管理してきました。

しかし、コンテナ環境やクラウドネイティブな構成では、 Pod単位で処理を実行する必要があります。

そこで利用されるのが Kubernetes CronJob です。

Kubernetes CronJob は、 Kubernetesクラスタ上で 指定した時間にPodを起動する仕組みです。

cron のように時間ベースで処理を実行できますが、 実行単位はコンテナ(Pod)になります。

Kubernetes CronJobとは何か

CronJob は、Kubernetes のリソースの一種です。

内部的には、

  • CronJob
  • Job
  • Pod

という階層で動作します。

指定時刻になると CronJob が Job を生成し、 Job が Pod を起動して処理を実行します。

CronJobが適している場面

  • 定期バックアップ処理
  • データベース集計バッチ
  • ログ収集・転送処理
  • 定期レポート生成
  • APIポーリング処理

コンテナ環境で運用しているアプリケーションの 定期バッチは、CronJobで統一するのが一般的です。

基本的なCronJob定義(YAML例)

以下は、毎日3時に実行される簡単な例です。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: sample-cronjob
spec:
  schedule: "0 3 * * *"
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: sample
            image: alpine
            command: ["/bin/sh", "-c", "echo Hello Kubernetes"]
          restartPolicy: OnFailure

schedule には、 通常の cron と同じ書式を使用します。

CronJobの適用

$ kubectl apply -f cronjob.yaml

これでCronJobが作成されます。

CronJobの確認

$ kubectl get cronjobs

作成されたCronJob一覧を確認できます。

実行されたJobの確認

$ kubectl get jobs

実行履歴を確認できます。

Podの確認

$ kubectl get pods

実際に起動されたPodの状態を確認できます。

ログ確認

$ kubectl logs Pod名

コンテナの標準出力ログを確認できます。

主な設定項目

  • schedule:実行スケジュール(cron形式)
  • concurrencyPolicy:同時実行制御
  • successfulJobsHistoryLimit:成功履歴保持数
  • failedJobsHistoryLimit:失敗履歴保持数
  • startingDeadlineSeconds:実行遅延許容時間

特に concurrencyPolicy は重要です。

  • Allow(デフォルト)
  • Forbid(重複禁止)
  • Replace(前回を停止して再実行)

CronJobのメリット

  • コンテナネイティブ
  • スケール可能
  • クラスタ全体で管理可能
  • リソース制限が設定可能
  • 失敗時の再実行制御が可能

クラウド環境やマイクロサービス構成では、 非常に相性が良い仕組みです。

Cronとの違い

  • cron: 単一Linuxサーバー上で実行
  • Kubernetes CronJob: クラスタ上でPodとして実行

CronJobは単なる時間実行ではなく、 「コンテナとして処理を実行する」 という点が最大の違いです。

注意点

  • クラスタが停止していると実行されない
  • 実行履歴管理が必要
  • リソース設定を適切に行う必要がある
  • 時間同期(NTP)が重要

まとめ

Kubernetes CronJob は、 コンテナ環境における定期実行の標準的な仕組みです。

cronと同じスケジュール書式を使用しながら、 Podとして処理を実行できるため、 クラウドネイティブな設計に適しています。

単体サーバーでは cron、 systemd環境では timer、 アプリケーション非同期処理では Celery、 CI/CDでは Jenkins、 そしてコンテナ環境では CronJob。

用途に応じて適切に使い分けることが、 現代的なLinux・クラウド運用の鍵となります。