Kubernetes

Job じょぶ

Kubernetesバッチ処理Pod完了保証CronJobジョブ管理
JobってKubernetesの何なの?

簡単に言うとこんな感じ!

「やりきったら終わり」な作業をKubernetesにお願いする仕組みだよ!Webサーバーみたいにずっと動き続けるんじゃなくて、「このデータを変換して、終わったら報告してね」って1回限りのタスクを確実にやり切ってくれるコンテナの管理係なんだ!


Jobとは

Kubernetesの Job とは、1つ以上のPodを使って「完了」を目的とした処理を実行し、正常終了したことを保証するリソースです。Webアプリのように常時稼働し続けるサービスとは異なり、「やり切ったら終わり」という性質のバッチ処理・一括処理に使います。

たとえば「注文データを集計してCSVに書き出す」「DBのマイグレーションを実行する」「機械学習モデルをトレーニングする」といった、明確な終わりがある処理がJobの典型的なユースケースです。Jobは指定した数のPodが正常終了(exit code 0)するまで、失敗したPodを自動的に再起動・再生成してくれるため、「途中で失敗してサイレントに終わっていた」という事故を防げます。

Jobを使う一番のメリットは完了の保証です。システム担当者が手動でスクリプトを実行して結果を確認する代わりに、Kubernetesに処理を委ねることで、失敗時の自動リトライや実行ログの一元管理が実現します。


Jobの仕組みと主要パラメータ

Jobは spec に記述したパラメータによって、処理の並列度や繰り返し回数を細かくコントロールできます。

パラメータ意味省略時のデフォルト
completions正常終了させたいPodの合計数1
parallelism同時に動かすPodの最大数1
backoffLimit失敗時のリトライ上限回数6
activeDeadlineSecondsJob全体のタイムアウト秒数無制限
ttlSecondsAfterFinished完了後にJobを自動削除するまでの秒数自動削除しない

Jobの3つの実行パターン

Jobは completionsparallelism の組み合わせで3パターンの動き方ができます。

パターン1: 単発実行(デフォルト)
  completions=1 / parallelism=1
  → 1つのPodが成功したら終わり。最もシンプル。

パターン2: 固定数の並列実行
  completions=10 / parallelism=3
  → 3つ同時に動かしながら、合計10回成功したら終わり。
    大量データの分割処理などに。

パターン3: ワークキュー
  completions未指定 / parallelism=N
  → PodがキューからタスクをPullして処理。
    キューが空になるとJobは完了とみなす。

覚え方:「完了したら卒業」

Jobのキーワードは「completions(卒業単位)」です。Podが指定した数だけ卒業(正常終了)するまで、Kubernetesが粘り強く面倒を見てくれる、と覚えましょう。


歴史と背景

  • 2014年〜 Kubernetesの初期はWebサービス向けの DeploymentReplicationController が中心で、バッチ処理のサポートは後回しだった
  • 2015年 Kubernetes 1.0リリース前後に Job リソースが提案・実装される。コンテナでのバッチ処理ニーズが高まったことが背景
  • 2016年 CronJob(当初は ScheduledJob)が追加され、定期実行スケジューリングも対応
  • 2017年 Kubernetes 1.8で Job がStable(安定版)に昇格。本番利用が広く普及
  • 2021年以降 ttlSecondsAfterFinished によるJob自動クリーンアップがGAに。大量Jobの蓄積によるetcd肥大化問題への対処として定着
  • 現在 CI/CDパイプライン・ML学習・データ集計など、クラウドネイティブなバッチ処理の標準的な選択肢として定着

JobとDeployment・CronJobの比較

Kubernetesには「Podを管理するリソース」が複数あります。JobはそのうちDeploymentやCronJobと混同されやすいため、違いを整理します。

Kubernetes Podを管理するリソースの比較 Deployment 常時稼働 目的: サービスの継続稼働 終了条件: なし(ずっと動く) 失敗時: 自動再起動 完了保証: なし 例: WebAPI、 マイクロサービス Job 1回限りの実行 目的: 処理の完了保証 終了条件: completions達成 失敗時: リトライ(上限あり) 完了保証: あり ✓ 例: DB移行、 バッチ集計、ML学習 CronJob 定期実行 目的: スケジュール実行 終了条件: 各回のJob完了 失敗時: 次回実行まで待機 完了保証: Job単位でY 例: 毎日のレポート、 定期バックアップ CronJob は内部で Job を生成する。Job は Deployment の「完了ありき版」と覚えよう。

Jobのマニフェスト(YAML)例

apiVersion: batch/v1
kind: Job
metadata:
  name: data-export-job
spec:
  completions: 1        # 1回成功したら完了
  parallelism: 1        # 同時実行Pod数
  backoffLimit: 3       # 失敗時のリトライ上限
  ttlSecondsAfterFinished: 3600  # 完了1時間後に自動削除
  template:
    spec:
      restartPolicy: Never   # Job内PodはNever or OnFailure
      containers:
        - name: exporter
          image: my-app:latest
          command: ["python", "export.py"]

ポイント: JobのPodには restartPolicy: Never または OnFailure を指定する必要があります。Deploymentで使う Always(常に再起動)は指定できません。


関連する規格・RFC

規格・仕様内容
Kubernetes API batch/v1JobおよびCronJobが属するAPIグループ。kubectl api-resources で確認可
Kubernetes公式ドキュメント: JobsJobの公式リファレンス
CronJob仕様CronJobがJobを生成する仕組みの詳細

関連用語

  • Pod — Kubernetesで実際にコンテナが動く最小単位。JobはPodを生成・管理する
  • CronJob — cron形式のスケジュールでJobを定期的に生成・実行するリソース
  • Deployment — 常時稼働するアプリを管理するリソース。Jobとは目的が異なる
  • Pod restart policy — PodがクラッシュしたときKubernetesがどう振る舞うかの設定
  • namespace — KubernetesリソースをグループとJObを論理的に分離