Job じょぶ
簡単に言うとこんな感じ!
「やりきったら終わり」な作業を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 |
activeDeadlineSeconds | Job全体のタイムアウト秒数 | 無制限 |
ttlSecondsAfterFinished | 完了後にJobを自動削除するまでの秒数 | 自動削除しない |
Jobの3つの実行パターン
Jobは completions と parallelism の組み合わせで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サービス向けの
DeploymentやReplicationControllerが中心で、バッチ処理のサポートは後回しだった - 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と混同されやすいため、違いを整理します。
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/v1 | JobおよびCronJobが属するAPIグループ。kubectl api-resources で確認可能 |
| Kubernetes公式ドキュメント: Jobs | Jobの公式リファレンス |
| CronJob仕様 | CronJobがJobを生成する仕組みの詳細 |
関連用語
- Pod — Kubernetesで実際にコンテナが動く最小単位。JobはPodを生成・管理する
- CronJob — cron形式のスケジュールでJobを定期的に生成・実行するリソース
- Deployment — 常時稼働するアプリを管理するリソース。Jobとは目的が異なる
- Pod restart policy — PodがクラッシュしたときKubernetesがどう振る舞うかの設定
- namespace — KubernetesリソースをグループとJObを論理的に分離