Chuyển đến nội dung chính

第2課: Jobs、CronJobs 與 Resource Management

Kubernetes Jobs(completions、parallelism、backoffLimit)與 CronJobs(排程語法、 concurrencyPolicy)。Resource requests/limits 基礎與 LimitRange/ResourceQuota。

Jobs 與 CronJobs — completions、parallelism 與排程

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
activeDeadlineSecondsJob 整體逾時(秒)無限制
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 等級條件
GuaranteedCPU 和 Memory 的 requests == limits
Burstable至少設定一個 request 或 limit,但不符合 Guaranteed
BestEffort完全沒有設定 requests 和 limits

考試重點: Job 的 restartPolicy 只能設定 Never 或 OnFailure,不能使用 Always(Deployment 的預設值)。如果 CronJob 排程錯過的時間超過 startingDeadlineSeconds,該次排程會被跳過。

4. 速查表

任務指令
建立 Jobkubectl create job name --image=img -- cmd
建立 CronJobkubectl create cj name --image=img --schedule="* * * * *" -- cmd
查看 Job 的 Podskubectl get pods -l job-name=name
暫停 CronJobkubectl patch cj name -p '{"spec":{"suspend":true}}'
查看 QoSkubectl 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 同時執行。