1. Jobs
Job 建立一或多個 Pod 並確保指定數量成功完成。
apiVersion: batch/v1
kind: Job
metadata:
name: data-process
spec:
completions: 5 # 需要成功完成 5 次
parallelism: 2 # 同時運行 2 個 Pod
backoffLimit: 4 # 最多重試 4 次後標記為失敗
activeDeadlineSeconds: 300 # 300 秒後逾時
template:
spec:
restartPolicy: Never # Job 必須: Never 或 OnFailure
containers:
- name: worker
image: busybox
command: ["sh", "-c", "echo Processing && sleep 10"]
| 欄位 | 說明 | 預設值 |
|---|---|---|
completions | 需要成功完成的 Pod 數 | 1 |
parallelism | 同時運行的 Pod 數 | 1 |
backoffLimit | 允許的最大重試次數 | 6 |
activeDeadlineSeconds | Job 整體逾時(秒) | 無限制 |
restartPolicy | 必須為 Never 或 OnFailure | — |
# 快速建立 Job
kubectl create job myjob --image=busybox -- echo "hello"
# 查看 Job 狀態
kubectl get jobs
kubectl describe job data-process
# 查看 Job 建立的 Pods
kubectl get pods --selector=job-name=data-process
2. CronJobs
apiVersion: batch/v1
kind: CronJob
metadata:
name: nightly-backup
spec:
schedule: "0 2 * * *" # 每天凌晨 2:00
concurrencyPolicy: Forbid # 不允許同時執行多個 Job
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
startingDeadlineSeconds: 200 # 排程錯過 200 秒後跳過
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: backup
image: postgres:15
command: ["pg_dump", "-h", "db-svc", "-U", "admin", "mydb"]
Cron 語法: ┌───── 分鐘 (0-59)
│ ┌───── 小時 (0-23)
│ │ ┌───── 日 (1-31)
│ │ │ ┌───── 月 (1-12)
│ │ │ │ ┌───── 星期 (0-6, 0=週日)
│ │ │ │ │
* * * * *
範例:
*/5 * * * * 每 5 分鐘
0 */2 * * * 每 2 小時
0 2 * * * 每天 02:00
0 0 * * 0 每週日 00:00
| concurrencyPolicy | 說明 |
|---|---|
| Allow(預設) | 允許多個 Job 同時執行 |
| Forbid | 前一個 Job 未完成則跳過本次排程 |
| Replace | 取消前一個 Job,啟動新的 |
3. Resource 管理基礎
resources:
requests:
cpu: "250m" # 排程保證最低 CPU
memory: "128Mi" # 排程保證最低記憶體
limits:
cpu: "500m" # 最大 CPU(超過被節流)
memory: "256Mi" # 最大記憶體(超過被 OOMKilled)
| QoS 等級 | 條件 |
|---|---|
| Guaranteed | CPU 和 Memory 的 requests == limits |
| Burstable | 至少設定一個 request 或 limit,但不符合 Guaranteed |
| BestEffort | 完全沒有設定 requests 和 limits |
考試重點: Job 的
restartPolicy只能設定Never或OnFailure,不能使用Always(Deployment 的預設值)。如果 CronJob 排程錯過的時間超過startingDeadlineSeconds,該次排程會被跳過。
4. 速查表
| 任務 | 指令 |
|---|---|
| 建立 Job | kubectl create job name --image=img -- cmd |
| 建立 CronJob | kubectl create cj name --image=img --schedule="* * * * *" -- cmd |
| 查看 Job 的 Pods | kubectl get pods -l job-name=name |
| 暫停 CronJob | kubectl patch cj name -p '{"spec":{"suspend":true}}' |
| 查看 QoS | kubectl describe pod name | grep -i qos |
5. 練習題
Q1: 一個 Job 設定了 completions: 3、parallelism: 2。Job 的執行行為是什麼?
- A) 啟動 3 個 Pod,每次 2 個並行,需要 2 個成功即可
- B) 最多同時運行 2 個 Pod,直到累計 3 個 Pod 成功完成 ✓
- C) 啟動 2 個 Pod,每個運行 3 次
- D) 啟動 3 個 Pod 全部並行運行
解析: completions=3 表示需要 3 次成功。parallelism=2 表示同時最多運行 2 個 Pod。因此先啟動 2 個 Pod,當某個完成後再啟動下一個,直到累計 3 個成功。
Q2: Job Pod 的 restartPolicy 設定為 Always。會發生什麼?
- A) Job 正常運行,Pod 失敗後自動重啟
- B) API Server 拒絕建立 Job,因為 restartPolicy 無效 ✓
- C) Pod 運行一次後永遠保持 Running 狀態
- D) Job controller 自動將 restartPolicy 改為 Never
解析: Job 的 restartPolicy 只允許 Never 或 OnFailure。Always(Deployment 預設值)不適用於 Job — 因為 Job 的 Pod 應該運行完畢後退出,而非永遠重啟。API Server 會在驗證階段拒絕此 spec。
Q3: CronJob 設定了 concurrencyPolicy: Forbid,前一次排程的 Job 仍在執行中。到了下一次排程時間。會發生什麼?
- A) 建立新 Job 並取消前一個
- B) 兩個 Job 並行執行
- C) 跳過本次排程,不建立新 Job ✓
- D) 將本次排程加入佇列,等前一個完成後執行
解析: Forbid 表示當前有 Job 仍在執行時,不允許啟動新的 Job。本次排程會被跳過。Replace 策略則會取消現有 Job 並啟動新的。Allow(預設)允許多個 Job 同時執行。