k8s 中Job、Cronjob


Job負責處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束。

CronJob則就是在Job上加上了時間調度。

一、job

Job這個資源對象來創建一個任務,我們定一個Job來執行一個倒計時的任務,定義YAML文件

apiVersion: batch/v1
kind: Job
metadata:
  name: job-demo
spec:
  template:
    metadata:
      name: job-demo
    spec:
      restartPolicy: Never
      containers:
      - name: counter
        image: busybox
        command:
        - "bin/sh"
        - "-c"
        - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"

查看運行日志

#kubectl describe jobs job-demo
Name:           job-demo
Namespace:      default
Selector:       controller-uid=7813fcb3-6d4d-4153-a32e-ed675b32e37e
Labels:         controller-uid=7813fcb3-6d4d-4153-a32e-ed675b32e37e
                job-name=job-demo
Pods Statuses:  1 Running / 0 Succeeded / 2 Failed
Pod Template:
  Labels:  controller-uid=7813fcb3-6d4d-4153-a32e-ed675b32e37e
           job-name=job-demo
  Containers:
   counter:
    Image:      busybox
    Port:       <none>
    Host Port:  <none>
    Command:
      bin/bash
      -c
      for i in 9 8 7 6 5 4 3 2 1; do echo $i; done
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From            Message
  ----    ------            ----  ----            -------
  Normal  SuccessfulCreate  60s   job-controller  Created pod: job-demo-d26wx
  Normal  SuccessfulCreate  42s   job-controller  Created pod: job-demo-tm896
  Normal  SuccessfulCreate  2s    job-controller  Created pod: job-demo-wpbcs

https://kubernetes.io/zh/docs/concepts/workloads/controllers/job/   官網

注意JobRestartPolicy僅支持NeverOnFailure兩種,不支持Always,我們知道Job就相當於來執行一個批處理任務,執行完就結束了,如果支持Always的話是不是就陷入了死循環了?

二、CronJob

CronJob其實就是在Job的基礎上加上了時間調度,我們可以:在給定的時間點運行一個任務,也可以周期性地在給定時間點運行。這個實際上和我們Linux中的crontab就非常類似了。

一個CronJob對象其實就對應中crontab文件中的一行,它根據配置的時間格式周期性地運行一個Job,格式和crontab也是一樣的。

crontab的格式如下:

分 時 日 月 星期 要運行的命令 第1列分鍾0~59 第2列小時0~23) 第3列日1~31 第4列月1~12 第5列星期0~7(0和7表示星期天) 第6列要運行的命令

現在,我們用CronJob來管理我們上面的Job任務,

我們這里的KindCronJob了,要注意的是.spec.schedule字段是必須填寫的,用來指定任務運行的周期,格式就和crontab一樣,另外一個字段是.spec.jobTemplate, 用來指定需要運行的任務,格式當然和Job是一致的。還有一些值得我們關注的字段.spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimit,表示歷史限制,是可選的字段。它們指定了可以保留多少完成和失敗的Job,默認沒有限制,所有成功和失敗的Job都會被保留。然而,當運行一個Cron Job時,Job可以很快就堆積很多,所以一般推薦設置這兩個字段的值。如果設置限制的值為 0,那么相關類型的Job完成后將不會被保留.

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

查看cronjob

# kubectl get cronjob hello
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        51s             3m25s

# kubectl get pod
NAME                     READY   STATUS      RESTARTS   AGE
hello-1606739520-d67pb   0/1     Completed   0          87s
hello-1606739580-cpfbp   0/1     Completed   0          27s

# kubectl logs hello-1606739580-cpfbp
Mon Nov 30 12:33:25 UTC 2020
Hello from the Kubernetes cluster

https://kubernetes.io/zh/docs/tasks/job/automated-tasks-with-cron-jobs/     使用 CronJob 運行自動化任務

當然,也可以用kubectl run來創建一個CronJob

kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
$ kubectl get cronjob
NAME      SCHEDULE      SUSPEND   ACTIVE    LAST-SCHEDULE
hello     */1 * * * *   False     0         <none>
$ kubectl get jobs
NAME               DESIRED   SUCCESSFUL   AGE
hello-1202039034   1         1            49s
$ pods=$(kubectl get pods --selector=job-name=hello-1202039034 --output=jsonpath={.items..metadata.name} -a)
$ kubectl logs $pods
Mon Aug 29 21:34:09 UTC 2016
Hello from the Kubernetes cluster

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM