1、Job

1.1 理论基础

Job是马上运行的一次性任务, job会创建一个或者多个 Pods,并确保指定数量的 Pods 成功终止。 随着 Pods 成功结束,Job 跟踪记录成功完成的 Pods 个数。 当数量达到指定的成功个数阈值时,任务(即 Job)结束。 删除 Job 的操作会清除所创建的全部 Pods。所以Job类型Pod的**restartPolicy**通常是**Never**或者**OnFailure**
一种简单的使用场景下,你会创建一个 Job 对象以便以一种可靠的方式运行某 Pod 直到完成。 当第一个 Pod 失败或者被删除(比如因为节点硬件失效或者重启)时,Job 对象会启动一个新的 Pod。

1.2 命令行创建Job

  1. [root@clientvm ~]# kubectl create job -h
  2. Create a job with the specified name.
  3. Usage:
  4. kubectl create job NAME --image=image [--from=cronjob/name] -- [COMMAND] [args...] [options]
  5. Examples:
  6. # Create a job
  7. kubectl create job my-job --image=busybox
  8. # Create a job with command
  9. kubectl create job my-job --image=busybox -- date
  10. # Create a job from a CronJob named "a-cronjob"
  11. kubectl create job test-job --from=cronjob/a-cronjob

操作范例;

  1. [root@clientvm ~]# kubectl create job my-job -n mytest --image=busybox -- echo hello
  2. job.batch/my-job created
  3. [root@clientvm ~]# kubectl get pod -n mytest
  4. NAME READY STATUS RESTARTS AGE
  5. my-job-4twr8 0/1 ContainerCreating 0 3s
  6. [root@clientvm ~]# kubectl get pod -n mytest
  7. NAME READY STATUS RESTARTS AGE
  8. my-job-4twr8 0/1 Completed 0 5s
  9. [root@clientvm ~]# kubectl logs my-job-4twr8 -n mytest
  10. hello
  11. [root@clientvm ~]# kubectl get jobs.batch -n mytest
  12. NAME COMPLETIONS DURATION AGE
  13. my-job 1/1 4s 70s
  14. ##删除Pod会自动创建
  15. [root@clientvm ~]# kubectl delete pod my-job-jp794 -n mytest
  16. pod "my-job-jp794" deleted
  17. [root@clientvm ~]#
  18. [root@clientvm ~]# kubectl get pod -n mytest
  19. NAME READY STATUS RESTARTS AGE
  20. my-job-c72bq 1/1 Running 0 46s

1.3 使用yaml创建job

生成yaml文件

  1. [root@clientvm ~]# kubectl create job my-job -n mytest --image=busybox --dry-run=client -o yaml -- sleep 200
  2. apiVersion: batch/v1
  3. kind: Job
  4. metadata:
  5. creationTimestamp: null
  6. name: my-job
  7. namespace: mytest
  8. spec:
  9. template:
  10. metadata:
  11. creationTimestamp: null
  12. spec:
  13. containers:
  14. - command:
  15. - sleep
  16. - "200"
  17. image: busybox
  18. name: my-job
  19. resources: {}
  20. restartPolicy: Never
  21. status: {}

创建Job

  1. [root@clientvm ~]# kubectl apply -f job.yaml
  2. job.batch/my-job created
  3. [root@clientvm ~]# kubectl get jobs.batch -n mytest
  4. NAME COMPLETIONS DURATION AGE
  5. my-job 0/1 38s 38s
  6. [root@clientvm ~]# kubectl get pod -n mytest
  7. NAME READY STATUS RESTARTS AGE
  8. my-job-n2z45 1/1 Running 0 49s

1.4 设置并行与完成次数

completions:设置完成次数
parallelism: 设置并行

  1. [root@clientvm ~]# kubectl explain job.spec
  2. KIND: Job
  3. VERSION: batch/v1
  4. ......
  5. completions <integer>
  6. Specifies the desired number of successfully finished pods the job should
  7. be run with.
  8. parallelism <integer>
  9. Specifies the maximum desired number of pods the job should run at any
  10. given time.

2、CronJob

Cron Job 创建基于时间调度的 Jobs
一个 CronJob 对象就像 crontab (cron table) 文件中的一行。 它用 Cron 格式进行编写, 并周期性地在给定的调度时间执行 Job。

CronJobs 对于创建周期性的、反复重复的任务很有用,例如执行数据备份或者发送邮件。 CronJobs 也可以用来计划在指定时间来执行的独立任务,例如计划当集群看起来很空闲时 执行某个 Job。

2.1 命令行创建CronJob

  1. [root@clientvm ~]# kubectl create cronjob -h
  2. Create a cronjob with the specified name.
  3. Usage:
  4. kubectl create cronjob NAME --image=image --schedule='0/5 * * * ?' -- [COMMAND] [args...] [flags] [options]
  5. Aliases:
  6. cronjob, cj
  7. Examples:
  8. # Create a cronjob
  9. kubectl create cronjob my-job --image=busybox --schedule="*/1 * * * *"
  10. # Create a cronjob with command
  11. kubectl create cronjob my-job --image=busybox --schedule="*/1 * * * *" -- date

范例:

  1. [root@clientvm ~]# kubectl create cronjob my-job -n mytest --image=busybox --schedule="*/1 * * * *" -- date
  2. cronjob.batch/my-job created
  3. [root@clientvm ~]# kubectl get cronjobs.batch -n mytest
  4. NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
  5. my-job */1 * * * * False 0 <none> 12s
  6. [root@clientvm ~]# kubectl get cronjobs.batch -n mytest
  7. NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
  8. my-job */1 * * * * False 1 10s 63s
  9. [root@clientvm ~]#
  10. [root@clientvm ~]#
  11. [root@clientvm ~]# kubectl get pod -n mytest
  12. NAME READY STATUS RESTARTS AGE
  13. my-job-1607481720-5dvr2 0/1 ContainerCreating 0 17s
  14. [root@clientvm ~]# kubectl get pod -n mytest
  15. NAME READY STATUS RESTARTS AGE
  16. my-job-1607481720-5dvr2 0/1 Completed 0 35s
  17. [root@clientvm ~]# kubectl get pod -n mytest
  18. NAME READY STATUS RESTARTS AGE
  19. my-job-1607481720-5dvr2 0/1 Completed 0 80s
  20. my-job-1607481780-sszc5 0/1 Completed 0 20s
  21. [root@clientvm ~]# kubectl logs my-job-1607481720-5dvr2 -n mytest
  22. Wed Dec 9 02:42:26 UTC 2020
  23. [root@clientvm ~]# kubectl describe cronjobs.batch -n mytest my-job
  24. Name: my-job
  25. Namespace: mytest
  26. Labels: <none>
  27. Annotations: <none>
  28. Schedule: */1 * * * *
  29. ......
  30. Events:
  31. Type Reason Age From Message
  32. ---- ------ ---- ---- -------
  33. Normal SuccessfulCreate 2m12s cronjob-controller Created job my-job-1607481720
  34. Normal SawCompletedJob 111s cronjob-controller Saw completed job: my-job-1607481720, status: Complete
  35. Normal SuccessfulCreate 71s cronjob-controller Created job my-job-1607481780
  36. Normal SawCompletedJob 51s cronjob-controller Saw completed job: my-job-1607481780, status: Complete
  37. Normal SuccessfulCreate 11s cronjob-controller Created job my-job-1607481840
  38. ## 删除
  39. [root@clientvm ~]# kubectl delete cronjobs.batch -n mytest my-job
  40. cronjob.batch "my-job" deleted

2.2 使用yaml创建CronJob

生成配置文件范例

  1. [root@clientvm ~]# kubectl create cronjob my-job -n mytest --image=busybox --dry-run=client -o yaml --schedule="*/1 * * * *" -- date
  2. apiVersion: batch/v1beta1
  3. kind: CronJob
  4. metadata:
  5. creationTimestamp: null
  6. name: my-job
  7. namespace: mytest
  8. spec:
  9. jobTemplate:
  10. metadata:
  11. creationTimestamp: null
  12. name: my-job
  13. spec:
  14. template:
  15. metadata:
  16. creationTimestamp: null
  17. spec:
  18. containers:
  19. - command:
  20. - date
  21. image: busybox
  22. name: my-job
  23. resources: {}
  24. restartPolicy: OnFailure
  25. schedule: '*/1 * * * *'
  26. status: {}

创建CronJob

  1. [root@clientvm ~]# kubectl apply -f cronjob.yaml
  2. cronjob.batch/my-job created
  3. [root@clientvm ~]# kubectl get cronjobs.batch -n mytest
  4. NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
  5. my-job */1 * * * * False 0 <none> 7s