Kubernetes(k8s)定时任务:CronJob

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

三.Kubernetes CronJob简介

CronJob是Kubernetes中的一种控制器(其他控制器,比如deployment,DaemonSet ,ReplicationController,ReplicaSet ),用于在指定时间间隔内运行一个或多个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为容器化环境提供了非常便利的任务调度功能,可以帮助我们自动化许多常见的周期性任务。文章来源地址https://www.toymoban.com/news/detail-468554.html

到了这里,关于Kubernetes(k8s)定时任务:CronJob的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CronJob in K8s

    CronJob的设计思想是基于Cron工具的,Cron是一种在Unix和类Unix系统中用于自动执行任务的工具。CronJob的设计思想是将Cron的功能引入到Kubernetes中,以便在集群中自动化和调度任务的执行。 CronJob的设计思想包括以下几个方面: 基于时间的调度:CronJob根据时间表来周期性地调度任

    2024年02月09日
    浏览(27)
  • k8s概念-Job和CronJob

    回到目录  对于非耐久性任务,比如压缩文件,任务完成后,pod需要结束运行,不需要pod继续保持在系统中,这个时候就要用到Job。 Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束 yaml文件 多次执行

    2024年02月14日
    浏览(27)
  • k8s中job与cronjob使用详解

    job,顾名思义就是任务,job的概念在很多框架中都有,而且实际业务场景中也使用非常广泛,比如大家熟悉的hadoop,客户端可以向集群提交一个job,然后集群根据一定的调度策略来处理这个job; k8s中的job,主要用于批量处理的业务场景,比如像那种短暂的一次性任务(每个任

    2024年01月17日
    浏览(34)
  • K8S之Job和CronJob控制器

    Job控制器用于管理Pod对象运行一次性任务,例如:对数据库备份,可以直接在k8s上启动一个mysqldump备份程序,也可以启动一个pod,这个pod专门用来做备份任务,备份结束pod就可以终止了,不需要重启,将Pod对象置于\\\"Completed\\\"(完成)状态。 若容器中的进程因错误而终止,则需要

    2024年04月11日
    浏览(30)
  • 18-k8s控制器资源-cronjob控制器

            job控制器是执行完一次任务,就结束;         cronjob控制器,是基于job控制器,定期频率性执行任务;等同于linux系统中的crontab一样; [root@k8s231 pi]# vim cronjob.yaml apiVersion: batch/v1 kind: CronJob metadata:   name: xinjizhiwa spec:   schedule: \\\"* * * * *\\\"   #定义job的模板   jobTemplate

    2024年02月22日
    浏览(49)
  • k8s之工作负载、Deployment、DaemonSet、StatefulSet、Job、CronJob及GC

    1.1、定义 工作负载能让Pod能拥有自恢复能力,会写Pod,研究不同的工作负载怎么控制Pod的行为 1.2、分类 2.1、定义 一个 Deployment 为 Pods 和 ReplicaSets 提供声明式的更新能力。 你负责描述 Deployment 中的 目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变

    2024年02月11日
    浏览(28)
  • Kubernetes(k8s)实战:Kubernetes(k8s)部署Springboot项目

    wordpress是用于快速搭建博客系统。 该yaml文件创建一个mysql,并且生成一个service,service对外暴露的端口是3306 我们发现,搭建成功了,用浏览器访问192.168.56.101:30493,发现访问成功了! 在集群中,pod之间可以通过service 的name进行访问,不仅仅是ip,这就意味着,service中不仅帮

    2024年02月12日
    浏览(86)
  • Kubernetes(K8S)学习(三):K8S实战案例

    附:查看命名空间命令 kubectl get namespace kubectl get ns 创建wordpress-db.yaml文件,这里以mysql作为wordpress的db: yaml内容: 根据wordpress-db.yaml配置,创建资源mysql数据库: yaml中MySQL配置说明: 用户:root       密码:rootPassW0rd 数据库名称:wordpress 用户:wordpress       密码:wo

    2024年04月09日
    浏览(73)
  • K8s(Kubernetes)学习(二):k8s集群搭建

    minikube 只是一个 K8S 集群模拟器,只有一个节点的集群,只为测试用,master 和 worker 都在一起。 裸机安装 至少需要两台机器(主节点、工作节点个一台),需要自己安装 Kubernetes 组件,配置会稍微麻烦点。 缺点:配置麻烦,缺少生态支持,例如负载均衡器、云存储。 直接用

    2024年02月09日
    浏览(48)
  • Kubernetes(K8S)学习(四):K8S之Storage

    kubernetes使用NFS共享存储有两种方式: (1)手动方式静态创建所需要的PV和PVC(见本文1.3.2小节)。 (2)通过创建PVC动态地申请PV(见本文1.4.2小节)。 Volume地址 :https://kubernetes.io/docs/concepts/storage/ 1.1.1、Volume简介 volume(/ˈvɒljuːm/,IT词汇–百度百科): 在电脑中, volume(

    2024年04月15日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包