此 kubernetes 教程介紹了如何建立 kubernetes 作業和 cronjobs,以及其基礎知識、用例以及一些提示和技巧。
以下是你將從本教程中學到的內容。
什麽是 Kubernetes 作業?
Kubernetes 作業和 cronjobs 是 Kubernetes 物件,主要用於短期和批次處理工作負載。
Kubernetes Job 物件基本上部署了一個 Pod,但它是為完成而執行的,而不是像 deployment、replicasets、replication controllers 和 DaemonSets 這樣的物件連續執行。
這意味著,作業會一直執行,直到作業中指定的任務完成,如果 Pod 提供結束程式碼0,則作業將結束。該任務可以是 shell 指令碼執行、API 呼叫或執行數據轉換並將其上傳到雲端儲存的 java python 執行。
而在正常的 Kubernetes 部署中,無論結束程式碼如何,部署物件都會在終止或引發錯誤時建立新的 Pod,以保持部署的所需狀態。
在 Job 執行期間,如果托管 Pod 的節點發生故障,則 Job Pod 將自動重新排程到另一個節點。
Kubernetes Jobs & CronJobs用例
Kubernetes 作業的最佳用例是:
批次處理:假設你希望每天執行一次或按特定計劃執行批次處理任務。它可以是從儲存或資料庫中讀取檔,並將它們提供給服務來處理檔。
操作/臨時任務:假設你想執行一個指令碼/程式碼來執行資料庫清理活動,甚至備份 kubernetes 集群本身。
在我參與的一個計畫中,我們廣泛使用 Kubernetes 作業來處理 ETL 工作負載。
如何建立 Kubernetes 作業
在此範例中,我將使用一個 Ubuntu 容器,該容器執行一個 shell 指令碼,該指令碼具有一個 for 迴圈,該迴圈根據你傳遞給容器的參數回顯訊息。參數應該是一個數位,它決定迴圈執行以回顯訊息的次數。
例如,如果你將 100 作為參數傳遞,shell 指令碼將回顯訊息 100 次,容器將結束。
你可以從這裏檢視 Dockerfile 和 shell 指令碼
FROM ubuntu:latest
COPY script.sh /script.sh
RUN chmod +x script.sh
ENTRYPOINT ["/script.sh"]
#! /bin/bash
LOOP_COUNT=$1
echo"This Job will echo message $1 times"
for ((i=1;i<=$LOOP_COUNT;i++));
do
sleep 2
echo$i] Hey I will run till the job completes.
done
讓我們透過簡單的設定開始 Job。
步驟1: 使用我們的自訂 Docker 映像建立一個job.yaml檔,並將 100 作為命令參數。值 100 將作為參數傳遞給 docker ENTRYPOINT 指令碼。
apiVersion: batch/v1
kind: Job
metadata:
name: kubernetes-job-example
labels:
jobgroup: jobexample
spec:
template:
metadata:
name: kubejob
labels:
jobgroup: jobexample
spec:
containers:
- name: c
image: devopscube/kubernetes-job-demo:latest
args: ["100"]
restartPolicy: OnFailure
步驟2:讓我們使用 kubectl 和該檔建立一個作業。作業將部署在名稱空間中。job.yamldefault
kubectl apply -f job.yaml
步驟3:使用 kubectl 檢查作業的狀態。
kubectl get jobs
步驟4: 現在,使用 kubectl 的 Pod 列表。
kubectl get po
步驟5:你可以使用 kubectl 獲取作業 Pod 日誌。將 Pod 名稱替換為你在輸出中看到的 Pod 名稱。
kubectl logs kubernetes-job-example-bc7s9 -f
你應該會看到如下所示的輸出。
多個 Job Pod 和並列度
部署作業後,你可以使其在多個 Pod 上執行,並具有並列性。
例如,在作業中,如果要執行 6 個 Pod 並並列執行 2 個 Pod,則需要將以下兩個參數添加到作業清單中。
completions: 6
parallelism: 2
該作業將並列執行 2 個 Pod 3 次,以實作 6 次完成。
下面是包含這些參數的清單檔。
apiVersion: batch/v1
kind: Job
metadata:
name: kubernetes-parallel-job
labels:
jobgroup: jobexample
spec:
completions: 6
parallelism: 2
template:
metadata:
name: kubernetes-parallel-job
labels:
jobgroup: jobexample
spec:
containers:
- name: c
image: devopscube/kubernetes-job-demo:latest
args: ["100"]
restartPolicy: OnFailure
並列 Pod 處理的一個用例是對訊息佇列的批次處理操作。假設你有一個訊息佇列,其中包含數千條訊息,需要在一天的特定時間處理。
你可以將訊息處理程式碼作為具有並列度的作業執行,以加快處理速度。即使所有 Pod 都使用相同的訊息處理程式碼,每個 Pod 也會處理佇列中的不同訊息。
為 Kubernetes 作業生成隨機名稱
你不能擁有單個任務清單檔並從中建立多個任務。Kubernetes 將引發錯誤,指出存在同名的作業。
要避免此問題,可以將 name 參數添加到後設資料中。generateName
例如
apiVersion: batch/v1
kind: Job
metadata:
generateName: kube-job-
labels:
jobgroup: jobexample
在上面的範例中,每次執行清單時,都會建立一個作業,其字首後跟一個隨機字串。kube-job-
如何建立 Kubernetes CronJob
如果你想按特定計劃(例如,每 2 小時)執行批次處理作業,該怎麽辦。你可以使用 cron 運算式建立 Kubernetes cronjob。該作業將按照你在作業中提到的計劃自動啟動。
以下是我們指定 cron 計劃的方法。你可以使用 crontab 生成器生成自己的計劃。
schedule: "0,15,30,45 * * * *"
下圖顯示了 kubernetes cronjob 排程語法。
如果我們每 15 分鐘將上一個作業作為 cronjob 執行一次,則它看起來像下面給出的清單。
建立一個名為 的檔並復制以下清單。cron-job.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: kubernetes-cron-job
spec:
schedule: "0,15,30,45 * * * *"
jobTemplate:
spec:
template:
metadata:
labels:
app: cron-batch-job
spec:
restartPolicy: OnFailure
containers:
- name: kube-cron-job
image: devopscube/kubernetes-job-demo:latest
args: ["100"]
讓我們使用 kubectl 部署 cronjob。
kubectl create -f cron-job.yaml
列出 cronjob
kubectl get cronjobs
要檢查 Cronjob 日誌,你可以列出 cronjob Pod,並從處於執行狀態的 Pod 或已完成的 Pod 中獲取日誌。
手動執行 Kubernetes CronJob
在某些情況下,你可能希望以臨時方式執行 cronjob。你可以透過從現有 cronjob 建立 job 來執行此操作。
例如,如果你想手動觸發一個 cronjob,這就是我們應該做的。
kubectl create job --from=cronjob/kubernetes-cron-job manual-cron-job
--from=cronjob/kubernetes-cron-job將復制 cronjob 樣版並建立一個名為manual-cron-job
幾個關鍵的 Kubernetes Job 參數
根據你的需要,你還可以將更多關鍵參數用於 kubernetes jobs/cronjobs。讓我們來看看每一個。
failedJobHistoryLimit & successfulJobsHistoryLimit:根據你提供的保留號刪除失敗和成功的作業歷史記錄。這對於在嘗試列出作業時修剪所有失敗的條目非常有用。例如
failedJobHistoryLimit: 5 successfulJobsHistoryLimit: 10 backoffLimit:Pod 失敗時的重試總數。
activeDeadlineSeconds 的 如果要指定 cronjob 執行時間的硬性限制,則可以使用此參數。例如,如果你只想執行 cronjob 一分鐘,則可以將其設定為 60。
監控 Kubernetes 作業和 Cronjobs
Kube 狀態指標提供了一些指標來監控 kubernetes 作業和 cronjobs。預設情況下,它不隨集群一起提供。你需要單獨設定 Kube 狀態指標。
有關支持的指標,請參閱 cronjob metrics 文件。
你可以透過 Prometheus 監控堆疊利用這些指標,並使用 Grafana 對其進行視覺化。
如果要監控 Jobs 或 Cronjobs 生成的自訂指標,則需要使用 Prometheus 推播閘道器來獲取 Prometheus 上的所有指標。