持续集成部署-k8s-高级调度-CronJob:定时任务的应用

高级调度-CronJob:定时任务的应用

  • 1. 简介
  • 2. Linux 上的 CronJob 定时任务
  • 3. 创建 K8s 的 CronJob
  • 4. 删除 k8s 的 CronJob

1. 简介

在 Kubernetes 中,CronJob 是一种用于创建定时任务的资源对象。它允许我们在集群中预定和运行定期的作业,类似于 Linux 系统中的 cron 任务。

使用 CronJob 资源可以很容易地在 Kubernetes 上创建定时任务,无需依赖外部工具或服务。以下是 CronJob 的一些主要特点和应用:

  • 定时调度:CronJob 允许您基于 Cron 表达式来定义任务的调度规则,比如每天凌晨执行、每个星期五执行等。

  • 作业管理:CronJob 创建的任务会生成对应的 Job 资源,并在指定的时间执行任务。如果任务成功完成,则 Job 会被标记为完成;如果任务失败,则 Job 会保留失败的状态,并且根据配置的重试策略进行重试。

  • 并行处理:CronJob 允许您配置并发性,即同时执行的任务数量。这可以帮助您控制资源的使用情况,避免过多的任务同时运行导致资源耗尽。

  • 灵活的配置:CronJob 支持很多配置选项,例如定义任务的容器镜像、环境变量、命令参数等,使得定时任务的执行更加灵活。

2. Linux 上的 CronJob 定时任务

在 Linux 上,CronJob 是一种用于定时执行任务的工具,它可以让您在指定的时间间隔内运行命令或脚本。

Cron 表达式:

# ┌───────────── 分钟 (0 - 59)
# │ ┌───────────── 小时 (0 - 23)
# │ │ ┌───────────── 月的某天 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12)
# │ │ │ │ ┌───────────── 周的某天 (0 - 6)(周日到周一;在某些系统上,7 也是星期日)
# │ │ │ │ │                          或者是 sun,mon,tue,web,thu,fri,sat
# │ │ │ │ │
# │ │ │ │ │
# * * * * *

下面是在 Linux 上使用 CronJob 的一般步骤:

  • 编辑 Cron 表:打开终端,并使用以下命令编辑 Cron 表。
crontab -e

如果是第一次编辑 Cron 表,系统会提示您选择默认的编辑器。

  • 添加定时任务:在 Cron 表中,每行表示一个定时任务。每行包含六个字段,分别表示分钟、小时、日期、月份、星期和要执行的命令。您可以根据需要调整这些参数。
    例如,要在每天的凌晨 2 点运行 /path/to/command 命令,可以在 Cron 表中添加以下内容:
0 2 * * * /path/to/command

这表示每天的第 0 分钟、第 2 小时(凌晨 2 点)执行 /path/to/command 命令。

  • 保存 Cron 表:完成编辑后,请保存并关闭 Cron 表。编辑器会自动将新的 Cron 表写入系统。

  • 验证 Cron 任务:可以使用以下命令查看当前用户的 Cron 表内容。

crontab -l

这将显示当前用户的所有定时任务。

  • 管理 Cron 任务:通过编辑 Cron 表,您可以添加、修改或删除定时任务。当您需要对定时任务进行更改时,请使用 crontab -e 命令再次编辑 Cron 表。

另外,还有一些其他的 CronJob 使用技巧:

可以使用 * 通配符表示任意值,例如 * * * * * 表示每分钟都运行。
您可以使用逗号分隔的值来指定多个值,例如 0,15,30,45 * * * * 表示每小时的第 0、15、30 和 45 分钟运行。
可以使用连字符指定一个范围,例如 0 9-17 * * 1-5 表示在周一至周五的上午 9 点到下午 5 点之间的每个整点运行。

请注意,CronJob 的精度是分钟级别的,并且会受到系统时间的影响。因此,确保系统时间准确无误。

看了下我这里的定时任务:

[root@docker-54 config]# crontab -l
0-59/10 * * * * /usr/sbin/ntpdate us.pool.ntp.org | logger -t NTP
[root@docker-54 config]# 

这个定时任务的含义是每隔10分钟执行一次 /usr/sbin/ntpdate us.pool.ntp.org 命令,并将命令的输出通过管道传递给 logger -t NTP

让我来解释一下每个部分的含义:

  • 0-59/10:这表示分钟字段,表示每隔10分钟执行一次任务。范围是从0到59,斜杠后面的数字表示步长,也就是间隔。因此,0-59/10 表示每隔10分钟执行一次任务。

  • *:这是通配符,表示“每”。

  • *:这是通配符,表示不限制。

  • *:这是通配符,表示不限制。

  • /usr/sbin/ntpdate us.pool.ntp.org:这是要执行的命令,它会使用 NTP 协议从 us.pool.ntp.org 获取时间并进行同步。

  • |:这是管道符号,用于将命令的输出传递给下一个命令。

  • logger -t NTP:这是将命令的输出通过 logger 工具记录到系统日志中,标记为 NTP。

因此,这个定时任务的含义是每隔10分钟使用 NTP 协议从 us.pool.ntp.org 获取时间并进行同步,同时将命令的输出记录到系统日志中,以便日后查看或跟踪时间同步的情况。

3. 创建 K8s 的 CronJob

新建配置文件:cron-job-pd.yaml

apiVersion: batch/v1
kind: CronJob # 定时任务
metadata:name: cron-job-test # 定时任务名字
spec:concurrencyPolicy: Allow # 并发调度策略:Allow 允许并发调度,Forbid:不允许并发执行,Replace:如果之前的任务还没执行完,就直接执行新的,放弃上一个任务failedJobsHistoryLimit: 1 # 保留多少个失败的任务successfulJobsHistoryLimit: 3 # 保留多少个成功的任务suspend: false # 是否挂起任务,若为 true 则该任务不会执行
#  startingDeadlineSeconds: 30 # 间隔多长时间检测失败的任务并重新执行,时间不能小于 10schedule: "* * * * *" # 调度策略jobTemplate:spec:template:spec:containers:- name: busyboximage: busybox:1.28imagePullPolicy: IfNotPresentcommand:- /bin/sh- -c- date; echo Hello from the Kubernetes clusterrestartPolicy: OnFailure

这里使用 busybox镜像创建一个容器,每分钟执行一次 date; echo Hello from the Kubernetes cluster的命令。

[root@docker-54 jobs]# kubectl apply -f cron-job-pd.yaml 
cronjob.batch/cron-job-test created
[root@docker-54 jobs]# 
[root@docker-54 jobs]# kubectl get cronjob
NAME            SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cron-job-test   * * * * *   False     0        <none>          5s
[root@docker-54 jobs]#
[root@docker-54 jobs]# kubectl get cj
NAME            SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cron-job-test   * * * * *   False     0        <none>          36s
[root@docker-54 jobs]# 

这里显示LAST SCHEDULE为 none 表示最后一次调度记录不存在,证明还没有执行过。

[root@docker-54 jobs]# kubectl describe cj cron-job-test
Name:                          cron-job-test
Namespace:                     default
Labels:                        <none>
Annotations:                   <none>
Schedule:                      * * * * *
Concurrency Policy:            Allow
Suspend:                       False
Successful Job History Limit:  3
Failed Job History Limit:      1
Starting Deadline Seconds:     <unset>
Selector:                      <unset>
Parallelism:                   <unset>
Completions:                   <unset>
Pod Template:Labels:  <none>Containers:busybox:Image:      busybox:1.28Port:       <none>Host Port:  <none>Command:/bin/sh-cdate; echo Hello from the Kubernetes clusterEnvironment:     <none>Mounts:          <none>Volumes:           <none>
Last Schedule Time:  Sun, 26 Nov 2023 22:35:00 +0800
Active Jobs:         cron-job-test-28350155
Events:Type    Reason            Age   From                Message----    ------            ----  ----                -------Normal  SuccessfulCreate  57s   cronjob-controller  Created job cron-job-test-28350155
[root@docker-54 jobs]# 

可以下这个任务的具体信息。

接着再看下状态:

[root@docker-54 jobs]# kubectl get cj
NAME            SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cron-job-test   * * * * *   False     0        32s             3m30s
[root@docker-54 jobs]# 

可以看到已经距离上次调度已经过了 32s 了。

另外看下执行记录:

[root@docker-54 jobs]# kubectl get po | grep cron
cron-job-test-28350156--1-xn5xf   0/1     Completed   0               2m46s
cron-job-test-28350157--1-9mfwx   0/1     Completed   0               106s
cron-job-test-28350158--1-75v5k   0/1     Completed   0               46s
[root@docker-54 jobs]# 
[root@docker-54 jobs]# kubectl logs -f cron-job-test-28350158--1-75v5k
Sun Nov 26 14:38:01 UTC 2023
Hello from the Kubernetes cluster
[root@docker-54 jobs]# 

可以看到这些执行任务,并且是执行成功的状态。

在我们实际是用的过程中,也是这样,只是把我们的脚本改成自定义的实现就好了。

4. 删除 k8s 的 CronJob

接着我们来删除这个 CronJob:

[root@docker-54 jobs]# kubectl get cj
NAME            SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cron-job-test   * * * * *   False     0        11s             7m9s
[root@docker-54 jobs]# 
[root@docker-54 jobs]# kubectl delete cj cron-job-test
cronjob.batch "cron-job-test" deleted
[root@docker-54 jobs]# 
[root@docker-54 jobs]# kubectl get cj
No resources found in default namespace.
[root@docker-54 jobs]# 
[root@docker-54 jobs]# kubectl get po | grep cron
[root@docker-54 jobs]# 

可以看到,在我删除了CronJob 之后,对应的 Pod 记录也随之删除了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/173276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『Linux升级路』基础开发工具——make/Makefile

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;Linux &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、认识make/Makefile &#x1f4d2;1.1make/Makefile的优点 &#x1f4d2;…

EM32DX-C1【分布式io】

1设备类型&#xff1a; 电压&#xff1a;DC24V 输入16点 输出16点雷赛 EM32DX-C1 模块是一款基于 ASIC 技术的高性能、高可靠性的 CANopen 总线数字 量输入输出扩展模块&#xff0c;具有 16 路通用输入接口和 16 路通用输出接口。输入输出接口均采用光 电隔离和…

【yolov5人行道-斑马线目标检测】

yolov5人行道-斑马线目标检测 数据集yolov5人行道-斑马线目标检测检测模型 数据集 YOLOv5是一种目标检测算法&#xff0c;可以用于检测图像中的人行道-斑马线。在目标检测领域&#xff0c;YOLOv5通过结合多种技术手段&#xff0c;包括使用Mosaic数据增强操作、自适应锚框计算与…

SDN之Ubuntn20.04OpenDaylight控制器的安装

目录 1.OpenDaylight简介2.安装JAVA环境3.安装OpenDaylight4.问题总结 1.OpenDaylight简介 OpenDaylight&#xff08;ODL&#xff09;是一个开源的软件定义网络&#xff08;SDN&#xff09;控制器平台&#xff0c;提供了非常美观且功能完善的可视化管理界面&#xff0c;方便用…

15.解释Spring支持的几种bean的作用域

Spring支持的几种bean的作用域 Spring框架支持以下五种bean的作用域&#xff1a; singleton : bean在每个Spring ioc 容器中只有一个实例。prototype&#xff1a;一个bean的定义可以有多个实例。request&#xff1a;每次http请求都会创建一个bean&#xff0c;该作用域仅在基于…

redis Redis::geoAdd 无效,phpstudy 如何升级redis版本

redis 查看当前版本命令 INFO SERVERwindows 版redis 进入下载 geoadd 功能在3.2之后才有的&#xff0c;但是phpstudy提供的最新的版本也是在3.0&#xff0c;所以需要升级下 所以想出一个 挂狗头&#xff0c;卖羊肉的方法&#xff0c;下载windows 的程序&#xff0c;直接替…

桥梁道路结冰传感器守护出行安全的重要工具

随着冬季的到来&#xff0c;气温逐渐降低&#xff0c;路面和桥梁容易结冰&#xff0c;给人们的出行带来安全隐患。为了解决这一问题&#xff0c; WX-JB2H 桥梁道路结冰传感器应运而生。本文将详细介绍桥梁道路结冰传感器的作用、原理及在冬季出行中的重要性。 一、桥梁道路结冰…

14.配置Bean有哪几种方式?

配置Bean有哪几种方式? 基于xml: <bean class=“com.tuling.UserService” id=“”>基于注解: @Component(@Controller 、@Service、@Repostory) 前提:需要配置扫描包<component-scan> 反射调用构造方法基于java类配置: @Bean 可以自己控制实例化过程@Import 3种…

flink源码分析之功能组件(三)-rpc组件

简介 本系列是flink源码分析的第二个系列,上一个《flink源码分析之集群与资源》分析集群与资源,本系列分析功能组件,kubeclient,rpc,心跳,高可用,slotpool,rest,metrics,future。 本文解释rpc组件,rpc组件用于个核心组件,包括作业管理器,资源管理器和任务管理器之…

什么是高防IP?如何进行防护?怎样隐藏源站?

高防IP是针对互联网服务器遭受大流量的DDoS攻击后导致服务不可用的情况下&#xff0c;推出的付费增值服务&#xff0c;是目前最常用的一种防御DDoS攻击的手段。用户在数据不转移的情况下&#xff0c;就可以通过配置高防IP&#xff0c;将攻击流量引流到高防IP&#xff0c;防护系…

iOS移动应用程序的备案与SHA-1值查看

​ 目录 &#x1f4dd;iOS移动应用程序的备案与SHA-1值查看 引言 第一部分&#xff1a;App备案 第二部分&#xff1a;查看SHA-1值 引言 在开发和发布移动应用程序时&#xff0c;进行App备案是非常重要的一步&#xff0c;它是确保您的应用在合规性方面符合相关法规的过程。…

glibc和gcc源码

glibc下载 $ git clone git://sourceware.org/git/glibc.gitgcc编译器&#xff0c;https://gcc.gnu.org/ git clone git://gcc.gnu.org/git/gcc.git

2023-11-27 LeetCode每日一题(子数组的最小值之和)

2023-11-27每日一题 一、题目编号 907. 子数组的最小值之和二、题目链接 点击跳转到题目位置 三、题目描述 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr 的每个&#xff08;连续&#xff09;子数组。 由于答案可能很大&#xff…

记一次处理大数据而导致的内存溢出问题

问题 订单服务通过MQ进行订单同步时&#xff0c;刚启动可以正常消费&#xff0c;但是跑一会就会卡住&#xff0c;每次都是第8个kafka分区不行再进行消费&#xff0c;其他分区消费的很慢。 现象 首先&#xff0c;CPU超高&#xff0c;达到百分之300多&#xff1b;其次&#xf…

2023年双十二超声波清洗机如何选?有哪些值得购买的超声波清洗机?

通过眼科医院对近视眼统计报告说明&#xff0c;截止2023年3月27日&#xff0c;全国近视眼人数为3亿人&#xff0c;其中青少年近视约为2亿人&#xff0c;现在大部分人都离不开眼镜&#xff0c;也有很多人忽视了清洗眼镜的重要性&#xff0c;眼镜长时间的不清洗的话会很容易导致脸…

【实战教程】PHP与七牛云的完美对接

前言&#xff1a; 随着互联网的迅速发展&#xff0c;越来越多的网站和应用程序需要处理大量的图片、视频和其他文件。为了有效地存储和管理这些文件&#xff0c;并提供快速的内容分发服务&#xff0c;开发者们常常依赖于云存储和CDN服务提供商。 七牛云是一家领先的云存储和C…

2023华为ICT网络初赛试题回顾

所有题目都只能用来学习交流&#xff0c;禁止用于非法不公平的使用&#xff0c;如有侵权&#xff0c;该文章立刻删除。 1、某机房没有合适长度的网线&#xff0c;现需手工制作一个568B标准的双纹线&#xff0c;那么应按照以下哪一线序进行制作? A.绿白,绿&#xff0c;蓝&#…

想要对网站进行安全监测,安全SCDN效果怎么样?

随着互联网的迅速成长&#xff0c;各种网站出现的越来越多&#xff0c;个人网站、企业网站等&#xff0c;同时网站竞争也越来越强。随着用户对网站需求增多&#xff0c;对网站的安全也愈发受到人们的重视。那么我们日常网站运营中&#xff0c;有需要对网站进行安全监控&#xf…

dbeaver 中如何set define off

窗口-首选项-编辑器-SQL编辑器-SQL处理-参数- 勾选“启用SQL参数”---set define on 取消勾选“启用SQL参数”---set define off

MyBatis Generator使用总结

MyBatis Generator使用总结 介绍具体使用数据准备插件引入配置条件构建讲解demo地址 介绍 MyBatis Generator &#xff08;MBG&#xff09; 是 MyBatis 的代码生成器。它能够根据数据库表&#xff0c;自动生成 java 实体类、dao 层接口&#xff08;mapper 接口&#xff09;及m…