iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0

Jobs


在K8s中,有提供一個支援批次處理應用的工具-job,我們可以利用 job 啟動多個應用程序pod去處理一批工作項,並在工作項執行完畢之後關閉相關的pod

以下是一個簡單的Job,目的是計算圓周率後2000位的數字,而這個pod會在計算完畢後自動關閉

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

利用以下指令便可以執行:

kubectl apply -f <YAML檔>

應該就可以看到終端機回應類似job.batch/pi created的文字,就代表pod創建成功了
接著利用log便可以看到他的輸出 (若下列指令出現錯誤,可能會需要先使用 kubectl get pods來取得pod名稱,再重新使用log就可看到結果)

kubectl logs pi

Job的類型&YAML檔的撰寫

如同其他的 config 檔,job 也需要有 apiVersionkindmetadata 的值

.spec

.spec 區塊僅有template為必要的項目,另外還有一些項目也必須符合

  • 必須設定適當的 label,也必須指定 RestartPolicy
  • RestartPolicy 僅可以是 NeverOnFailure

依據 Job 的行為可以把其歸類為三種,並有一些條列項目會因為種類而有 必要指定不能指定 情形:

  • Non-parallel Jobs:
    • 單一工作的 pod,當 pod 關閉時job就完成,除非 pod 異常才會重啟
    • (因未設置completion,會是預設值1)
    • (因未設置parallelism,會是預設值1)
  • Parallel Jobs with completion count
    • 並行 Job 會啟動多個 pod,此時需設定 .spec.completions 為一個正數,當pod的關閉數量到此數值時,job結束
    • 可以利用.spec.parallelism 可控制 job 並行的數量,預設值1
  • Parallel Jobs with a work queue
    • 因為我們不確定 work queue 有多少,我們 不可設定 .spec.completions,但可設定 .spec.parallelism,這個概念應該挺容易理解的,如果我們像 Parallel Jobs with completion count 一樣設置了completion,那麼一旦pod關閉到一定數量,但work queue還未處理完,就會發生災難,因此我們不可以設置這個值
    • 每個 pod 都要能獨立判斷和決定是否還有任務要處理,若確認無任務才能關閉
    • 當pod正常結束,則不會再重啟
    • 當全部pod都正常結束,job 才完成

以上就是 job 的YAML內容,寫完之後皆可利用kubectl apply的方式來執行他,明天來講講CronJob吧!


上一篇
第十八天 - Deployment
下一篇
第二十天 - CronJob
系列文
從認識Docker到精通30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言