入門教程:5 步創建 K8S Job,搞定批處理
Kubernetes jobs 主要是針對短時和批量的工作負載。它是爲了結束而運行的,而不是像 deployment、replicasets、replication controllers 和 DaemonSets 等其他對象那樣持續運行。
本文將介紹如何創建 Kubernetes jobs 和 cronjobs,以及一些小技巧。
Kubernetes Jobs 會一直運行到 Job 中指定的任務完成。也就是說,如果 pods 給出退出代碼 0,那麼 Job 就會退出。而在正常的 Kubernetes 中,無論退出代碼是什麼,deployment 對象在終止或出現錯誤時都會創建新的 pod,以保持 deployment 的理想狀態。
在 job 運行過程中,如果託管 pod 的節點發生故障,Job pod 將被自動重新安排到另一個節點。
Kubernetes Jobs 用例
對於 Kubernetes Jobs 最好的用例實踐是:
-
**批處理任務:**比如說你想每天運行一次批處理任務,或者在指定日程中運行。它可能是像從存儲庫或數據庫中讀取文件那樣,將它們分配給一個服務來處理文件。
-
**運維 / ad-hoc 任務:**比如你想要運行一個腳本 / 代碼,該腳本 / 代碼會運行一個數據庫清理活動,甚至備份一個 Kubernetes 集羣。
如何創建 Kubernetes Job
在本例中,我們將使用 Ubuntu 容器來運行一個帶有 for 循環的 shell 腳本,並根據你傳遞給容器的參數來呼應消息。這個參數是一個數字,決定 shell 腳本循環應該運行多少次。
例如,如果你傳遞了參數 100,那麼 shell 腳本將呼應消息 100 次然後容器將會退出。
你可以訪問以下鏈接查看 Dockerfile 和 shell 腳本:
https://github.com/devopscube/Kubernetes-jobs-example/tree/master/Docker
我們先從一個簡單設置的 job 開始。
**Step1:**使用自定義的 Docker 鏡像創建一個 job.yaml 文件,命令參數爲 100。100 將會作爲參數傳遞給 docker ENTRYPOINT 腳本。
1apiVersion: batch/v1
2kind: Job
3metadata:
4 name: kubernetes-job-example
5 labels:
6 jobgroup: jobexample
7spec:
8 template:
9 metadata:
10 name: kubejob
11 labels:
12 jobgroup: jobexample
13 spec:
14 containers:
15 - name: c
16 image: devopscube/kubernetes-job-demo:latest
17 args: ["100"]
18 restartPolicy: OnFailure
19
**Step2 :**使用 kubectl 創建一個 job.yaml 文件的 job
1kubectl apply -f job.yam
2
**Step3:**使用 kubectl 檢查 job 的狀態
1kubectl get jobs
2
**Step4:**使用 kubectl 獲取 pod 列表
1kubectl get po
2
**Step5:**使用 kubectl 獲取 job pod 日誌。使用你在輸出中看到的 Pod 名稱替換原本的 Pod 名稱。
1kubectl logs kubernetes-job-example-bc7s9 -f
2
你應該看到如下輸出:
並行運行多 Job pods
當一個 job 被部署後,你可以讓它在多個 Pod 上並行運行。例如,在一個 job 中如果你想要運行 6 個 pods,同時並行運行 2 個 pods,你需要添加以下 2 個參數到你的 job manifets 中:
1completions: 6
2parallelism: 2
3
以下是帶有那些參數的 manifest:
1apiVersion: batch/v1
2kind: Job
3metadata:
4 name: kubernetes-parallel-job
5 labels:
6 jobgroup: jobexample
7spec:
8 completions: 5
9 parallelism: 2
10 template:
11 metadata:
12 name: kubernetes-parallel-job
13 labels:
14 jobgroup: jobexample
15 spec:
16 containers:
17 - name: c
18 image: devopscube/kubernetes-job-demo:latest
19 args: ["100"]
20 restartPolicy: OnFailure
21
爲 Kubernetes Job 生成隨機名稱
你不能從一個 job manifest 文件中創建多個 job,因爲 Kubernetes 會報錯,說存在一個同名的 job。爲了規避這個問題,你可以在元數據中添加 generateName 名稱參數。
例如:
1apiVersion: batch/v1
2kind: Job
3metadata:
4 generateName: kube-job-
5 labels:
6 jobgroup: jobexample
7
在上方示例中,每次你運行該 manifest,job 將以 kube-job- 作爲前綴,後面跟着一個隨機字符串來創建。
如何創建 Kubernetes CronJob
如果你想按照特定的時間表運行批處理 job,例如,每 2 個小時運行一次。你可以用 cron 表達式創建一個 Kubernetes cronjob。Job 會按照你在 job 中提到的時間表自動啓動。
下面我們將介紹如何指定一個 cron 計劃,你可以使用 crontab 生成器(https://crontab-generator.org/)來生成自己的時間計劃。
1schedule: "0,15,30,45 * * * *"
2
下圖顯示了 Kubernetes cronjob schedule 語法。
來源:kubernetes.io
如果我們以 cronjob 的形式每 15 分鐘運行一次我們之前的 job,manifest 應該如下所示。創建一個名爲 cron-job.yaml 的文件,並複製以下 manifest:
1apiVersion: batch/v1beta1
2kind: CronJob
3metadata:
4 name: kubernetes-cron-job
5spec:
6 schedule: "0,15,30,45 * * * *"
7 jobTemplate:
8 spec:
9 template:
10 metadata:
11 labels:
12 app: cron-batch-job
13 spec:
14 restartPolicy: OnFailure
15 containers:
16 - name: kube-cron-job
17 image: devopscube/kubernetes-job-demo:latest
18 args: ["100"]
19
讓我們使用 kubectl 部署 cronjob。
1kubectl create -f cron-job.yaml
2
列出 cronjobs:
1kubectl get cronjobs
2
你可以列出 cronjob pod 並從處於運行狀態或完成狀態的 pods 中獲取日誌來檢查 Cronjob 日誌。
手動運行 Kubernetes CronJob
在某些情況下,你可能希望以臨時的方式執行 cronjob。你可以通過從現有的 cronjob 創建一個 job 來實現。
例如,如果你想手動觸發一個 cronjob,我們應該這樣做:
1kubectl create job --from=cronjob/kubernetes-cron-job manual-cron-job
2
--from=cronjob/kubernetes-cron-job 將複製 cronjob 模板並創建一個名爲 manual-cron-job 的 job。
Kubernetes Job 的關鍵參數
根據你的需求,你還可以使用 kubernetes jobs/cronjobs 的幾個關鍵參數:
-
**failedJobHistoryLimit & successfulJobsHistoryLimit:**根據你提供的保留數量刪除失敗和成功的 job 歷史記錄。當你嘗試列出 job 時,這對於減少所有失敗的條目非常有用。例如:
-
**backoffLimit:**如果你的 Pod 失敗,重試的總次數。
-
**activeDeadlineSeconds:**如果你想對 cronjob 的運行時間進行硬性限制,可以使用此參數。例如,如果你想只運行 1 分鐘的 cronjob,你可以將其設置爲 60。
通過本文我們瞭解了創建 Job 以及 Cron Job 的步驟並且一些詳細的配置過程和關鍵參數,希望藉由本文可以幫助你開始上手瞭解 K8S Job 和 Cron Job,輕鬆搞定批處理任務!
原文鏈接:
https://devopscube.com/create-kubernetes-jobs-cron-jobs/
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/j3ENDL42Pv2SdL9Gy61Tsg