目前為止的pod都是屬於持續運行的pod,有時會遇到只想運行完成工作後就終止任務的情況。
ReplicaSet 和 ReplicationController 和 DaemonSet 會持續運行任務,永遠達不到完成狀態。這些pod中的程序在退出時會重新啟動。 但k8s提供了 Job 跟 CronJob資源,可以在完成任務中,其程序終止後,不應該在重新啟動。
Job類型的pod在內部程序成功結束時,不重啟容器。一旦任務完成,pod就被認為處於完成狀態。 在發生節點故障時,該節點上由Job管理的pod將按照ReplicaSet的pod的方式,重新安排到其他節點。如果程序本身異常退出(程序返回錯誤退出代時),可以將Job設定為是否要重新啟動容器。 如下圖,如果一個job建立的pod,在最初被調度的節點上異常退出後,將被重新安排到其他節點上。圖片中另外顯示了未託管的pod(節點異常時沒有被重新安排) 和 由ReplicaSet管理的pod (節點異常後被重新安排)。
Job對於臨時任務(ad hoc tasks)很有用,關鍵是任務要以正確的方式結束。
你也可以在未託管的pod中運行任務並且等待它完成,但是萬一發生節點異常或者pod在執行任務的時候被節點逐出,則需要手動重新建立該任務,手動做這件事很不合理!! —— 特別是任務需要幾個小時才能完成。
圖4.10 由Job管理的pod會一直被重新安排,值到它們成功完成任務
建立 batch-job.yaml,裡面的batch-job這個映像檔,會執行一個120秒的程序,然後退出。
apiVersion: batch/v1
kind: Job
metadata:
name: batch-job
spec:
template:
metadata:
labels:
app: batch-job
spec:
restartPolicy: OnFailure # Job不能使用 Always 當作預設的重啟策略
containers:
- name: main
image: luksa/batch-job
Job不能使用 Always 做為 restartPolicy 的參數
在一般的pod定義中,可以指定在容器中執行的程序結束時,k8s會做什麼。這是透過 pod設定的屬性 restartPolicy 完成的,預設為 Always。 Job不可以使用Always預設策略,因為它們不是要無限期的運作。因此,需要將重啟策略restartPolicy 設定為 OnFailure 或者 Never。此設定防止容器在完成任務時重新啟動 (pod被Job管理時並不是這樣。)
[root@cp200 ch4]# kubectl create -f batch-job.yaml
job.batch/batch-job created
[root@cp200 ch4]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
batch-job 0/1 8s 8s
[root@cp200 ch4]# kubectl get pod
NAME READY STATUS RESTARTS AGE
batch-job-7qslg 1/1 Running 0 12s
兩分鐘後,pod將不再出現在pod列表中,工作將被標記為Completed。預設情況下,除非使用 --show-all (或 -a),否則列出pod並不顯示已完成的pod
注意:新版的k8s已經捨棄了--show-all這參數,現在一律都會顯示Completed的pod。