二十九、Kubernetes中CronJob(CJ)详解
1、概述
在kubernetes中,有很多类型的pod控制器,每种都有自己的适合的场景,常见的有下面这些:
-
ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代
-
ReplicaSet:保证副本数量一直维持在期望值,并支持pod数量扩缩容,镜像版本升级
-
Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、回退版本
-
Horizontal Pod Autoscaler:可以根据集群负载自动水平调整Pod的数量,实现削峰填谷
-
DaemonSet:在集群中的指定Node上运行且仅运行一个副本,一般用于守护进程类的任务
-
Job:它创建出来的pod只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务
-
Cronjob:它创建的Pod负责周期性任务控制,不需要持续后台运行
-
StatefulSet:管理有状态应用
在前面文章中我们详解了ReplicaSet、Deployment、Horizontal Pod Autoscaler、DaemonSet、Job控制器,这篇我们详解CronJob(CJ)
2、CronJob(CJ)详解
CronJob控制器以 Job控制器资源为其管控对象,并借助它管理pod资源对象,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。也就是说,CronJob可以在特定的时间点(反复的)去运行job任务。
CronJob的资源清单文件:
apiVersion: batch/v1
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: busybox:1.30
command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]
需要重点解释的几个选项:
schedule: cron表达式,用于指定任务的执行时间
*/1 * * * *
<分钟> <小时> <日> <月份> <星期>
分钟 值从 0 到 59.
小时 值从 0 到 23.
日 值从 1 到 31.
月 值从 1 到 12.
星期 值从 0 到 6, 0 代表星期日
多个时间可以用逗号隔开; 范围可以用连字符给出;*可以作为通配符; /表示每...
concurrencyPolicy:
Allow: 允许Jobs并发运行(默认)
Forbid: 禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行
Replace: 替换,取消当前正在运行的作业并用新作业替换它
3、CronJob(CJ)实例
创建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: busybox:1.30
command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]
上面任务设置的是1分钟执行一次
# 创建
[root@k8s-master ~]# kubectl apply -f pc-cronjob.yaml
cronjob.batch/pc-cronjob created
[root@k8s-master ~]#
[root@k8s-master ~]#
# 查看
[root@k8s-master ~]# kubectl get cronjobs -n dev
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
pc-cronjob */1 * * * * False 1 13s 17s
[root@k8s-master ~]#
[root@k8s-master ~]#
# 查看job
[root@k8s-master ~]# kubectl get jobs -n dev -w
NAME COMPLETIONS DURATION AGE
pc-cronjob-27874617 1/1 30s 66s
pc-cronjob-27874618 0/1 6s 6s
pc-cronjob-27874618 0/1 29s 29s
pc-cronjob-27874618 0/1 30s 30s
pc-cronjob-27874618 1/1 30s 30s
pc-cronjob-27874619 0/1 0s
pc-cronjob-27874619 0/1 0s 0s
pc-cronjob-27874619 0/1 2s 2s
pc-cronjob-27874619 0/1 29s 29s
pc-cronjob-27874619 0/1 30s 30s
pc-cronjob-27874619 1/1 30s 30s
# 删除
[root@k8s-master ~]# kubectl delete -f pc-cronjob.yaml
cronjob.batch "pc-cronjob" deleted