Job是用於一次性任務的工作負載,因此也被稱為“任務工作負載”,它保證處理任務的多個Pod運行到成功完成。本文介紹Job的特點,以及如何通過控制台或kubectl建立Job。
Job介紹
Deployment、StatefulSet與DaemonSet的目標都是保證一定數量的Pod持續運行,而Job的目標是讓一定數量的Pod運行到完成狀態。您可通過spec.completions與spec.parallelism指定Pod完成數量與並行數量。
適用情境 |
|
| Job行為 |
單次任務,例如資料庫初始化。 | 1 | 1 | 同時只運行一個Pod直到完成。 |
多個Pod並存執行,但只需其中部分返回結果的情境。例如在同時多個可用性區域執行任務以提高可靠性,但只需其中一個返回結果。 | M(M<N) | N | 同時運行N個Pod,其中有M個完成後即停止。 |
計算資源受限,無法同時運行所有Pod的情境。 | N | M(M<N) | 同時運行M個Pod,直到N個Pod完成。 |
資源充足情況下的並行任務,例如並行的資料處理。 | N | N | 同時運行N個Pod,直到N個Pod完成。 |
本文樣本使用的鏡像為公網鏡像,拉取時叢集或節點需具備公網訪問能力:
為叢集開啟訪問公網的能力(推薦):為叢集所在的VPC建立公網NAT Gateway,叢集中的所有資源均可訪問公網。
為節點分配固定公網IP:擁有公網IP的節點可拉取公網鏡像,但需要為部署工作負載的每個節點都分配公網IP。
建立Job
通過控制台建立
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在任務頁面,單擊使用鏡像建立。
在應用基本資料設定精靈頁面,設定應用的基本資料。然後單擊下一步,進入容器配置嚮導頁面。
在基本配置地區的鏡像名稱中輸入
registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest,在生命週期地區的中輸入/bin/sh,參數中輸入["-c", "echo 'starting...'; COUNTER=0; while [ $COUNTER -lt 5 ]; do sleep 2; COUNTER=$((COUNTER+1)); echo $COUNTER; done; echo 'finished'; exit 0"],如下圖所示。然後單擊下一步,進入進階設定精靈頁面。重要拉取
registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest鏡像前,您需要為叢集開啟公網訪問能力。如果您在建立叢集時,為專用網路配置SNAT選擇保持預設勾選,則叢集已擁有公網訪問能力。如果未選擇,請參見為叢集開啟訪問公網的能力。
在進階配置嚮導頁面中,您可配置Job的
completions與parallelism配置,將成功啟動並執行Pod數設定為2,它們的功能請參見上方的Job介紹。然後,單擊最下方的建立。
配置卡片
配置項
說明
任務設定
成功啟動並執行Pod數
spec.completions,指定進入完成狀態的Pod數量。並行啟動並執行Pod數
spec.parallelism,同時啟動並執行Pod數量。逾時時間
spec.activeDeadlineSeconds,Job的最大已耗用時間。Job已耗用時間超過此值後立即停止,不論是否完成。適用於有強制時效性要求或可能陷入無限迴圈的任務。預設值為600,單位秒(s)。重啟次數
spec.backoffLimit:Pod失敗後的最大重試次數,是該Job的所有Pod失敗次數的總和。預設值為6。重啟策略
template.spec.restartPolicy,Pod失敗後的重啟策略。不重啟:Pod中的容器異常退出後,嘗試原地重啟Pod(不建立 Pod)。重啟不計入
spec.backoffLimit。失敗時:Pod失敗後,建立新Pod進行替換。
標籤和註解
Pod標籤
為該工作負載所屬的每個Pod添加標籤(Label)。叢集中包括工作負載、Service在內的各種資源會通過標籤與Pod進行匹配。ACK為Pod預設添加格式為
app:(應用程式名稱)的標籤。Pod註解
為該工作負載所屬的每個Pod添加註解(Annotation)。ACK中的部分功能會使用到註解,您可在使用這些功能時再編輯。
在建立Job後,您可在控制台的Job日誌中看到兩個Pod輸出了相同的內容。

通過kubectl建立
建立工作負載前,請確保已通過kubectl串連到叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
複製下方的YAML檔案,並儲存到job.yaml中。
apiVersion: batch/v1 kind: Job metadata: name: example-job spec: completions: 2 # 兩個Pod完成後停止Job parallelism: 1 # 同時只運行一個Pod template: spec: containers: - name: counter image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest command: - /bin/sh - -c - | echo "starting..."; COUNTER=0; while [ $COUNTER -lt 5 ]; do sleep 2; COUNTER=$((COUNTER+1)); echo "${COUNTER}"; done; echo "finished"; exit 0 restartPolicy: Never # 不重啟Pod執行以下命令建立Job。
kubectl apply -f job.yaml預期輸出:
job.batch/example-job created等待約15秒後,執行以下命令查詢Job狀態。
kubectl get job example-job預期輸出如下,說明一個Pod已完成,Job仍處於
Running狀態。NAME STATUS COMPLETIONS DURATION AGE example-job Running 1/2 16s 16sJob建立後約40秒,執行以下命令查詢Job狀態。
kubectl get job example-job預期輸出如下,說明Job已完成。
NAME STATUS COMPLETIONS DURATION AGE example-job Complete 2/2 27s 37s執行以下命令查看Job日誌。
kubectl logs -l job-name=example-job預期輸出:
starting... 1 2 3 4 5 finished starting... 1 2 3 4 5 finished
相關文檔
CronJob會定時重複執行Job,適用於定時任務情境。更多資訊請參見建立定時任務工作負載CronJob。
若建立工作負載時出現問題,請參見工作負載FAQ。
若Pod出現異常問題,請參見Pod異常問題排查。