一.系统环境

本文主要基于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定时任务的前提是已经有一套可以正常运行的Kubernetes集群,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Centos7 安装部署Kubernetes(k8s)集群》https://www.cnblogs.com/renshengdezheli/p/16686769.html。

三.Kubernetes CronJob简介

CronJob是Kubernetes中的一种控制器(其他控制器,比如deploymentDaemonSetReplicationControllerReplicaSet ),用于在指定时间间隔内运行一个或多个Pod。类似于Linux下的cron工具,可以帮助我们周期性地执行任务。Kubernetes CronJob使用Cron表达式来指定任务运行时间,这使得它非常灵活且易于使用。

除了CronJob定时任务,kubernetes还存在一次性任务job,详情请查看博客《Kubernetes(k8s)一次性任务:Job》https://www.cnblogs.com/renshengdezheli/p/17450685.html。

四.kubernetes CronJob和Linux crontab对比

熟悉Linux系统的对crontab定时任务应该不陌生,下面看看kubernetes CronJob和Linux crontab两者差异。

Linux 下的 crontab 和 Kubernetes 下的 CronJob 都是用于执行周期性任务的工具,但它们在实现方式和使用方式上有以下几点不同:

  1. 调度精度:Linux 下的 crontab 支持分钟级别的调度,而 Kubernetes 下的 CronJob 可以支持到秒级别的调度。
  2. 状态管理:Linux 下的 crontab 只能通过查看日志等方式来了解任务的运行情况,而 Kubernetes 下的 CronJob 可以通过 kubectl 工具查看任务的运行状态,并且可以对任务进行修改和删除等操作。
  3. 并发控制:Linux 下的 crontab 没有内置的并发控制机制,如果同一个任务同时被多次触发,可能会导致资源抢占。而 Kubernetes 下的 CronJob 可以通过 .spec.concurrencyPolicy 字段指定任务的并发策略,从而避免资源抢占的问题。
  4. 环境隔离:Linux 下的 crontab 所有任务都运行在同一个环境中,容易出现依赖冲突等问题。而 Kubernetes 下的 CronJob 可以定义多个 Pod 来运行不同的任务,从而实现了任务之间的环境隔离。
  5. 缩放性:Linux 下的 crontab 通常只能运行在单台服务器上,无法进行水平扩展。而 Kubernetes 下的 CronJob 可以运行在多节点的集群上,并且可以通过水平扩展来提高任务的并发度和可用性。

综上所述,Linux 下的 crontab 和 Kubernetes 下的 CronJob 在功能和使用方式上都有不同,具体使用哪种工具取决于具体的需求和场景。

五.CronJob表达式语法

cronjob类似于Linux 的crontab, cronjob简写为cj,查看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.

查看创建cronjob的帮助

[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表达式由五个字段组成,分别代表分钟、小时、日、月、周几。每个字段可以是以下任何值:

  • 单个数字:例如5表示第5分钟或5月份。
  • 逗号分隔的数字列表:例如5,15,25表示第5、15和25分钟。
  • 连续的数字范围:例如10-15表示从第10分钟到第15分钟。
  • 星号(*):表示匹配该字段的所有值。例如在分钟字段上使用星号表示每分钟执行任务。
  • 斜杠(/):表示步长值。例如在分钟字段上使用"*/3"表示每隔3分钟执行一次任务。

CronJob表达式示例:

  • 每小时执行:0 * * * *
  • 每天晚上10点执行:0 22 * * *
  • 每周一早上6点执行:0 6 * * 1
  • 每2分钟运行一次任务 : */2 * * * *

六.创建CronJob定时任务

生成cronjob的yaml文件,--schedule="*/1 * * * *" 表示每分钟执行一次,执行的命令为:-- sh -c "date;sleep 10"打印当前日期和休眠10秒钟。

[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: {}

修改yaml文件,功能为:创建一个 名为my-cronjob的Kubernetes CronJob定时任务,使用 busybox 镜像作为容器镜像,执行每分钟一次的定时任务,任务是date;sleep 10打印当前日期和休眠10秒钟。

schedule:*/1 * * * *:表示每分钟执行一次作业。

restartPolicy: OnFailure:在容器执行失败时重新启动容器。

[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: {}

创建cronjob并查看

[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.

现在开始观察pod状态,使用watch每 0.5 秒执行一次 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

删除cronjob

[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定时任务

刚才创建的cronjob,每个pod会运行10s(sleep 10),有的pod可能会运行很长时间,我们可以使用activeDeadlineSeconds参数限制pod最多运行多长时间。activeDeadlineSeconds 用于指定 Pod 最大的运行时间。如果一个 Pod 已经运行了超过这个时间,Kubernetes 会强制将其终止删除。

修改yaml文件,添加activeDeadlineSeconds: 5:设置了 Pod 最大运行时间为 5 秒,如果超过这个时间就会被 Kubernetes 强制删除。

[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: {}

创建cronjob

[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.

现在开始观察pod状态,使用watch每 0.5 秒执行一次 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.

删除cronjob

[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.

八.总结

本文介绍了Kubernetes CronJob定时任务的语法,如何创建cronjob定时任务,以及创建具有超时时间的cronjob。

Kubernetes CronJob为容器化环境提供了非常便利的任务调度功能,可以帮助我们自动化许多常见的周期性任务。

Kubernetes(k8s)定时任务:CronJob的更多相关文章

  1. Kubernetes K8S之资源控制器Job和CronJob详解

    Kubernetes的资源控制器Job和CronJob详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2 ...

  2. Kubernetes(K8S) kubesphere 介绍

    使用 Kubeadm 部署 Kubernetes(K8S) 安装--附K8S架构图 官网地址:https://kubesphere.com.cn/ KubeSphere 是个全栈的Kubernetes ...

  3. Kubernetes Job与CronJob(离线业务)

    Kubernetes Job与CronJob(离线业务) Job Job分为普通任务(Job)  一次性执行 应用场景:离线数据处理,视频解码等业务 官方文档:https://kubernetes.i ...

  4. Kubernetes K8S之资源控制器RC、RS、Deployment详解

    Kubernetes的资源控制器ReplicationController(RC).ReplicaSet(RS).Deployment(Deploy)详解与示例 主机配置规划 服务器名称(hostna ...

  5. Kubernetes K8S之资源控制器StatefulSets详解

    Kubernetes的资源控制器StatefulSet详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2 ...

  6. Kubernetes K8S之资源控制器Daemonset详解

    Kubernetes的资源控制器Daemonset详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C/ ...

  7. Kubernetes(k8s)控制器(一):deployment

    目录 一.系统环境 二.前言 三.Kubernetes 控制器 四.Deployment概览 五.创建deployment 六.修改deploy副本数 6.1 kubectl edit deploy ...

  8. 《两地书》--Kubernetes(K8s)基础知识(docker容器技术)

    大家都知道历史上有段佳话叫“司马相如和卓文君”.“皑如山上雪,皎若云间月”.卓文君这么美,却也抵不过多情女儿薄情郎. 司马相如因一首<子虚赋>得汉武帝赏识,飞黄腾达之后便要与卓文君“故来相 ...

  9. 深入剖析Kubernetes k8s

    深入剖析Kubernetes k8s 毫无疑问,Kubernetes 已经成为容器领域当之无愧的事实标准.除了 Google.Microsoft 等技术巨擘们在容器领域里多年的博弈外,国内的 BAT. ...

  10. Docker Kubernetes(K8s)简介

    入职了新公司,使用了Docker和K8s,需要有一个基础的了解,对网络上相关信息进行了简单总结. 一Docker 1简介: Docker 将应用程序与该程序的依赖,打包在一个文件里面.运行这个文件,就 ...

随机推荐

  1. dark room - 2020 年苹果设计奖得主,一个足够强大的照片视频编辑器

    2020年苹果设计奖得主 2015年App Store最佳应用 Darkroom 是一个高级照片和视频编辑器.它对业余摄影师来说很容易操作,但对专业摄影师来说足够强大. 下载 ➤ Darkroom 下 ...

  2. InnoDB 是如何解决幻读的

    前言 大部分人在日常的业务开发中,其实很少去关注数据库的事务相关问题,基本上都是 CURD 一把梭.正好最近在看 MySQL 的相关基础知识,其中对于幻读问题之前一直没有理解深刻,今天就来聊聊「Inn ...

  3. Archlinux最新安装教程

    介绍 Arch Linux(或 Arch /ˈɑːrtʃ/))是一款基于 x86-64 架构的 Linux发行版 .系统主要由自由和开源软件组成,支持社区参与.系统设计以 KISS原则(保持简单和愚蠢 ...

  4. 【CTF】系统调用号查询表

    32位 #ifndef _ASM_X86_UNISTD_32_H #define _ASM_X86_UNISTD_32_H 1 #define __NR_restart_syscall 0 #defi ...

  5. pysimplegui之常用元素介绍

    1文本元素 | T == Txt == Text 2多行文本sg.Multiline('This is what a Multi-line Text Element looks like', size ...

  6. [Linux/Redis]搭建Redis集群

    1 基本信息 3台服务器(CentOS7.3) 192.168.1.101 node101 192.168.1.102 node102 192.168.1.103 node103 2 单机 安装 Re ...

  7. 【SSM项目】尚筹网(二)基于Servlet3.0项目搭建:日志系统以及声明式事务

    1 日志系统 常见的日志系统实现log4j.JUL(jdk自带).log4j2.logback(和SLF4J同一个作者,能够天然衔接),这些实现就类似于java的接口实现,而SLF4J就类似于java ...

  8. Rust中的宏:声明宏和过程宏

    Rust中的声明宏和过程宏 宏是Rust语言中的一个重要特性,它允许开发人员编写可重用的代码,以便在编译时扩展和生成新的代码.宏可以帮助开发人员减少重复代码,并提高代码的可读性和可维护性.Rust中有 ...

  9. Node.js躬行记(27)——接口管理

    在页面发生线上问题时,你要做的事情就是去查接口,响应数据是否正确,查接口的方法有两种: 第一种是在浏览器中打开地址,但是你必须得知道详细的 URL,并且有些页面还需要附带参数. 第二种是打开编辑器,启 ...

  10. PostgreSQL插件那么多,怎样管理最高效?

    摘要:华为云RDS for PostgreSQL通过插件管理功能,很好地解决了PostgreSQL版本与插件耦合的问题,帮助用户更直观.更快速地安装管理数据库插件. 本文分享自华为云社区<Pos ...