Kubernetes(k8s)定时任务:CronJob
- 一.系统环境
- 二.前言
- 三.Kubernetes CronJob简介
- 四.kubernetes CronJob和Linux crontab对比
- 五.CronJob表达式语法
- 六.创建CronJob定时任务
- 七.创建具有超时时间的CronJob定时任务
- 八.总结
一.系统环境
本文主要基于Kubernetes1.21.9和Linux操作系统CentOS7.4。
| 服务器版本 | docker软件版本 | Kubernetes(k8s)集群版本 | CPU架构 |
|---|---|---|---|
| CentOS Linux release 7.4.1708 (Core) | Docker version 20.10.12 | v1.21.9 | x86_64 |
Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点。
| 服务器 | 操作系统版本 | CPU架构 | 进程 | 功能描述 |
|---|---|---|---|---|
| k8scloude1/192.168.110.130 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico | k8s master节点 |
| k8scloude2/192.168.110.129 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker节点 |
| k8scloude3/192.168.110.128 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker节点 |
二.前言
在现代的云原生应用中,定时任务是一个非常重要的组成部分。Kubernetes提供了一种称为CronJob的机制,可以让我们方便地定义和管理定时任务。本文将介绍Kubernetes CronJob的基础知识以及如何使用它来运行定时任务。
使用CronJob定时任务的前提
CronJob是Kubernetes中的一种控制器(其他控制器,比如deployment,DaemonSet ,ReplicationController,ReplicaSet ),用于在指定时间间隔内运行一个或多个Pod。类似于Linux下的cron工具,可以帮助我们周期性地执行任务。Kubernetes CronJob使用Cron表达式来指定任务运行时间,这使得它非常灵活且易于使用。 熟悉Linux系统的对crontab定时任务应该不陌生,下面看看kubernetes CronJob和Linux crontab两者差异。 Linux 下的 crontab 和 Kubernetes 下的 CronJob 都是用于执行周期性任务的工具,但它们在实现方式和使用方式上有以下几点不同: 综上所述,Linux 下的 crontab 和 Kubernetes 下的 CronJob 在功能和使用方式上都有不同,具体使用哪种工具取决于具体的需求和场景。 cronjob类似于Linux 的crontab, cronjob简写为cj,查看cronjob任务。 查看创建cronjob的帮助 CronJob表达式由五个字段组成,分别代表分钟、小时、日、月、周几。每个字段可以是以下任何值: CronJob表达式示例: 生成cronjob的yaml文件,--schedule="*/1 * * * *" 表示每分钟执行一次,执行的命令为:-- sh -c "date;sleep 10"打印当前日期和休眠10秒钟。 修改yaml文件,功能为:创建一个 名为my-cronjob的Kubernetes CronJob定时任务,使用 busybox 镜像作为容器镜像,执行每分钟一次的定时任务,任务是 schedule:*/1 * * * *:表示每分钟执行一次作业。 restartPolicy: OnFailure:在容器执行失败时重新启动容器。 创建cronjob并查看 现在开始观察pod状态,使用watch每 0.5 秒执行一次 删除cronjob 刚才创建的cronjob,每个pod会运行10s(sleep 10),有的pod可能会运行很长时间,我们可以使用activeDeadlineSeconds参数限制pod最多运行多长时间。activeDeadlineSeconds 用于指定 Pod 最大的运行时间。如果一个 Pod 已经运行了超过这个时间,Kubernetes 会强制将其终止删除。 修改yaml文件,添加activeDeadlineSeconds: 5:设置了 Pod 最大运行时间为 5 秒,如果超过这个时间就会被 Kubernetes 强制删除。 创建cronjob 现在开始观察pod状态,使用watch每 0.5 秒执行一次 删除cronjob 本文介绍了Kubernetes CronJob定时任务的语法,如何创建cronjob定时任务,以及创建具有超时时间的cronjob。 Kubernetes CronJob为容器化环境提供了非常便利的任务调度功能,可以帮助我们自动化许多常见的周期性任务。三.Kubernetes CronJob简介
四.kubernetes CronJob和Linux crontab对比
.spec.concurrencyPolicy 字段指定任务的并发策略,从而避免资源抢占的问题。五.CronJob表达式语法
[root@k8scloude1 jobandcronjob]# kubectl get cj
No resources found in job namespace.
[root@k8scloude1 jobandcronjob]# kubectl get cronjob
No resources found in job namespace.
[root@k8scloude1 jobandcronjob]# kubectl create cj --help
Create a cronjob with the specified name.
Aliases:
cronjob, cj
Examples:
# Create a cronjob
kubectl create cronjob my-job --image=busybox --schedule="*/1 * * * *"
# Create a cronjob with command
kubectl create cronjob my-job --image=busybox --schedule="*/1 * * * *" -- date
......
Usage:
kubectl create cronjob NAME --image=image --schedule='0/5 * * * ?' -- [COMMAND] [args...] [flags] [options]
Use "kubectl options" for a list of global command-line options (applies to all commands).
六.创建CronJob定时任务
[root@k8scloude1 jobandcronjob]# kubectl create cronjob my-cronjob --image=busybox --schedule="*/1 * * * *" --dry-run=client -o yaml -- sh -c "date;sleep 10" >cronjob.yaml
[root@k8scloude1 jobandcronjob]# cat cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
creationTimestamp: null
name: my-cronjob
spec:
jobTemplate:
metadata:
creationTimestamp: null
name: my-cronjob
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- sh
- -c
- date;sleep 10
image: busybox
name: my-cronjob
resources: {}
restartPolicy: OnFailure
schedule: '*/1 * * * *'
status: {}
date;sleep 10打印当前日期和休眠10秒钟。[root@k8scloude1 jobandcronjob]# vim cronjob.yaml
[root@k8scloude1 jobandcronjob]# cat cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
creationTimestamp: null
name: my-cronjob
spec:
jobTemplate:
metadata:
creationTimestamp: null
name: my-cronjob
spec:
template:
metadata:
creationTimestamp: null
spec:
#当需要关闭容器时,立即杀死容器而不等待默认的30秒优雅停机时长。
terminationGracePeriodSeconds: 0
containers:
- command:
- sh
- -c
- date;sleep 10
image: busybox
#imagePullPolicy: IfNotPresent:表示如果本地已经存在该镜像,则不重新下载;否则从远程 Docker Hub 下载该镜像
imagePullPolicy: IfNotPresent
name: my-cronjob
resources: {}
#restartPolicy: OnFailure:在容器执行失败时重新启动容器。
restartPolicy: OnFailure
#表示每分钟执行一次作业。
schedule: '*/1 * * * *'
status: {}
[root@k8scloude1 jobandcronjob]# kubectl apply -f cronjob.yaml
cronjob.batch/my-cronjob created
[root@k8scloude1 jobandcronjob]# kubectl get cj
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
my-cronjob */1 * * * * False 0 <none> 4s
[root@k8scloude1 jobandcronjob]# kubectl get pod
No resources found in job namespace.
kubectl get pod 命令,实时查看 Kubernetes 集群中 Pod 的状态信息。可以发现由于sleep 10,所以每个pod运行10秒之后status由running变为Completed。#每 0.5 秒执行一次 `kubectl get pod` 命令
[root@k8scloude1 jobandcronjob]# watch -n .5 'kubectl get pod'
[root@k8scloude1 jobandcronjob]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-cronjob-27406765-xk2v7 1/1 Running 0 9s
[root@k8scloude1 jobandcronjob]# watch -n .5 'kubectl get pod'
[root@k8scloude1 jobandcronjob]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-cronjob-27406765-xk2v7 0/1 Completed 0 70s
my-cronjob-27406766-7gbjc 1/1 Running 0 10s
[root@k8scloude1 jobandcronjob]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-cronjob-27406765-xk2v7 0/1 Completed 0 76s
my-cronjob-27406766-7gbjc 0/1 Completed 0 16s
[root@k8scloude1 jobandcronjob]# kubectl delete cj my-cronjob
cronjob.batch "my-cronjob" deleted
[root@k8scloude1 jobandcronjob]# kubectl get pod
No resources found in job namespace.
[root@k8scloude1 jobandcronjob]# kubectl get cj
No resources found in job namespace.
七.创建具有超时时间的CronJob定时任务
[root@k8scloude1 jobandcronjob]# vim cronjob.yaml
[root@k8scloude1 jobandcronjob]# cat cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
creationTimestamp: null
name: my-cronjob
spec:
jobTemplate:
metadata:
creationTimestamp: null
name: my-cronjob
spec:
#activeDeadlineSeconds: 5:设置了 Pod 最大运行时间为 5 秒,如果超过这个时间就会被 Kubernetes 强制删除。
activeDeadlineSeconds: 5
template:
metadata:
creationTimestamp: null
spec:
#当需要关闭容器时,立即杀死容器而不等待默认的30秒优雅停机时长。
terminationGracePeriodSeconds: 0
containers:
- command:
- sh
- -c
- date;sleep 10
image: busybox
imagePullPolicy: IfNotPresent
name: my-cronjob
resources: {}
#restartPolicy: OnFailure:在容器执行失败时重新启动容器。
restartPolicy: OnFailure
#表示每分钟执行一次作业。
schedule: '*/1 * * * *'
status: {}
[root@k8scloude1 jobandcronjob]# kubectl apply -f cronjob.yaml
cronjob.batch/my-cronjob created
[root@k8scloude1 jobandcronjob]# kubectl get cj
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
my-cronjob */1 * * * * False 0 <none> 6s
[root@k8scloude1 jobandcronjob]# kubectl get pod
No resources found in job namespace.
kubectl get pod 命令,实时查看 Kubernetes 集群中 Pod 的状态信息。可以发现每一分钟执行一次定时任务“*/1 * * * *” ,sleep 10超过5秒,pod运行5秒之后被强制删除。[root@k8scloude1 jobandcronjob]# watch -n .5 'kubectl get pod'
[root@k8scloude1 jobandcronjob]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-cronjob-27406771-vskpb 1/1 Running 0 3s
[root@k8scloude1 jobandcronjob]# kubectl get pod
No resources found in job namespace.
[root@k8scloude1 jobandcronjob]# kubectl get pod
No resources found in job namespace.
[root@k8scloude1 jobandcronjob]# kubectl delete cj my-cronjob
cronjob.batch "my-cronjob" deleted
[root@k8scloude1 jobandcronjob]# kubectl get cj
No resources found in job namespace.
[root@k8scloude1 jobandcronjob]# kubectl get pod
No resources found in job namespace.
八.总结