1. Jobs
Jobは完了まで実行して終了するタスクを作成します(Deploymentの常駐型とは異なる)。
apiVersion: batch/v1
kind: Job
metadata:
name: pi-calculator
spec:
completions: 5 # 合計5回成功する必要あり
parallelism: 2 # 同時に2つのPodを実行
backoffLimit: 4 # 最大4回リトライして失敗
activeDeadlineSeconds: 300 # 最大300秒で全体タイムアウト
template:
spec:
restartPolicy: Never # JobではNeverまたはOnFailure
containers:
- name: pi
image: perl:5.34
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
| フィールド | デフォルト | 意味 |
|---|---|---|
completions | 1 | 成功完了が必要な回数 |
parallelism | 1 | 同時実行Podの最大数 |
backoffLimit | 6 | 失敗リトライの最大回数 |
activeDeadlineSeconds | なし | Job全体の最大実行時間 |
試験のポイント: Jobの
restartPolicyはNeverまたはOnFailureのみ。Alwaysは使えません(Jobは完了して終了するため)。backoffLimitに達すると、JobはFailed状態になりPodの作成を停止します。
2. CronJobs
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 2 * * *" # 毎日2:00 AM (cron構文)
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
startingDeadlineSeconds: 200
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: backup
image: backup-tool:latest
command: ["/bin/sh", "-c", "backup.sh"]
| concurrencyPolicy | 動作 |
|---|---|
| Allow(デフォルト) | 前のJobが終わっていなくても新しいJobを作成 |
| Forbid | 前のJobが実行中なら新しいJobをスキップ |
| Replace | 前のJobをキャンセルして新しいJobを開始 |
Cron構文:
┌───────────── 分 (0 - 59)
│ ┌─────────── 時 (0 - 23)
│ │ ┌───────── 日 (1 - 31)
│ │ │ ┌─────── 月 (1 - 12)
│ │ │ │ ┌───── 曜日 (0 - 6, 0=日曜)
│ │ │ │ │
* * * * *
例:
"*/5 * * * *" = 5分ごと
"0 */2 * * *" = 2時間ごと
"0 9 * * 1-5" = 平日の9:00 AM
3. Resource Requests & Limits(基礎)
resources:
requests:
cpu: "250m" # スケジューリング用の最小CPU保証
memory: "128Mi" # 最小メモリ保証
limits:
cpu: "500m" # 最大CPU(超過するとスロットリング)
memory: "256Mi" # 最大メモリ(超過するとOOMKilled)
4. QoSクラス(概要)
| QoSクラス | 条件 | 退避優先度 |
|---|---|---|
| Guaranteed | CPUとメモリ両方でrequests == limits(全コンテナ) | 最低(最後に退避) |
| Burstable | 少なくとも1つのコンテナにrequest/limitあり、Guaranteedの条件を満たさない | 中間 |
| BestEffort | request/limitが一切なし | 最高(最初に退避) |
5. LimitRange & ResourceQuota
| リソース | スコープ | 用途 |
|---|---|---|
| LimitRange | 個々のPod/Container | デフォルトのrequests/limitsを設定、最大/最小を制限 |
| ResourceQuota | Namespace全体 | 合計CPU/メモリ/Podの上限を設定 |
# ResourceQuotaの例
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
spec:
hard:
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "8"
limits.memory: 16Gi
pods: "20"
6. チートシート
| タスク | コマンド |
|---|---|
| Jobを素早く作成 | kubectl create job myjob --image=busybox -- echo hi |
| CronJobを作成 | kubectl create cronjob mycron --image=busybox --schedule="*/5 * * * *" -- echo hi |
| Jobの状態確認 | kubectl get jobs |
| QoSクラス確認 | kubectl describe pod <name> | grep -i qos |
| リソース使用量 | kubectl top pods |
7. 練習問題
Q1: completions: 6、parallelism: 2のJobがあります。Podは何回作成されますか?
- A) 2
- B) 6 ✓
- C) 8
- D) 12
解説: completionsは成功完了が必要なPodの総数です。parallelismは同時に実行するPodの数です。合計6つのPodが作成されますが、同時に実行されるのは最大2つです。全体の実行時間は短縮されますが、Podの総数は変わりません。
Q2: concurrencyPolicy: ForbidのCronJobで、スケジュール時間に前のJobがまだ実行中の場合、何が起こりますか?
- A) 前のJobをキャンセルして新しいJobを開始する
- B) 前のJobと並行して新しいJobを実行する
- C) 新しいJobの実行をスキップする ✓
- D) 前のJobをキューに入れる
解説: Forbidは前のJobが実行中の場合、新しい実行を完全にスキップします。これによりバックアップジョブの重複実行などを防止できます。Allowの場合は並行実行を許可し、Replaceの場合は前のJobをキャンセルします。
Q3: コンテナのresourcesにrequests: cpu=500m, memory=256Mi、limits: cpu=500m, memory=256Miが設定されています。このPodのQoSクラスは何ですか?
- A) BestEffort
- B) Burstable
- C) Guaranteed ✓
- D) Critical
解説: Guaranteedの条件は、すべてのコンテナでCPUとメモリ両方のrequestsがlimitsと等しいことです。ここではcpu requests(500m) == cpu limits(500m)、memory requests(256Mi) == memory limits(256Mi)なので、QoSクラスはGuaranteedです。