入門教程: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 最好的用例實踐是:

  1. **批處理任務:**比如說你想每天運行一次批處理任務,或者在指定日程中運行。它可能是像從存儲庫或數據庫中讀取文件那樣,將它們分配給一個服務來處理文件。

  2. **運維 / 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 的幾個關鍵參數:

  1. **failedJobHistoryLimit & successfulJobsHistoryLimit:**根據你提供的保留數量刪除失敗和成功的 job 歷史記錄。當你嘗試列出 job 時,這對於減少所有失敗的條目非常有用。例如:

  2. **backoffLimit:**如果你的 Pod 失敗,重試的總次數。

  3. **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