管理短暫的一次性工作(Job)

2023/10/25閱讀時間約 6 分鐘

本篇說明何謂Job:

raw-image
  1. Job的類型
  2. Job controller
  3. Job 格式
  4. 暫停與重啟Job
  5. 範例
  6. 應用場景

1. Job的類型

以下表格很清楚的說明不同的Job類型與行為:

raw-image

2. Job controller

根據Job Spec建立Pod,並且持續監控Pod的狀態,直到成功結束。如果失敗,就根據restartPolicy(只支援OnFailure和Never, 不支援Always)決定是否創建新的Pod再次重試任務。

raw-image

3. Job 格式

  • spec.template格式同Pod
  • RestartPolicy只支援Never 或OnFailure
  • 單個Pod時,預設Pod成功運行後Job就結束
  • .spec.completions標記的Job結束需要成功運行的Pod個數,預設為1
  • .spec.parallelism標記出並行運作的Pod個數,預設為1
  • spec.activeDeadlineSeconds標記出失敗Pod的重試最大時間,超過就不會再繼續重試
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
metadata:
name: pi
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
# kubectl create -f job.yaml -n job
# kubectl discribe job pi -n job
# kubectl get pod --show-all -l job-name=pi -n job

※ 利用jsonpath取得POD ID並查看日誌
# pod=$(kubectl get pod -n job --selector=job-name=pi --output=jsonpath={.items.metadata.name})
# kubectl logs $pods
raw-image

4.暫停與重啟Job

從v1.21之後,就可以透過.spec.suspend暫停和重啟Job

apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
suspoend: true
parallelism: 1
completions: 5
template:
spec:
....

當Job暫停之後,Job conditions中就會出現一條Job暫停的event:

# kubectl get jobs/myjob -o yaml
apiVersion: batch/v1
kind: Job
# .metadata and .spec omitted
status:
conditions:
- lastProbeTime: "2021-02-05T13:14:33Z"
lastTransitionTime: "2021-02-05T13:14:33Z"
status: "True"
type: Suspended
startTime: "2021-02-05T13:13:48Z"

5.範例

### 執行單一Job
apiVersion: batch/v1
kind: Job
metadata:
name: finalcountdown
spec:
template:
metadata:
name: finalcountdown
spec:
containers:
- name: counter
image: busybox
command:
- bin/sh
- -c
- "for i in 9 8 7 6 5 4 3 2 1 ; do echo $i ; done"
restartPolicy: Never
# kubectl create -f simplejob.yaml -n simple-job
# kubectl get job -n simple-job
NAME COMPLETIONS DURATION AGE
finalcountdown 1/1 6s 9s

# kubectl describe jobs/finalcountdown -n simple-job
# kubectl log finalcountdown-xxxxx
raw-image
raw-image

6.應用場景

由於Job主要用於管理一次性任務或批次性任務,可以想像到有以下應用場景可能會適用:

  • 批次任務:適用在需要定期執行的任務,例如資料清洗、ETL作業、日誌分析、備份任務。透過建立Job來確保任務只會運行一次,並且在成功後就會停止。
  • 容器化應用初始化:在Kubernetes中部署容器化應用時,可以用來執行初始化任務,例如初始化資料庫、載入設定、設定環境變數等等。當任務結束,應用服務就可以啟動應用服務本身的初始化。
  • 並行性的任務:可以使用Job來建立多個Pod,加快任務的執行速度。
  • 資源清理:在任務執行完畢後,可用來清理或刪除資源,例如刪除臨時檔案、關閉不需要的容器或執行資源釋放。

跟據需求的變化,Job還可以有更多可應用的場景,只要理解Job的應用特性就可以想出更多有彈性的做法來協助管理整個平台上的任務。

10會員
40內容數
記錄IT社畜的自我學習筆記,如同專題名稱,主要是怕自已忘記自已做過什麼、學到什麼。索性就分享我自已在學習Kubernetes這條路上的各種測試、學習心得。
留言0
查看全部
發表第一個留言支持創作者!