📑 目次
- Job: 終わりがあるタスクの始まり
- Jobの主要パラメータ: 完了と並列性
- CronJob: スケジュール通りに動くバッチ
- CKAD実践ヒント: コマンド1行で時間を稼ぐ
- Hands-on: 実践演習問題
概要: Kubernetesにおけるバッチ(Batch)ジョブとは? 🤔
Kubernetesクラスター上で動作するアプリケーションは、その性質によって大きく2つに分けられます。
- サービス型 (Long-running): ウェブサーバー、APIサーバーのように24時間稼働し続け、いつ来るかわからないユーザーのリクエストを待つアプリケーションです。(主にDeploymentで管理)
- バッチ型 (Batch): 特定の目的を達成するために実行され、すべての作業を終えると自ら「正常に終了(Completed)」するアプリケーションです。
バッチジョブは、簡単に言えば「開始と終了が明確な一回限りのタスク」です。
- 例:
- 毎日午前3時に実行するデータベースバックアップ
- 蓄積された大容量ログデータを分析して結果レポートを生成
- 新しいバージョンデプロイ前に実行するデータベーススキーママイグレーション
Kubernetesは、このようなバッチ処理を安定して処理するために、JobとCronJobという専用のリソースを提供します。CKAD試験では、これら2つの違いと詳細な設定方法を明確に理解しているかどうかが問われます。
##

##
1. Job: 終わりがあるタスクの始まり 🏁
一般的なDeploymentが「24時間ずっと死なずに稼働し続けるべきサービス」であるならば、Jobは「与えられた仕事を終えると優雅に終了するタスク」です。
- 用途: データベースマイグレーション、バッチレポート生成、画像処理など。
- 核心: Jobに属するPodは、作業が正常に完了するとCompleted状態になり終了します。
💡 基本YAML構造
apiVersion: batch/v1
kind: Job
metadata:
name: pi-calculator
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never # Jobでは必ずNeverまたはOnFailureを使用
backoffLimit: 4 # 失敗時の最大再試行回数
⚠️ 注意: JobのPodテンプレート内でrestartPolicyは絶対にAlwaysにはできません。作業が終了したら終了する必要があるためです!
2. Jobの主要パラメータ: 完了と並列性 ⚙️
CKAD試験では、単にJobを作成するだけでなく、特定の回数だけ成功させたり、同時に複数起動させたりすることが求められます。
| パラメータ | 説明 |
| — | — |
| completions | 合計で何回のPodの正常完了が必要か? (デフォルト1) |
| parallelism | 同時にいくつのPodを起動するか? (デフォルト1) |
| activeDeadlineSeconds | この時間(秒)を超えるとジョブを強制終了する。 |
| backoffLimit | 失敗時の再試行回数。これを超えると失敗とみなされる。 |
—
3. CronJob: スケジュール通りに動くバッチ ⏰
CronJobは、Linuxのcrontabのように、決められた時間に定期的にJobを生成するリソースです。
💡 Cronスケジュール構文 (Linux標準)
* * * * * (分 時 日 月 曜日)
- */5 * * * *: 5分ごとに実行
- 0 0 * * *: 毎日深夜0時に実行
💡 主要設定ポイント
- concurrencyPolicy: 前のタスクが終わっていないのに次のタスクの時間になったらどうするか?
- Allow (デフォルト): そのまま起動 (重複実行)
- Forbid: 前のタスクが終わるまで今回のタスクはスキップ
- Replace: 前のタスクを停止して新しいタスクを起動
- successfulJobsHistoryLimit: 成功した履歴をいくつ残すか決定 (デフォルト3)。
CronJob YAML作成例
apiVersion: batch/v1
kind: CronJob
metadata:
name: etcd-backup-cronjob
namespace: kube-system # システム管理リソースのため、主にkube-systemに配置
spec:
schedule: "0 3 * * * " # 毎日午前3時0分に実行 (分 時 日 月 曜日)
concurrencyPolicy: Forbid # 前回のバックアップが終了していない場合、今回の実行はスキップ (データ競合防止)
successfulJobsHistoryLimit: 5 # 成功したバックアップ記録(Job)は最新5件まで保持
failedJobsHistoryLimit: 2 # 失敗した記録は2件まで保持
jobTemplate:
spec:
template:
spec:
containers:
- name: etcd-backup
image: busybox # 実際の環境ではetcdctlを含むイメージを使用
command:
- /bin/sh
- -c
- echo "Starting etcd backup..."; date; echo "Backup to MetaKage completed!"
restartPolicy: OnFailure # 失敗時のみ再試行
4. CKAD実践ヒント: コマンド1行で時間を稼ぐ ⏱️
試験はスピード勝負です!YAMLを最初から打たないでください。
1) Job作成 (Imperative)
# 1. 基本Jobの作成
kubectl create job my-job --image=busybox -- echo "Hello"
# 2. YAMLにエクスポートしてオプションを修正 (completionsなど)
kubectl create job complex-job --image=busybox --dry-run=client -o yaml > job.yaml
2) CronJob作成
kubectl create cronjob my-cron --image=busybox --schedule="*/1 * * * *" -- echo "Time to work!"
5. Hands-on: 実践演習問題 🛠️
以下の条件をターミナルで直接実装してみてください。
シナリオ:
- ネームスペースbatch-nsを作成してください。
- busyboxイメージを使用してping-jobという名前のJobを作成してください。
- このJobは合計5回成功(completions)する必要があり、同時に2つ(parallelism)ずつ実行される必要があります。
- 実行コマンドはping -c 3 google.comです。
# 解答
kubectl create ns batch-ns
kubectl create job ping-job --image=busybox -n batch-ns --dry-run=client -o yaml -- ping -c 3 google.com > job.yaml
# vi job.yamlを編集
# specの直下にcompletions: 5, parallelism: 2を追加
kubectl apply -f job.yaml
kubectl get pods -n batch-ns -w # Podが2つずつ起動して終了するか確認!
コメントを残す