自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何使用Kubernetes Job運(yùn)行一次性任務(wù)

云計(jì)算 云原生
一旦任務(wù)完成,pod 就被認(rèn)為處于完成狀態(tài)。在發(fā)生節(jié)點(diǎn)故障時(shí),該節(jié)點(diǎn)上由 Job 管理的 pod 將按照 ReplicaSet 的 pod 的方式, 重新安排到其他節(jié)點(diǎn),以確保任務(wù)能夠成功完成,所以 Job 通常用于執(zhí)行一次性任務(wù)或批處理作業(yè)。Job 還可以控制 Pod 的數(shù)量,確保一定數(shù)量的 Pod 成功完成任務(wù)。

Job 概念

在 kubernetes 中,Deployment、DaemonSet會(huì)持續(xù)運(yùn)行任務(wù),這些 pod 中的進(jìn)程在崩潰退出時(shí)會(huì)重新啟動(dòng),永遠(yuǎn)達(dá)不到完成態(tài)。你也許會(huì)遇到這樣的場(chǎng)景,當(dāng)需要運(yùn)行一個(gè)一次性的可完成的任務(wù),其進(jìn)程終止后,不應(yīng)該再重新啟動(dòng),那么 Job 資源類型完全符合你。Kubernetes 中通過 Job 資源提供了對(duì)此的支持,它允許你運(yùn)行一種 pod,該 pod 在內(nèi)部進(jìn)程成功結(jié)束時(shí),不重啟容器。一旦任務(wù)完成,pod 就被認(rèn)為處于完成狀態(tài)。在發(fā)生節(jié)點(diǎn)故障時(shí),該節(jié)點(diǎn)上由 Job 管理的 pod 將按照 ReplicaSet 的 pod 的方式, 重新安排到其他節(jié)點(diǎn),以確保任務(wù)能夠成功完成,所以 Job 通常用于執(zhí)行一次性任務(wù)或批處理作業(yè)。Job 還可以控制 Pod 的數(shù)量,確保一定數(shù)量的 Pod 成功完成任務(wù)。Job 的一些常用使用場(chǎng)景:

  • 批處理作業(yè):Job可以被用來運(yùn)行需要大量計(jì)算資源的作業(yè),例如對(duì)大量數(shù)據(jù)的處理,機(jī)器學(xué)習(xí)模型訓(xùn)練等。
  • 數(shù)據(jù)處理:Job也可以用來處理大量數(shù)據(jù),例如數(shù)據(jù)的清洗、歸檔和備份等。
  • 定時(shí)任務(wù):Job可以被用來定期執(zhí)行一些任務(wù),例如定期生成報(bào)表、定期清理數(shù)據(jù)等。
  • 資源分配:通過Job控制器,我們可以為特定任務(wù)分配所需的計(jì)算資源,例如CPU和內(nèi)存等,以保證任務(wù)能夠順利執(zhí)行。

Job 定義

下面是一個(gè) Job 配置示例。它負(fù)責(zé)計(jì)算 π 到小數(shù)點(diǎn)后 2000 位,并將結(jié)果打印出來。此計(jì)算大約需要 10 秒鐘完成。job.yaml:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

創(chuàng)建它,查看Job 、Pods 的狀態(tài):Pod 狀態(tài)為 Running,說明已經(jīng)在執(zhí)行,Job 的 COMPLETIONS 為 0/1,表示按照預(yù)期啟動(dòng)了一個(gè) Pod,還未完成。

[root@nsg]/tmp/test# kubectl apply -f  job.yaml
job.batch/pi created
 
 
[root@nsg]/tmp/test# kubectl get jobs,pods
NAME           COMPLETIONS   DURATION   AGE
job.batch/pi   0/1           39s        39s
 
NAME           READY   STATUS    RESTARTS   AGE
pod/pi-d5f6q   1/1     Running   0          39s

等待大概10s左右,發(fā)現(xiàn)狀態(tài)已經(jīng)變?yōu)?Completed 了, kubectl logs 可以查看 Pod 的標(biāo)準(zhǔn)輸出:

[root@nsg]/tmp/test# kubectl get jobs,pods
NAME           COMPLETIONS   DURATION   AGE
job.batch/pi   1/1           43s        47s
 
NAME           READY   STATUS      RESTARTS   AGE
pod/pi-d5f6q   0/1     Completed   0          47s
 
 
# 查看日志
[root@nsg]/tmp/test# kubectl logs -f pi-d5f6q
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901
Job 失敗處理

Job 失敗處理

Job 的 restart 策略只有如下兩種(沒有pod的策略Always):

  1. Never:只要任務(wù)沒有完成,則新創(chuàng)建pod運(yùn)行,直到j(luò)ob完成,會(huì)產(chǎn)生多個(gè)pod。(默認(rèn))
  2. OnFailure:只要pod沒有完成,就會(huì)重啟pod,重新執(zhí)行任務(wù)。

如果失敗了會(huì)怎么樣呢?我們故意引入一個(gè)錯(cuò)誤,修改 job.yaml:將執(zhí)行命令修改為錯(cuò)誤的。

...
        command: ["per",  "", "-", ""]

創(chuàng)建它,查看Job 、Pods 的狀態(tài), 當(dāng) restart 策略為 Never 時(shí),會(huì)看到只要任務(wù)沒有完成,就會(huì)新創(chuàng)建pod運(yùn)行,直到j(luò)ob完成,會(huì)產(chǎn)生多個(gè)pod:

[root@nsg]/tmp/test# kubectl apply -f  job.yaml
job.batch/pi created
 
 
[root@nsg]/tmp/test# kubectl get jobs,pods
NAME           COMPLETIONS   DURATION   AGE
job.batch/pi   0/1           3m14s      3m14s
 
NAME           READY   STATUS       RESTARTS   AGE
pod/pi-9shvk   0/1     StartError   0          3m10s
pod/pi-gjwp7   0/1     StartError   0          2m
pod/pi-mp96m   0/1     StartError   0          2m40s
pod/pi-nrb64   0/1     StartError   0          3m14s
pod/pi-nznrc   0/1     StartError   0          3m

當(dāng) restart 策略為 OnFailure 時(shí),只要pod沒有完成,就會(huì)重啟pod,重新執(zhí)行任務(wù):

[root@nsg]/tmp/test# kubectl apply -f  job.yaml
job.batch/pi created
 
 
[root@nsg]/tmp/test# kubectl get jobs,pods
NAME           COMPLETIONS   DURATION   AGE
job.batch/pi   0/1           103s       103s
 
NAME           READY   STATUS              RESTARTS     AGE
pod/pi-drrft   0/1     RunContainerError   4 (8s ago)   103s

回退限制

backoffLimit 表示回退限制,可以指定重試幾次后將 Job 標(biāo)記為失敗。如果沒有明確指定它,則默認(rèn)為6。job.yaml:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  backoffLimit: 2
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

創(chuàng)建它,查看Job 、Pods 的狀態(tài), 可以看到重試了兩次,但是還是失敗了,后面就沒有再次重試了。

[root@nsg]/tmp/test# kubectl apply -f  job.yaml
job.batch/pi created  
 
[root@nsg]/tmp/test# kubectl get jobs,pods  
NAME           COMPLETIONS   DURATION   AGE
job.batch/pi   0/1           80s        80s
 
NAME           READY   STATUS       RESTARTS   AGE
pod/pi-6hqmr   0/1     StartError   0          76s
pod/pi-sj98k   0/1     StartError   0          80s
pod/pi-xc5k4   0/1     StartError   0          66s

并行執(zhí)行 Job

同時(shí)運(yùn)行多個(gè) Pod,提高 Job 的執(zhí)行效率。這個(gè)可以通過 parallelism 設(shè)置。

parallelism

job.yaml:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  parallelism: 2
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

創(chuàng)建它,查看Job 、Pods 的狀態(tài), Job 一共啟動(dòng)了兩個(gè) Pod,而且 AGE 相同,可見是并行運(yùn)行的。

[root@nsg]/tmp/test# kubectl apply -f  job.yaml
job.batch/pi created
 
 
[root@nsg]/tmp/test# kubectl get jobs,pods
NAME           COMPLETIONS   DURATION   AGE
job.batch/pi   2/1 of 2      8s         13s
 
NAME           READY   STATUS      RESTARTS   AGE
pod/pi-k9bfs   0/1     Completed   0          13s
pod/pi-ztcxv   0/1     Completed   0          13s

completions

還可以通過 completions 設(shè)置 Job 成功完成 Pod 的總數(shù) 修改 job.yaml:每次運(yùn)行兩個(gè) Pod,直到總共有 6 個(gè) Pod 成功完成。

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  parallelism: 2
  completions: 6
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

創(chuàng)建它,查看Job 、Pods 的狀態(tài), 可見一共有6個(gè)Pod完成任務(wù),符合預(yù)期。如果不指定 completions 和 parallelism,默認(rèn)值均為 1。

[root@nsg]/tmp/test# kubectl apply -f  job.yaml
job.batch/pi created
 
 
 
[root@nsg]/tmp/test# kubectl get jobs,pods
NAME           COMPLETIONS   DURATION   AGE
job.batch/pi   6/6           25s        31s
 
NAME           READY   STATUS      RESTARTS   AGE
pod/pi-67vm7   0/1     Completed   0          31s
pod/pi-bb8nl   0/1     Completed   0          22s
pod/pi-fchrq   0/1     Completed   0          14s
pod/pi-k47pr   0/1     Completed   0          22s
pod/pi-rt8n8   0/1     Completed   0          14s
pod/pi-zzc96   0/1     Completed   0          31s

自動(dòng)清理完成的 Job

發(fā)現(xiàn) Job 完成以后,Pod 依然存在,完成的 Job 通常不需要留存在系統(tǒng)中,在系統(tǒng)中一直保留它們會(huì)給 API 服務(wù)器帶來額外的壓力。

自動(dòng)清理已完成 Job (狀態(tài)為 Complete 或 Failed)的另一種方式是使用由 TTL 控制器 所提供 的 TTL 機(jī)制。通過設(shè)置 Job 的 .spec.ttlSecondsAfterFinished 字段,可以讓該控制器清理掉 已結(jié)束的資源。如果該字段設(shè)置為 0,Job 在結(jié)束之后立即成為可被自動(dòng)刪除的對(duì)象。如果該字段沒有設(shè)置,Job 不會(huì)在結(jié)束之后被 TTL 控制器自動(dòng)清除。嘗試一下:job.yaml:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:  
  ttlSecondsAfterFinished: 20 ##任務(wù)完成以后,20s自動(dòng)清理Pod
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

創(chuàng)建它,查看Job 、Pods 的狀態(tài)。

[root@nsg]/tmp/test# kubectl apply -f  job.yaml
job.batch/pi created  
 
  
[root@nsg]/tmp/test# kubectl get jobs,pods
NAME           COMPLETIONS   DURATION   AGE
job.batch/pi   1/1           8s         27s
 
NAME           READY   STATUS      RESTARTS   AGE
pod/pi-2k4b6   0/1     Completed   0          27s
 
# 等待20s后 立即刪除
[root@nsg]/tmp/test# kubectl get jobs,pods
No resources found in default namespace.

定時(shí)執(zhí)行 Job

Linux 中有 cron 程序定時(shí)執(zhí)行任務(wù),Kubernetes 的 CronJob 也提供了類似的功能,可以定時(shí)執(zhí)行 Job。CronJob 配置文件示例如下:cronjob.yaml:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: pi
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: pi
            image: perl:5.34.0
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: OnFailure

創(chuàng)建它,查看 cronjobs 、Pods 的狀態(tài), 可以看到每隔一分鐘就會(huì)啟動(dòng)一個(gè) Job:

[root@nsg]/tmp/test# kubectl apply -f cronjob.yaml
cronjob.batch/pi created
 
 
[root@nsg]/tmp/test# kubectl get cronjobs,pods
NAME               SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob.batch/pi   * * * * *   False     1        7s              2m36s
 
NAME                    READY   STATUS      RESTARTS   AGE
pod/pi-28255870-cd4mx   0/1     Completed   0          2m7s
pod/pi-28255871-9tv6x   0/1     Completed   0          67s
pod/pi-28255872-nl99x   0/1     Completed   0          7s

使用 Job 的注意事項(xiàng)

在使用 Kubernetes Job 時(shí),需要注意以下幾點(diǎn):

  1. Job 對(duì)象適用于一次性任務(wù)或批處理作業(yè),不適用于長(zhǎng)時(shí)間運(yùn)行的服務(wù)。
  2. 需要確保 Job Spec 中定義的容器可以正常運(yùn)行,并有足夠的資源和權(quán)限執(zhí)行指定的操作。
  3. 在設(shè)計(jì) Job 時(shí),應(yīng)考慮 Pod 失敗和重試的情況,并設(shè)置合適的重試次數(shù)和間隔時(shí)間。
  4. 如果 Job 執(zhí)行時(shí)間過長(zhǎng),需要設(shè)置合適的 Pod 生命周期以避免過度消耗資源。
  5. 在使用 Job 控制器時(shí),應(yīng)確??刂破鞯陌姹竞?Kubernetes 版本兼容。在不同版本之間可能存在語法變更和行為差異。

更多特性

參考官網(wǎng):https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/job/

責(zé)任編輯:武曉燕 來源: 云原生運(yùn)維圈
相關(guān)推薦

2010-11-24 16:32:50

2014-08-04 14:38:25

LinuxToken

2024-02-28 08:18:13

Java日志項(xiàng)目

2013-04-17 09:16:37

2024-04-03 09:00:10

2011-04-18 13:36:42

2021-07-26 09:56:19

AI 數(shù)據(jù)人工智能

2019-08-06 09:21:45

2021-08-12 09:48:21

Webpack Loa工具Webpack

2020-05-28 08:29:54

目錄腳本測(cè)試

2009-12-25 14:46:53

Windows 7文件關(guān)聯(lián)

2014-03-06 15:16:18

安全管理linux安全

2012-09-18 15:04:31

Office 2013微軟

2022-10-17 00:07:55

Go語言標(biāo)準(zhǔn)庫

2019-11-11 10:20:10

Linux重命名命令

2015-04-09 09:08:20

2012-02-01 16:48:54

后門Putty

2019-01-06 16:15:50

云計(jì)算SaaSIaaS

2020-11-02 13:44:56

CentOSK8SLinux

2021-09-24 16:30:03

存儲(chǔ)手機(jī)云存儲(chǔ)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)