當前位置: 妍妍網 > 碼農

【運維幹貨分享】如何建立kubernetes jobs和cronjobs入門指南

2024-09-03碼農


此 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

    你應該會看到如下所示的輸出。

    Kubernetes 作業和 cronjob 演示

    多個 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 上的所有指標。