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运行的三种模式:

  1. Non-parallel(非并行) Jobs

    • 通常情况,除非pod发生故障,否则仅启动一个pod
    • pod运行成功后,job成complate状态
  2. 固定parallel(并行)Jobs一个完成次数

.spec.completion指定一个非零的正值

job是整体任务,在1到范围内的每个值都有一个成功的Pod时完成 .spec.completions

  1. 具有工作队列的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"

我们这里的KindCronJob了,要注意的是.spec.schedule字段是必须填写的,用来指定任务运行的周期,格式就和crontab一样,另外一个字段是.spec.jobTemplate, 用来指定需要运行的任务,格式当然和Job是一致的。还有一些值得我们关注的字段.spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimit,表示历史限制,是可选的字段。它们指定了可以保留多少完成和失败的Job,默认没有限制,所有成功和失败的Job都会被保留。然而,当运行一个Cron Job时,Job可以很快就堆积很多,所以一般推荐设置这两个字段的值。如果设置限制的值为 0,那么相关类型的Job完成后将不会被保留。

job和cronjob的使用的更多相关文章

  1. cronjob不跑得原因

    能是环境的不同,能够在cronjob中加个env > /tmp/env.output查看 应用要同一时候输出标准错误合标准输出到一个文件能够&> /tmp/t

  2. Kubernetes — Job与CronJob

    有一类作业显然不满足这样的条件,这就是“离线业务”,或者叫作 Batch Job(计算业务). 这 种业务在计算完成后就直接退出了,而此时如果你依然用 Deployment 来管理这种业务的话,就会 ...

  3. k8s cronjob设置作业失败后退出不重复执行

    Optional parameters backoffLimit: Number of retries for pods launched by the job. If you want your p ...

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

  5. 【读书笔记】Cronjob原理及源码分析

    原文链接:https://mp.weixin.qq.com/s?__biz=MzI0NjI4MDg5MQ==&mid=2715291842&idx=1&sn=e605f9b40 ...

  6. Hybris CronJob.

    一.概念     CronJobs提供了在特定的时间或者间隔内处理业务逻辑的方法.一般创建一个Cronjob有两种方式,第一种是定义Java类,由Hybris生成脚本并加入数据库.第二种是直接编写gr ...

  7. 使用k8s cronjob ,清除应用生成的日志文件

    目前应用日志,tomcat日志 统一输出到 /data/logs/pod名字/ 目录下,并且/data/logs 目录挂载到cephfs上, tomcat 日志使用 cronolog进行日志切割 使用 ...

  8. linux下使用cronjob定时执行php脚本

    在linux中输入命令 crontab -e 然后使用vim的命令编辑打开的文件,输入 * * * * /usr/bin/php -f /home/userxxx/update.php 保存,退出,好 ...

  9. kubernetes 学习 创建cronjob

    POM.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  10. kubernetes对象之cronjob

    系列目录 类似于Linux的Cron模块,CronJob用来运行定时性任务,或者周期性.重复性任务.注意CronJob启动的是kubernetes中的Job,不是ReplicaSet.DaemonSe ...

随机推荐

  1. package.json详解以及package-lock.json的作用

    一.创建 package.json输入如下命令之后,会要求填写基本的配置信息,这里,我们选择一路回车即可,待生成 package.json 文件之后,再来配置. npm init 二.配置 packa ...

  2. 转 Oracle 同一个字段的两值进行加减计算

    https://www.cnblogs.com/hjianguo/p/6041617.html 如 病人ID      入院日期                出院日期 00001      2016 ...

  3. Java之数组类型

    如果我们有一组类型相同的变量.例如,5位同学的成绩,可以这么写 public class Main { public static void main(String[] args) { // 5位同学 ...

  4. CVE-2019-16278-Nostromo Web Server远程代码执行

    本文主题主要是分析CVE-2019-16278漏洞原因.漏洞如何利用以及为什么会受到攻击.这个CVE跟Nostromo Web服务器(又名nhttpd)有关,这个组件是在FreeBSD,OpenBSD ...

  5. SQLServer for linux安装

    linux下安装sqlserver数据库有2种办法,第一使用yum镜像安装,第二使用rpm安装包安装 rpm安装地址为:https://packages.microsoft.com/rhel/7/ms ...

  6. imagettftext(): Could not read font

    imagettftext(): Could not read font 1 确认FreeType Version ( 2以上版本) 2 确认字体路径,要是绝对路径的 3 确认 php.ini 配置 开 ...

  7. python中判断对象类型的函数——isinstance

    isinstance是Python中的一个内建函数.是用来判断一个对象的变量类型. isinstance(object, class-or-type-or-tuple) 如果参数object是clas ...

  8. navcat excel数据导入mysql的方法

    navcat excel数据导入mysql的方法 先navcat导出 xls格式 然后把数据复制到往这个xls里 (按照这个xls格式) 然后导入mysql就行了 如果导入的过程无法识别excel里的 ...

  9. kafka java项目测试使用

    引入依赖 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.11 ...

  10. fineui整合kindeditor的例子

    如果看不清: http://fineui.com/bbs/forum.php?mod=viewthread&tid=6683   注意:高于fineui v4.2.0的版本kindeditor ...