job和cronjob的使用
job和cronjob的使用
我们在工作中会遇到需要批量处理数据和分析的需求,也会有按时间来进行调度的工作,在k8s集群中,有job和cronjob两中资源对象来映带我们的这种需要。
job负责处理任务,仅执行一次的任务,他保证批处理任务的一个或多个pod成功结束。而cronjob则就是在job上加上了时间调度,相当于定时任务。
Job
运行一个官方job示例,计算π到2000位,大约需要10秒钟:
apiVersion: batch/v1
kind: Jobs
metadata:
name: pi
spec:
template:
backoffLimit: 6 #默认重试6次后才认为执行失败
activeDeadlineSeconds: 100 #重试工作的持续时间,优先级别高于backoffLimit
spec:
restartPolicy: Never #job只有两种重启策略,Never、OnFailure不支持Always,失败状态会陷入失败死循环
containers:
- name: pi
image: perl
command:
- perl
- Mbignum=bpi
- wle
- print bpip(2000)
# 请注意,作业的.spec.activeDeadlineSeconds优先于.spec.backoffLimit。因此,重试一个或多个失败Pod的Job一旦达到所指定的时间限制activeDeadlineSeconds,就不会部署其他Pod ,即使backoffLimit尚未达到。
parallel(并行) Jobs
适应job运行的三种模式:
Non-parallel(非并行) Jobs
- 通常情况,除非pod发生故障,否则仅启动一个pod
- pod运行成功后,job成complate状态
固定parallel(并行)Jobs一个完成次数
.spec.completion指定一个非零的正值
job是整体任务,在1到范围内的每个值都有一个成功的Pod时完成 .spec.completions
具有工作队列的parallel(并行)Jobs
- 不指定 .spec.completions ,默认为 .spec.parallelism
- pod必须在彼此之间或外部服务之间进行协调,以确定每个pod应该如何处理。例如一个pod可以从工作队列中最多获取N批的批处理
- 每个pod都可以独立地确定其所有对等方是否都已完成,从而确定整个pod状态
- 当jobs中任何pod成功终止时,不会创建新的pod
- 所有pod成功终止,则jobs完成
- pod成功推出后,其他pod不应该为此任务再做任何工作或编写任何输出。他们都应该退出
对于非并行jobs,您可以同时保留.spec.completions和不.spec.parallelism设置。两者均未设置时,均默认为1。
对于固定的完成计数jobs,您应该设置.spec.completions为所需的完成数量。您可以设置.spec.parallelism,或不设置它,默认为1。
对于工作队列 Job,您必须保持未.spec.completions设置状态,并将其设置.spec.parallelism为非负整数。
有关如何利用不同类型的jobs的更多信息,请参见jobs模式部分。
处理Pod和容器故障
Pod中的容器可能由于多种原因而失败,例如,由于该容器中的进程以非零退出代码退出,或者该容器因超出内存限制而被杀死等。如果发生这种情况,请使用.spec.template.spec.restartPolicy = "OnFailure",然后Pod停留在节点上,但是容器重新运行。因此,您的程序需要在本地重新启动时处理该情况,或者指定.spec.template.spec.restartPolicy = "Never"。有关的更多信息,请参见pod生命周期restartPolicy。
Pod后退失败策略
在某些情况下,由于配置中的逻辑错误等原因,您需要在重试一定次数后使jobs失败。为此,设置.spec.backoffLimit为指定重试次数,然后再将jobs视为失败。默认情况下,将退避限制设置为6。与jobs相关联的失败Pod由Job控制器重新创建,并且其指数退避延迟(10s,20s,40s…)限制为六分钟。如果在jobs的下一个状态检查之前未出现新的失败Pod,则会重置退避计数。
注意:版本1.12之前的Kubernetes版本仍然存在问题#54870
注意:如果您的jobs具有
restartPolicy = "OnFailure",请记住,一旦达到jobs退避限制,运行该jobs的容器将被终止。这会使调试jobs的可执行文件更加困难。我们建议restartPolicy = "Never"在调试jobs或使用日志记录系统时进行设置 ,以确保不会因疏忽而丢失失败的jobs的输出。
请注意,作业的.spec.activeDeadlineSeconds优先于.spec.backoffLimit。因此,重试一个或多个失败Pod的Job一旦达到所指定的时间限制activeDeadlineSeconds,就不会部署其他Pod ,即使backoffLimit尚未达到。
CronJob
CronJob其实就是在Job的基础上加上了时间调度,我们可以:在给定的时间点运行一个任务,也可以周期性地在给定时间点运行。这个实际上和我们Linux中的crontab就非常类似了。
一个CronJob对象其实就对应中crontab文件中的一行,它根据配置的时间格式周期性地运行一个Job,格式和crontab也是一样的。
crontab的格式如下:
分 时 日 月 星期 要运行的命令 第1列分钟0~59 第2列小时0~23) 第3列日1~31 第4列月1~12 第5列星期0~7(0和7表示星期天) 第6列要运行的命令
现在,我们用CronJob来管理我们上面的Job任务,
apiVersion: batch/v2alpha1
kind: CronJob
metadata:
name: cronjob-demo
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: hello
image: busybox
args:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
我们这里的Kind是CronJob了,要注意的是.spec.schedule字段是必须填写的,用来指定任务运行的周期,格式就和crontab一样,另外一个字段是.spec.jobTemplate, 用来指定需要运行的任务,格式当然和Job是一致的。还有一些值得我们关注的字段.spec.successfulJobsHistoryLimit和.spec.failedJobsHistoryLimit,表示历史限制,是可选的字段。它们指定了可以保留多少完成和失败的Job,默认没有限制,所有成功和失败的Job都会被保留。然而,当运行一个Cron Job时,Job可以很快就堆积很多,所以一般推荐设置这两个字段的值。如果设置限制的值为 0,那么相关类型的Job完成后将不会被保留。
job和cronjob的使用的更多相关文章
- cronjob不跑得原因
能是环境的不同,能够在cronjob中加个env > /tmp/env.output查看 应用要同一时候输出标准错误合标准输出到一个文件能够&> /tmp/t
- Kubernetes — Job与CronJob
有一类作业显然不满足这样的条件,这就是“离线业务”,或者叫作 Batch Job(计算业务). 这 种业务在计算完成后就直接退出了,而此时如果你依然用 Deployment 来管理这种业务的话,就会 ...
- k8s cronjob设置作业失败后退出不重复执行
Optional parameters backoffLimit: Number of retries for pods launched by the job. If you want your p ...
- How to trigger a Kubernetes cronjob manually-手动触发一个cronjob
What should you do when you’ve developed and installed a cron job for your Kubernetes application, a ...
- 【读书笔记】Cronjob原理及源码分析
原文链接:https://mp.weixin.qq.com/s?__biz=MzI0NjI4MDg5MQ==&mid=2715291842&idx=1&sn=e605f9b40 ...
- Hybris CronJob.
一.概念 CronJobs提供了在特定的时间或者间隔内处理业务逻辑的方法.一般创建一个Cronjob有两种方式,第一种是定义Java类,由Hybris生成脚本并加入数据库.第二种是直接编写gr ...
- 使用k8s cronjob ,清除应用生成的日志文件
目前应用日志,tomcat日志 统一输出到 /data/logs/pod名字/ 目录下,并且/data/logs 目录挂载到cephfs上, tomcat 日志使用 cronolog进行日志切割 使用 ...
- linux下使用cronjob定时执行php脚本
在linux中输入命令 crontab -e 然后使用vim的命令编辑打开的文件,输入 * * * * /usr/bin/php -f /home/userxxx/update.php 保存,退出,好 ...
- kubernetes 学习 创建cronjob
POM.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- kubernetes对象之cronjob
系列目录 类似于Linux的Cron模块,CronJob用来运行定时性任务,或者周期性.重复性任务.注意CronJob启动的是kubernetes中的Job,不是ReplicaSet.DaemonSe ...
随机推荐
- 在网址前加神秘字母,让你打开新世界(z)
在网址前加神秘字母,让你打开新世界 1.在百度云后面加“wp”可以高速下载百度云资源<ignore_js_op> 2.在任何网址前面加“wn.run”(一定要加到这个网址www的前面)之后 ...
- logback不同业务的日志打印到不同文件
logback不同业务的日志打印到不同文件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/mggwct/article/details/777 ...
- Kubernetes 原理架构介绍(一)
目录 一.Kubernetes 是什么 二.Kubernetes 设计架构 三.Kubernetes的核心技术概念和API对象 Cluster Master Node Pod Controller D ...
- oracle 通用事务使用
private void dothing() { OracleConnection con = DBHelperOracle.init(); OracleTransaction tran = con. ...
- PAt 1099
1099 Build A Binary Search Tree (30 分) A Binary Search Tree (BST) is recursively defined as a bina ...
- VirtualBox 配置 CentOS7网卡信息
在实际配置虚拟机的过程中,网络配置时候一个很繁琐的过程,经常一个点没注意到,就访问不了了.在此,做一个简单的教程以供后续使用时可以参考! 方法一: 使用NAT网络 1. 选择网卡 安装centos7的 ...
- DELPHI6中DSGNINTF.DCU找不到时的解决方法
https://www.cnblogs.com/gaodu2003/archive/2009/06/04/1495789.html 1.添加 lib\designide.dcp到控件的dpk文件的re ...
- C基础 stack 设计
前言 - stack 设计思路 先说说设计 stack 结构的原由. 以前我们再释放查找树的时候多数用递归的后续遍历去释放. 其内部隐含了运行时的函数栈, 有些语言中存在爆栈风险. 所以想运用显示栈来 ...
- Akka-CQRS(9)- gRPC,实现前端设备与平台系统的高效集成
前面我们完成了一个CQRS模式的数据采集(录入)平台.可以预见:数据的产生是在线下各式各样的终端系统中,包括web.桌面.移动终端.那么,为了实现一个完整的系统,必须把前端设备通过某种网络连接形式与数 ...
- 【实战经验】--Xilinx--IPcore--PLL生成
用途: PLL用于产生自己想要的时钟,可以倍频有可以分频,通常倍频. 生成: 1.打开ISE—— Project —— New source,选择IP(CORE Generator & Arc ...