溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么創(chuàng)建K8S Job及搞定批處理

發(fā)布時(shí)間:2021-12-16 09:51:48 來(lái)源:億速云 閱讀:241 作者:柒染 欄目:云計(jì)算

怎么創(chuàng)建K8S Job及搞定批處理,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

Kubernetes jobs主要是針對(duì)短時(shí)和批量的工作負(fù)載。它是為了結(jié)束而運(yùn)行的,而不是像deployment、replicasets、replication controllers和DaemonSets等其他對(duì)象那樣持續(xù)運(yùn)行。

下面將介紹如何創(chuàng)建Kubernetes jobs和cronjobs,以及一些小技巧。

Kubernetes Jobs會(huì)一直運(yùn)行到Job中指定的任務(wù)完成。也就是說(shuō),如果pods給出退出代碼0,那么Job就會(huì)退出。而在正常的Kubernetes中,無(wú)論退出代碼是什么,deployment對(duì)象在終止或出現(xiàn)錯(cuò)誤時(shí)都會(huì)創(chuàng)建新的pod,以保持deployment的理想狀態(tài)。

在job運(yùn)行過(guò)程中,如果托管pod的節(jié)點(diǎn)發(fā)生故障,Job pod將被自動(dòng)重新安排到另一個(gè)節(jié)點(diǎn)。

Kubernetes Jobs用例

對(duì)于Kubernetes Jobs最好的用例實(shí)踐是:

  1. 批處理任務(wù):比如說(shuō)你想每天運(yùn)行一次批處理任務(wù),或者在指定日程中運(yùn)行。它可能是像從存儲(chǔ)庫(kù)或數(shù)據(jù)庫(kù)中讀取文件那樣,將它們分配給一個(gè)服務(wù)來(lái)處理文件。

  2. 運(yùn)維/ad-hoc任務(wù):比如你想要運(yùn)行一個(gè)腳本/代碼,該腳本/代碼會(huì)運(yùn)行一個(gè)數(shù)據(jù)庫(kù)清理活動(dòng),甚至備份一個(gè)Kubernetes集群。

如何創(chuàng)建Kubernetes Job

在本例中,我們將使用Ubuntu 容器來(lái)運(yùn)行一個(gè)帶有for循環(huán)的shell腳本,并根據(jù)你傳遞給容器的參數(shù)來(lái)呼應(yīng)消息。這個(gè)參數(shù)是一個(gè)數(shù)字,決定shell腳本循環(huán)應(yīng)該運(yùn)行多少次。

例如,如果你傳遞了參數(shù)100,那么shell腳本將呼應(yīng)消息100次然后容器將會(huì)退出。

你可以訪問(wèn)以下鏈接查看Dockerfile和shell腳本: https://github.com/devopscube/Kubernetes-jobs-example/tree/master/Docker

我們先從一個(gè)簡(jiǎn)單設(shè)置的job開(kāi)始。

Step1:使用自定義的Docker鏡像創(chuàng)建一個(gè)job.yaml文件,命令參數(shù)為100。100將會(huì)作為參數(shù)傳遞給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

Step2 :使用kubectl創(chuàng)建一個(gè)job.yaml文件的job

kubectl apply -f job.yam

Step3:使用kubectl檢查job的狀態(tài)

kubectl get jobs

Step4:使用kubectl獲取pod列表

kubectl get po

Step5:使用kubectl獲取job pod 日志。使用你在輸出中看到的Pod名稱替換原本的Pod名稱。

kubectl logs kubernetes-job-example-bc7s9 -f

怎么創(chuàng)建K8S Job及搞定批處理

并行運(yùn)行多Job pods

當(dāng)一個(gè)job被部署后,你可以讓它在多個(gè)Pod上并行運(yùn)行。例如,在一個(gè)job中如果你想要運(yùn)行6個(gè) pods,同時(shí)并行運(yùn)行2個(gè)pods,你需要添加以下2個(gè)參數(shù)到你的job manifets中:

completions: 6
parallelism: 2

以下是帶有那些參數(shù)的manifest:

apiVersion: batch/v1
kind: Job
metadata:
  name: kubernetes-parallel-job
  labels:
    jobgroup: jobexample
spec:
  completions: 5
  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

為Kubernetes Job生成隨機(jī)名稱

你不能從一個(gè)job manifest文件中創(chuàng)建多個(gè)job,因?yàn)镵ubernetes會(huì)報(bào)錯(cuò),說(shuō)存在一個(gè)同名的job。為了規(guī)避這個(gè)問(wèn)題,你可以在元數(shù)據(jù)中添加 generateName 名稱參數(shù)。

例如:

apiVersion: batch/v1
kind: Job
metadata:
  generateName: kube-job-
  labels:
    jobgroup: jobexample

在上方示例中,每次你運(yùn)行該manifest,job將以kube-job-作為前綴,后面跟著一個(gè)隨機(jī)字符串來(lái)創(chuàng)建。

如何創(chuàng)建Kubernetes CronJob

如果你想按照特定的時(shí)間表運(yùn)行批處理job,例如,每2個(gè)小時(shí)運(yùn)行一次。你可以用cron表達(dá)式創(chuàng)建一個(gè)Kubernetes cronjob。Job會(huì)按照你在job中提到的時(shí)間表自動(dòng)啟動(dòng)。

下面我們將介紹如何指定一個(gè)cron計(jì)劃,你可以使用crontab生成器(https://crontab-generator.org/)來(lái)生成自己的時(shí)間計(jì)劃。

schedule: "0,15,30,45 * * * *"

下圖顯示了Kubernetes cronjob schedule語(yǔ)法。怎么創(chuàng)建K8S Job及搞定批處理 如果我們以cronjob的形式每15分鐘運(yùn)行一次我們之前的job,manifest應(yīng)該如下所示。創(chuàng)建一個(gè)名為cron-job.yaml的文件,并復(fù)制以下manifest:

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 列出cronjobs:

kubectl get cronjobs

你可以列出cronjob pod并從處于運(yùn)行狀態(tài)或完成狀態(tài)的pods中獲取日志來(lái)檢查Cronjob日志。

手動(dòng)運(yùn)行Kubernetes CronJob

在某些情況下,你可能希望以臨時(shí)的方式執(zhí)行cronjob。你可以通過(guò)從現(xiàn)有的cronjob創(chuàng)建一個(gè)job來(lái)實(shí)現(xiàn)。

例如,如果你想手動(dòng)觸發(fā)一個(gè)cronjob,我們應(yīng)該這樣做:

kubectl create job --from=cronjob/kubernetes-cron-job manual-cron-job

--from=cronjob/kubernetes-cron-job將復(fù)制cronjob模板并創(chuàng)建一個(gè)名為manual-cron-job的job。

Kubernetes Job的關(guān)鍵參數(shù)

根據(jù)你的需求,你還可以使用kubernetes jobs/cronjobs的幾個(gè)關(guān)鍵參數(shù):

  1. failedJobHistoryLimit & successfulJobsHistoryLimit:根據(jù)你提供的保留數(shù)量刪除失敗和成功的job歷史記錄。當(dāng)你嘗試列出job時(shí),這對(duì)于減少所有失敗的條目非常有用。例如:

  2. backoffLimit:如果你的Pod失敗,重試的總次數(shù)。

  3. activeDeadlineSeconds:如果你想對(duì)cronjob的運(yùn)行時(shí)間進(jìn)行硬性限制,可以使用此參數(shù)。例如,如果你想只運(yùn)行1分鐘的cronjob,你可以將其設(shè)置為60。

關(guān)于怎么創(chuàng)建K8S Job及搞定批處理問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI