第10关 k8s架构师课程之一次性和定时任务
参考博客:https://www.bilibili.com/video/BV1qh411Q7Pf?spm_id_from=333.999.0.0
https://www.toutiao.com/i6942074614386573831/
ob, CronJob
大家好,我是博哥爱运维,有时候我们想在K8s跑个一次性任务,或者是定时任务,能不能实现呢,答案肯定是可以的。
job
首先讲下一次性任务,在K8s中它叫job,直接来实战一番,先准备下yaml配置
这里我们不知道yaml怎么写,可以直接kubectl create job -h就能看到命令行创建示例了,然后可以根据创建出来的服务资源来导出它的yaml配置为my-job.yaml
apiVersion: batch/v1 # 1. batch/v1 是当前 Job 的 apiVersion kind: Job # 2. 指明当前资源的类型为 Job metadata: name: my-job spec: template: metadata: spec: containers: - image: busybox name: my-job command: ["echo","Hello, boge."] restartPolicy: Never # 3. restartPolicy 指定什么情况下需要重启容器。对于 Job,只能设置为 Never 或者 OnFailure关于重启策略设置的说明:
如果指定为OnFailure,则job会在pod出现故障时重启容器,而不是创建pod,failed次数不变
如果指定为Never,则job会在pod出现故障时创建新的pod,并且故障pod不会消失,也不会重启,failed次数加1
如果指定为Always的话,就意味着一直重启,意味着job任务会重复去执行了,当然不对,所以不能设置为Always
创建它并查看结果
# kubectl apply -f my-job.yaml job.batch/my-job created # kubectl get jobs.batch NAME COMPLETIONS DURATION AGE my-job 1/1 2s 73s # COMPLETIONS 已完成的 # DURATION 这个job运行所花费的时间 # AGE 这个job资源已经从创建到目前为止的时间 # job会生成一个pod,当完成任务后会是Completed的状态 # kubectl get pod NAME READY STATUS RESTARTS AGE my-job-7h6fb 0/1 Completed 0 31s # 看下这个job生成的pod日志 # kubectl logs my-job-7h6fb Hello, boge.
job失败了会有什么现象出现呢?
我们编辑这个job的yaml,把执行的命令改成一个不存在的命令看看会发生什么
apiVersion: batch/v1 # 1. batch/v1 是当前 Job 的 apiVersion kind: Job # 2. 指明当前资源的类型为 Job metadata: name: my-job spec: template: metadata: spec: containers: - image: busybox name: my-job command: ["echoaaa","Hello, boge."] restartPolicy: Never # 3. restartPolicy 指定什么情况下需要重启容器。对于 Job,只能设置为 Never 或者 OnFailure
# kubectl apply -f my-job.yaml # 可以观察到这个job因为不成功,并且restartPolicy重启模式是Never不会被重启,但它的job状态始终未完成,所以它会一直不停的创建新的pod,直到COMPLETIONS为1/1,对于我们这个示例,它显然永远都不会成功 # kubectl get pod NAME READY STATUS RESTARTS AGE my-job-9fcbm 0/1 StartError 0 47s my-job-bt2kd 0/1 StartError 0 54s my-job-mlnzz 0/1 StartError 0 37s my-job-mntdp 0/1 StartError 0 17s # kubectl get job NAME COMPLETIONS DURATION AGE my-job 0/1 15s 15s # 找一个pod看下事件描述,会很清晰地指出命令不存在 # kubectl describe pod my-job-9fcbm Name: my-job-9fcbm Namespace: default ...... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 44s default-scheduler Successfully assigned default/my-job-9fcbm to 10.0.0.204 Normal Pulling 43s kubelet Pulling image "busybox" Normal Pulled 36s kubelet Successfully pulled image "busybox" in 7.299038719s Normal Created 36s kubelet Created container my-job Warning Failed 36s kubelet Error: failed to create containerd task: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "echoaaa": executable file not found in $PATH: unknown # 删除掉这个job,不然那创建的pod数量可有够多的了 # kubectl delete job my-job # 试试把restartPolicy重启模式换成OnFailure观察看看 # kubectl get pod NAME READY STATUS RESTARTS AGE my-job-gs95h 0/1 CrashLoopBackOff 3 84s # 可以看到它不会创建新的pod,而是会尝试重启自身,以期望恢复正常,这里看到已经重启了3次,还会持续增加到5,然后会被K8s给删除以尝试,因为这里只是job而不是deployment,它不会自己再启动一个新的pod,所以这个job等于就没有了,这里说明OnFailure是生效的,至少不会有那么多错误的pod出现了这里有几个参数相当的重点:
completions: 1 # 指定job需要成功运行Pods的次数。默认值: 1
parallelism: 1 # 指定job在任一时刻应该并发运行Pods的数量。默认值: 1
activeDeadlineSeconds: 30 # 指定job可运行的时间期限,超过时间还未结束,系统将会尝试进行终止。
backoffLimit: 6 # 指定job失败后进行重试的次数。默认是6
k8s使用Job执行任务失败了怎么办
参考博客:https://www.cnblogs.com/liabio/archive/2019/10/16/11683743.html
Kubernetes 中使用 Job 和 CronJob 两个资源分别提供了一次性任务和定时任务的特性,这两种对象也使用控制器模型来实现资源的管理,我们在这篇文章来介绍Job执行如果失败了会怎么样呢?
修改job-fail.yaml,故意引入一个错误:
Never
如果将
restartPolicy
设置为Never
会怎么样?下面我们实践一下,修改job-fail.yaml后重新启动。运行 Job 并查看状态,可以看到Never策略的job,pod失败后,重新创建:
直到重新创建7个(spec.backoffLimit默认为6,即重试6次,共7个pod)pod都失败后,认为失败,job的status里会更新为Failed当前
Completion
的数量为0
查看 Pod 的状态:
可以看到有多个 Pod,状态均不正常。
kubectl describe pod
查看某个 Pod 的启动日志:
日志显示没有可执行程序,符合我们的预期。
为什么
kubectl get pod
会看到这么多个失败的 Pod?原因是:当第一个 Pod 启动时,容器失败退出,根据
restartPolicy: Never
,此失败容器不会被重启,但 JobDESIRED
的 Pod 是1
,目前SUCCESSFUL
为0
,不满足,所以 Job controller 会启动新的 Pod,直到SUCCESSFUL
为1
。对于我们这个例子,SUCCESSFUL
永远也到不了1
,所以 Job controller 会一直创建新的 Pod,直到设置的数量,失败后pod不会自动被删除,为了终止这个行为,只能删除 Job,pod也会被同时删掉。
OnFailure
如果将
restartPolicy
设置为OnFailure
会怎么样?下面我们实践一下,修改job-fail.yaml后重新启动。
Job 的
Completions
Pod 数量还是为0
,看看 Pod 的情况:
这里只有一个 Pod,不过
RESTARTS
在不断增加,说明OnFailure
生效,容器失败后会自动重启。6次失败后,pod被删除:
同时更新job的status为失败,方便查看最终执行结果:
# 试试把restartPolicy重启模式换成OnFailure观察看看# kubectl get podNAME READY STATUS RESTARTS AGEmy-job-gs95h 0/1 CrashLoopBackOff 3 84s# 可以看到它不会创建新的pod,而是会尝试重启自身,以期望恢复正常,这里看到已经重启了3次,还会持续增加到5,然后会被K8s给删除以尝试,因为这里只是job而不是deployment,它不会自己再启动一个新的pod,所以这个job等于就没有了,这里说明OnFailure是生效的,至少不会有那么多错误的pod出现了
并行执行job
准备好yaml配置并行执行job
准备好yaml配置apiVersion: batch/v1
kind: Job metadata: name: my-job spec: parallelism: 2 # 并行执行2个job template: metadata: name: my-job spec: containers: - image: busybox name: my-job command: ["echo","Hello, boge."] restartPolicy: OnFailure
创建并查看结果
# kubectl apply -f my-job.yaml job.batch/my-job created # job一共启动了2个pod,并且它们的AGE一样,可见是并行创建的 # kubectl get pod NAME READY STATUS RESTARTS AGE my-job-fwf8l 0/1 Completed 0 7s my-job-w2fxd 0/1 Completed 0 7s
再来个组合测试下并行完成定制的总任务数量
apiVersion: batch/v1 kind: Job metadata: name: myjob spec: completions: 6 # 此job完成pod的总数量 parallelism: 2 # 每次并发跑2个job template: metadata: name: myjob spec: containers: - name: hello image: busybox command: ["echo"," hello boge! "] restartPolicy: OnFailure
创建并查看结果
# 可以看到是每次并发2个job,完成6个总量即停止 # kubectl get pod NAME READY STATUS RESTARTS AGE myjob-54wmk 0/1 Completed 0 11s myjob-fgtmj 0/1 Completed 0 15s myjob-fkj5l 0/1 Completed 0 7s myjob-hsccm 0/1 Completed 0 7s myjob-lrpsr 0/1 Completed 0 15s myjob-ppfns 0/1 Completed 0 11s # 符合预期 # kubectl get job NAME COMPLETIONS DURATION AGE myjob 6/6 14s 34s # 测试完成后删掉这个资源 kubectl delete job myjob
到此,job的内容就讲完了,在生产中,job比较适合用在CI/CD流水线中,作完一次性任务使用,我在生产中基本没怎么用这个资源。 接下来,调整下pod运行的总数量和并行数量 即:在spec下设置下面两个选项
# completions: 6 # 指定job需要成功运行Pods的次数为6
# parallelism: 2# 指定job并发运行Pods的数量为2
# 然后重新运行job,观察效果,此时会发现,job会每次运行2个pod,总共执行了6个pod
cronjob
上面的job是一次性任务,那我们需要定时循环来执行一个任务可以吗?答案肯定是可以的,就像我们在linux系统上面用crontab一样,在K8s上用cronjob的另一个好处就是它是分布式的,执行的pod可以是在集群中的任意一台NODE上面(这点和cronsun有点类似)
让我们开始实战吧,先准备一下cronjob的yaml配置为my-cronjob.yaml
让我们开始实战吧,先准备一下cronjob的yaml配置为my-cronjob.yaml
apiVersion:batch/v1beta1 # <--------- 当前 CronJob 的 apiVersionkind:CronJob # <--------- 当前资源的类型metadata:name:hellospec:schedule:"* * * * *" # <--------- schedule 指定什么时候运行 Job,其格式与 Linux crontab 一致,这里 * * * * * 的含义是每一分钟启动一次jobTemplate: # <--------- 定义 Job 的模板,格式与前面 Job 一致 spec: template: spec: containers: -name:hello image:busybox command:["echo","bogelikecronjob."] restartPolicy:OnFailure
正常创建后,我们过几分钟来看看运行结果
# 这里会显示cronjob的综合信息 # kubectl get cronjobs.batch NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello * * * * * False 0 66s 2m20s # 可以看到它每隔一分钟就会创建一个pod来执行job任务 # kubectl get pod NAME READY STATUS RESTARTS AGE hello-1610267460-9b6hp 0/1 Completed 0 2m5s hello-1610267520-fm427 0/1 Completed 0 65s hello-1610267580-v8g4h 0/1 ContainerCreating 0 5s # 测试完成后删掉这个资源 # kubectl delete cronjobs.batch hello cronjob.batch "hello" deleted
cronjob定时任务在生产中的用处很多,这也是为什么上面job我说用得很少的缘故,我们可以把一些需要定时定期运行的任务,在K8s上以cronjob运行,依托K8s强大的资源调度以及服务自愈能力,我们可以放心的把定时任务交给它执行。
Job的资源清单文件:
apiVersion batch/v1 # 版本号
kind Job # 类型
metadata# 元数据
name# rs名称
namespace# 所属命名空间
labels#标签
controller job
spec# 详情描述
completions 1 # 指定job需要成功运行Pods的次数。默认值: 1
parallelism 1 # 指定job在任一时刻应该并发运行Pods的数量。默认值: 1
activeDeadlineSeconds 30 # 指定job可运行的时间期限,超过时间还未结束,系统将会尝试进行终止。
backoffLimit 6 # 指定job失败后进行重试的次数。默认是6
manualSelector true # 是否可以使用selector选择器选择pod,默认是false
selector# 选择器,通过它指定该控制器管理哪些pod
matchLabels# Labels匹配规则
app counter-pod
matchExpressions# Expressions匹配规则
key app operator In values counter-pod
template# 模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata
labels
app counter-pod
spec
restartPolicy Never # 重启策略只能设置为Never或者OnFailure
containers
name counter
image busybox1.30
command"bin/sh""-c""for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 2;done"关于重启策略设置的说明:
如果指定为OnFailure,则job会在pod出现故障时重启容器,而不是创建pod,failed次数不变
如果指定为Never,则job会在pod出现故障时创建新的pod,并且故障pod不会消失,也不会重启,failed次数加1
如果指定为Always的话,就意味着一直重启,意味着job任务会重复去执行了,当然不对,所以不能设置为Always创建pc-job.yaml,内容如下:
apiVersion batch/v1
kind Job
metadata
name pc-job
namespace dev
spec
manualSelectortrue
selector
matchLabels
app counter-pod
template
metadata
labels
app counter-pod
spec
restartPolicy Never
containers
name counter
image busybox1.30
command"bin/sh""-c""for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"# 创建job
[root@master ~]# kubectl create -f pc-job.yaml
job.batch/pc-job created
# 查看job
[root@master ~]# kubectl get job -n dev -o wide -w
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
pc-job 0/1 21s 21s counter busybox:1.30 app=counter-pod
pc-job 1/1 31s 79s counter busybox:1.30 app=counter-pod
# 通过观察pod状态可以看到,pod在运行完毕任务后,就会变成Completed状态
[root@master ~]# kubectl get pods -n dev -w
NAME READY STATUS RESTARTS AGE
pc-job-rxg96 1/1 Running 0 29s
pc-job-rxg96 0/1 Completed 0 33s
# 接下来,调整下pod运行的总数量和并行数量 即:在spec下设置下面两个选项
# completions: 6 # 指定job需要成功运行Pods的次数为6
# parallelism: 3 # 指定job并发运行Pods的数量为3
# 然后重新运行job,观察效果,此时会发现,job会每次运行3个pod,总共执行了6个pod
[root@master ~]# kubectl get pods -n dev -w
NAME READY STATUS RESTARTS AGE
pc-job-684ft 1/1 Running 0 5s
pc-job-jhj49 1/1 Running 0 5s
pc-job-pfcvh 1/1 Running 0 5s
pc-job-684ft 0/1 Completed 0 11s
pc-job-v7rhr 0/1 Pending 0 0s
pc-job-v7rhr 0/1 Pending 0 0s
pc-job-v7rhr 0/1 ContainerCreating 0 0s
pc-job-jhj49 0/1 Completed 0 11s
pc-job-fhwf7 0/1 Pending 0 0s
pc-job-fhwf7 0/1 Pending 0 0s
pc-job-pfcvh 0/1 Completed 0 11s
pc-job-5vg2j 0/1 Pending 0 0s
pc-job-fhwf7 0/1 ContainerCreating 0 0s
pc-job-5vg2j 0/1 Pending 0 0s
pc-job-5vg2j 0/1 ContainerCreating 0 0s
pc-job-fhwf7 1/1 Running 0 2s
pc-job-v7rhr 1/1 Running 0 2s
pc-job-5vg2j 1/1 Running 0 3s
pc-job-fhwf7 0/1 Completed 0 12s
pc-job-v7rhr 0/1 Completed 0 12s
pc-job-5vg2j 0/1 Completed 0 12s
# 删除job
[root@master ~]# kubectl delete -f pc-job.yaml
job.batch "pc-job" deletedCronJob(CJ)
CronJob控制器以Job控制器资源为其管控对象,并借助它管理pod资源对象,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。也就是说,CronJob可以在特定的时间点(反复的)去运行job任务。
CronJob控制器以Job控制器资源为其管控对象,并借助它管理pod资源对象,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。也就是说,CronJob可以在特定的时间点(反复的)去运行job任务。
CronJob的资源清单文件:
apiVersion batch/v1beta1 # 版本号
kind CronJob # 类型
metadata# 元数据
name# rs名称
namespace# 所属命名空间
labels#标签
controller cronjob
spec# 详情描述
schedule# cron格式的作业调度运行时间点,用于控制任务在什么时间执行
concurrencyPolicy# 并发执行策略,用于定义前一次作业运行尚未完成时是否以及如何运行后一次的作业
failedJobHistoryLimit# 为失败的任务执行保留的历史记录数,默认为1
successfulJobHistoryLimit# 为成功的任务执行保留的历史记录数,默认为3
startingDeadlineSeconds# 启动作业错误的超时时长
jobTemplate# job控制器模板,用于为cronjob控制器生成job对象;下面其实就是job的定义
metadata
spec
completions1
parallelism1
activeDeadlineSeconds30
backoffLimit6
manualSelectortrue
selector
matchLabels
app counter-pod
matchExpressions 规则
key app operator In values counter-pod
template
metadata
labels
app counter-pod
spec
restartPolicy Never
containers
name counter
image busybox1.30
command"bin/sh""-c""for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 20;done"需要重点解释的几个选项:
schedule: cron表达式,用于指定任务的执行时间
*/1 * * * *
<分钟> <小时> <日> <月份> <星期>
分钟 值从 0 到 59.
小时 值从 0 到 23.
日 值从 1 到 31.
月 值从 1 到 12.
星期 值从 0 到 6, 0 代表星期日
多个时间可以用逗号隔开; 范围可以用连字符给出;*可以作为通配符; /表示每...
concurrencyPolicy:
Allow: 允许Jobs并发运行(默认)
Forbid: 禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行
Replace: 替换,取消当前正在运行的作业并用新作业替换它创建pc-cronjob.yaml,内容如下:
apiVersion batch/v1beta1
kind CronJob
metadata
name pc-cronjob
namespace dev
labels
controller cronjob
spec
schedule"*/1 * * * *"
jobTemplate
metadata
spec
template
spec
restartPolicy Never
containers
name counter
image busybox1.30
command"bin/sh""-c""for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"# 创建cronjob
[root@master ~]# kubectl create -f pc-cronjob.yaml
cronjob.batch/pc-cronjob created
# 查看cronjob
[root@master ~]# kubectl get cronjobs -n dev
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
pc-cronjob */1 * * * * False 0 <none> 6s
# 查看job
[root@master ~]# kubectl get jobs -n dev
NAME COMPLETIONS DURATION AGE
pc-cronjob-1592587800 1/1 28s 3m26s
pc-cronjob-1592587860 1/1 28s 2m26s
pc-cronjob-1592587920 1/1 28s 86s
# 查看pod
[root@master ~]# kubectl get pods -n dev
pc-cronjob-1592587800-x4tsm 0/1 Completed 0 2m24s
pc-cronjob-1592587860-r5gv4 0/1 Completed 0 84s
pc-cronjob-1592587920-9dxxq 1/1 Running 0 24s
# 删除cronjob
[root@master ~]# kubectl delete -f pc-cronjob.yaml
cronjob.batch "pc-cronjob" deleted
第七章 Service详解
# kubectl apply -f my-job.yaml
# 可以观察到这个job因为不成功,并且restartPolicy重启模式是Never不会被重启,但它的job状态始终未完成,所以它会一直不停的创建新的pod,直到COMPLETIONS为1/1,对于我们这个示例,它显然永远都不会成功
# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-job-9fcbm 0/1 StartError 0 47s
my-job-bt2kd 0/1 StartError 0 54s
my-job-mlnzz 0/1 StartError 0 37s
my-job-mntdp 0/1 StartError 0 17s
# kubectl get job
NAME COMPLETIONS DURATION AGE
my-job 0/1 15s 15s
# 找一个pod看下事件描述,会很清晰地指出命令不存在
# kubectl describe pod my-job-9fcbm
Name: my-job-9fcbm
Namespace: default
......
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 44s default-scheduler Successfully assigned default/my-job-9fcbm to 10.0.0.204
Normal Pulling 43s kubelet Pulling image "busybox"
Normal Pulled 36s kubelet Successfully pulled image "busybox" in 7.299038719s
Normal Created 36s kubelet Created container my-job
Warning Failed 36s kubelet Error: failed to create containerd task: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "echoaaa": executable file not found in $PATH: unknown
# 删除掉这个job,不然那创建的pod数量可有够多的了
# kubectl delete job my-job
# 试试把restartPolicy重启模式换成OnFailure观察看看
# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-job-gs95h 0/1 CrashLoopBackOff 3 84s
# 可以看到它不会创建新的pod,而是会尝试重启自身,以期望恢复正常,这里看到已经重启了3次,还会持续增加到5,然后会被K8s给删除以尝试,因为这里只是job而不是deployment,它不会自己再启动一个新的pod,所以这个job等于就没有了,这里说明OnFailure是生效的,至少不会有那么多错误的pod出现了
并行执行job
准备好yaml配置
apiVersion: batch/v1
kind: Job
metadata:
name: my-job
spec:
parallelism: 2 # 并行执行2个job
template:
metadata:
name: my-job
spec:
containers:
- image: busybox
name: my-job
command: ["echo","Hello, boge."]
restartPolicy: OnFailure
创建并查看结果
# kubectl apply -f my-job.yaml
job.batch/my-job created
# job一共启动了2个pod,并且它们的AGE一样,可见是并行创建的
# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-job-fwf8l 0/1 Completed 0 7s
my-job-w2fxd 0/1 Completed 0 7s
再来个组合测试下并行完成定制的总任务数量
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
completions: 6 # 此job完成pod的总数量
parallelism: 2 # 每次并发跑2个job
template:
metadata:
name: myjob
spec:
containers:
- name: hello
image: busybox
command: ["echo"," hello boge! "]
restartPolicy: OnFailure
创建并查看结果
# 可以看到是每次并发2个job,完成6个总量即停止
# kubectl get pod
NAME READY STATUS RESTARTS AGE
myjob-54wmk 0/1 Completed 0 11s
myjob-fgtmj 0/1 Completed 0 15s
myjob-fkj5l 0/1 Completed 0 7s
myjob-hsccm 0/1 Completed 0 7s
myjob-lrpsr 0/1 Completed 0 15s
myjob-ppfns 0/1 Completed 0 11s
# 符合预期
# kubectl get job
NAME COMPLETIONS DURATION AGE
myjob 6/6 14s 34s
# 测试完成后删掉这个资源
kubectl delete job myjob
到此,job的内容就讲完了,在生产中,job比较适合用在CI/CD流水线中,作完一次性任务使用,我在生产中基本没怎么用这个资源。
cronjob
上面的job是一次性任务,那我们需要定时循环来执行一个任务可以吗?答案肯定是可以的,就像我们在linux系统上面用crontab一样,在K8s上用cronjob的另一个好处就是它是分布式的,执行的pod可以是在集群中的任意一台NODE上面(这点和cronsun有点类似)
让我们开始实战吧,先准备一下cronjob的yaml配置为my-cronjob.yaml
apiVersion: batch/v1beta1 # <--------- 当前 CronJob 的 apiVersion
kind: CronJob # <--------- 当前资源的类型
metadata:
name: hello
spec:
schedule: "* * * * *" # <--------- schedule 指定什么时候运行 Job,其格式与 Linux crontab 一致,这里 * * * * * 的含义是每一分钟启动一次
jobTemplate: # <--------- 定义 Job 的模板,格式与前面 Job 一致
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["echo","boge like cronjob."]
restartPolicy: OnFailure
正常创建后,我们过几分钟来看看运行结果
# 这里会显示cronjob的综合信息
# kubectl get cronjobs.batch
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello * * * * * False 0 66s 2m20s
# 可以看到它每隔一分钟就会创建一个pod来执行job任务
# kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-1610267460-9b6hp 0/1 Completed 0 2m5s
hello-1610267520-fm427 0/1 Completed 0 65s
hello-1610267580-v8g4h 0/1 ContainerCreating 0 5s
# 测试完成后删掉这个资源
# kubectl delete cronjobs.batch hello
cronjob.batch "hello" deleted
cronjob定时任务在生产中的用处很多,这也是为什么上面job我说用得很少的缘故,我们可以把一些需要定时定期运行的任务,在K8s上以cronjob运行,依托K8s强大的资源调度以及服务自愈能力,我们可以放心的把定时任务交给它执行。
posted on 2021-09-12 10:54 luzhouxiaoshuai 阅读(163) 评论(0) 编辑 收藏 举报