第十七章 kubernetes一次性任务与定时任务


一、Job 一次性任务概述

主要负责批处理任务,Job创建一个或多个Pod,并确保指定数量的Pod成功终止。Pod成功完成后,Job将跟踪成功完成的情况。当达到指定的成功完成次数时,任务(即Job)就完成了。删除Job将清除其创建的Pod。

一个简单的情况是创建一个Job对象,以便可靠地运行一个Pod来完成。如果第一个Pod发生故障或被删除(例如,由于节点硬件故障或节点重启),则Job对象将启动一个新的Pod。当然还可以使用Job并行运行多个Pod。

二、Job终止和清理

Job完成后,不会再创建其他Pod,但是Pod也不会被删除。这样使我们仍然可以查看已完成容器的日志,以检查是否有错误、警告或其他诊断输出。Job对象在完成后也将保留下来,以便您查看其状态。当我们删除Job对象时,对应的pod也会被删除。

特殊说明:
1)单个Pod时,默认Pod成功运行后Job即结束
2)restartPolicy 仅支持Never和OnFailure
3).spec.completions 标识Job结束所需要成功运行的Pod个数,默认为1
4).spec.parallelism 标识并行运行的Pod个数,默认为1
5).spec.activeDeadlineSeconds 为Job的持续时间,不管有多少Pod创建。一旦工作到指定时间,所有的运行pod都会终止且工作状态将成为type: Failed与reason: DeadlineExceeded。

三、Job示例

1.编写yaml文件

[root@kubernetes-master-001 ~]# vi job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  #completions: 3  # 标识Job结束所需要成功运行的Pod个数,默认为1
  template:
    spec:
      containers:
      - name: pi
        image: registry.cn-beijing.aliyuncs.com/google_registry/perl:5.26
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

2.创建一次性任务

[root@kubernetes-master-001 ~]# kubectl  apply -f  job.yaml 
job.batch/pi created

3.查看pod状态

# 查看,执行完成后,状态Status会变为Completed
[root@kubernetes-master-001 ~]# kubectl  get pods
NAME                   READY   STATUS              RESTARTS   AGE
ds-test-7krrv          1/1     Running             0          22h
ds-test-jnxzm          1/1     Running             0          22h
pi-bvvs4               0/1     ContainerCreating   0          106s
web-5bb6fd4c98-54ll2   1/1     Running             0          2d22h
web-5bb6fd4c98-585rn   1/1     Running             0          2d22h

[root@kubernetes-master-001 ~]# kubectl  get pods
NAME                   READY   STATUS      RESTARTS   AGE
ds-test-7krrv          1/1     Running     0          22h
ds-test-jnxzm          1/1     Running     0          22h
pi-bvvs4               0/1     Completed   0          2m21s
web-5bb6fd4c98-54ll2   1/1     Running     0          2d22h
web-5bb6fd4c98-585rn   1/1     Running     0          2d22h

4.查看 Pod 的标准输出

[root@kubernetes-master-001 ~]# kubectl  logs --tail 500 pi-bvvs4
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277

5.删除任务

[root@kubernetes-master-001 ~]# kubectl  delete  -f job.yaml 
job.batch "pi" deleted

四、Cronjob 定时任务概述

Cron Job 创建是基于时间调度的 Jobs

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

五、CronJob 限制

CronJob 创建 Job 对象,每个 Job 的执行次数大约为一次。 之所以说 “大约” ,是因为在某些情况下,可能会创建两个 Job,或者不会创建任何 Job。虽然试图使这些情况尽量少发生,但不能完全杜绝。因此,Job 应该是幂等的。

CronJob 仅负责创建与其调度时间相匹配的 Job,而 Job 又负责管理其代表的 Pod。

#1.使用案例:
1、在给定时间点调度Job
2、创建周期性运行的Job。如:数据备份、数仓导数、执行任务、邮件发送、数据拉取、数据推送

#2.特殊说明
.spec.schedule 必选,任务被创建和执行的调度时间。同Cron格式串,例如 0 * * * *。

.spec.jobTemplate 必选,任务模版。它和 Job的语法完全一样

.spec.startingDeadlineSeconds 可选的。默认未设置。它表示任务如果由于某种原因错过了调度时间,开始该任务的截止时间的秒数。过了截止时间,CronJob 就不会开始任务。不满足这种最后期限的任务会被统计为失败任务。如果没有该声明,那任务就没有最后期限。

.spec.concurrencyPolicy 可选的。它声明了 CronJob 创建的任务执行时发生重叠如何处理。spec 仅能声明下列规则中的一种:
1)Allow (默认):CronJob 允许并发任务执行。
2)Forbid:CronJob 不允许并发任务执行;如果新任务的执行时间到了而老任务没有执行完,CronJob 会忽略新任务的执行。
3)Replace:如果新任务的执行时间到了而老任务没有执行完,CronJob 会用新任务替换当前正在运行的任务。
请注意,并发性规则仅适用于相同 CronJob 创建的任务。如果有多个 CronJob,它们相应的任务总是允许并发执行的。

.spec.suspend 可选的。如果设置为 true ,后续发生的执行都会挂起。这个设置对已经开始执行的Job不起作用。默认是关闭的false。
备注:在调度时间内挂起的执行都会被统计为错过的任务。当 .spec.suspend 从 true 改为 false 时,且没有开始的最后期限,错过的任务会被立即调度。

.spec.successfulJobsHistoryLimit 和 .spec.failedJobsHistoryLimit 可选的。 这两个声明了有多少执行完成和失败的任务会被保留。默认设置为3和1。限制设置为0代表相应类型的任务完成后不会保留。
说明:如果 startingDeadlineSeconds 设置为很大的数值或未设置(默认),并且 concurrencyPolicy 设置为 Allow,则作业将始终至少运行一次。

六、CronJob示例

1.编写yaml文件

[root@kubernetes-master-001 ~]# vim cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

2.创建定时任务

[root@kubernetes-master-001 ~]# kubectl  apply  -f cronjob.yaml 
cronjob.batch/hello created

3.查看pod状态

# 查看,执行完成后,状态Status会变为Completed
[root@kubernetes-master-001 ~]# kubectl  get pods
NAME                   READY   STATUS              RESTARTS   AGE
ds-test-7krrv          1/1     Running             0          22h
ds-test-jnxzm          1/1     Running             0          22h
hello-27278409-kzdp8   0/1     ContainerCreating   0          106s
web-5bb6fd4c98-54ll2   1/1     Running             0          2d22h
web-5bb6fd4c98-585rn   1/1     Running             0          2d22h

[root@kubernetes-master-001 ~]# kubectl  get pods
NAME                   READY   STATUS      RESTARTS   AGE
ds-test-7krrv          1/1     Running     0          22h
ds-test-jnxzm          1/1     Running     0          22h
hello-27278409-kzdp8   0/1     Completed   0          41s
web-5bb6fd4c98-54ll2   1/1     Running     0          2d23h
web-5bb6fd4c98-585rn   1/1     Running     0          2d23h

4.查看 Pod 的标准输出

#1.查看详细的定时任务
[root@kubernetes-master-001 ~]# kubectl  get  cronjobs.batch  -o wide
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE     CONTAINERS   IMAGES                                                          SELECTOR
hello   */1 * * * *   False     0        17s             3m17s   hello        registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24   

#2.查看cronjob
[root@kubernetes-master-001 ~]# kubectl  get  job  -o wide
NAME             COMPLETIONS   DURATION   AGE     CONTAINERS   IMAGES                                                          SELECTOR
hello-27278409   1/1           6s         2m54s   hello        registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24   controller-uid=ed1fee63-b42f-4c79-a9ad-02de25ef756d
hello-27278410   1/1           2s         114s    hello        registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24   controller-uid=72adc412-165d-472c-9307-ee5597682ac9
hello-27278411   1/1           2s         54s     hello        registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24   controller-uid=46ddc73b-bc1a-436f-98cb-f021370f63d9

#3.找到最后一次调度任务创建的 Pod, 并查看 Pod 的标准输出。请注意任务名称和 Pod 名称是不同的。
[root@kubernetes-master-001 ~]# kubectl  logs hello-27278411-w6hwb
Fri Nov 12 08:11:01 UTC 2021
Hello from the Kubernetes cluster

5.删除任务

[root@kubernetes-master-001 ~]# kubectl get cronjob
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        32s             19m

[root@kubernetes-master-001 ~]# kubectl delete cronjob hello  # 或者 kubectl delete -f cronjob.yaml
cronjob.batch "hello" deleted

[root@kubernetes-master-001 ~]# kubectl get cronjob   # 可见已删除
No resources found in default namespace.

相关