運行執行單個任務的pod

目前為止的pod都是屬於持續運行的pod,有時會遇到只想運行完成工作後就終止任務的情況。

ReplicaSet 和 ReplicationController 和 DaemonSet 會持續運行任務,永遠達不到完成狀態。這些pod中的程序在退出時會重新啟動。 但k8s提供了 Job 跟 CronJob資源,可以在完成任務中,其程序終止後,不應該在重新啟動。

介紹Job 資源

Job類型的pod在內部程序成功結束時,不重啟容器。一旦任務完成,pod就被認為處於完成狀態。 在發生節點故障時,該節點上由Job管理的pod將按照ReplicaSet的pod的方式,重新安排到其他節點。如果程序本身異常退出(程序返回錯誤退出代時),可以將Job設定為是否要重新啟動容器。 如下圖,如果一個job建立的pod,在最初被調度的節點上異常退出後,將被重新安排到其他節點上。圖片中另外顯示了未託管的pod(節點異常時沒有被重新安排) 和 由ReplicaSet管理的pod (節點異常後被重新安排)。

Job對於臨時任務(ad hoc tasks)很有用,關鍵是任務要以正確的方式結束。

你也可以在未託管的pod中運行任務並且等待它完成,但是萬一發生節點異常或者pod在執行任務的時候被節點逐出,則需要手動重新建立該任務,手動做這件事很不合理!! —— 特別是任務需要幾個小時才能完成。

圖4.10 由Job管理的pod會一直被重新安排,值到它們成功完成任務

圖4.10 由Job管理的pod會一直被重新安排,值到它們成功完成任務

1. 建立一個Job

建立 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管理時並不是這樣。)

2. 建立一個Job

[root@cp200 ch4]# kubectl create -f batch-job.yaml
job.batch/batch-job created

3. 觀察 jobs 跟 pod

[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

4. 過兩分鐘後,再次觀察 jobs 跟 pod

兩分鐘後,pod將不再出現在pod列表中,工作將被標記為Completed。預設情況下,除非使用 --show-all (或 -a),否則列出pod並不顯示已完成的pod

注意:新版的k8s已經捨棄了--show-all這參數,現在一律都會顯示Completed的pod。