k8s中job与cronjob使用实例详解

目录
  • 一、前言
  • 二、k8s中job特点
  • 三、Job模板配置文件核心配置参数
    • 3.1 ttlSecondsAfterFinished
    • 3.2 activeDeadlineSeconds
    • 3.3 backoffLimit
    • 3.4 parallelism
    • 3.5 completions
  • 四、job案例操作演示
  • 五、cronjob 理论
  • 六、cronjob 模板配置文件核心配置参数
  • 七、cronjob 案例操作演示
    • cronjob的运行状态
    • job的运行状态
    • pod的运行状态
    • cronjob使用场景

一、前言

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

k8s中的job,主要用于批量处理的业务场景,比如像那种短暂的一次性任务(每个任务仅运行一次就结束);

二、k8s中job特点

  • 当Job创建的pod执行成功结束时,Job将记录成功结束的pod数量;
  • 当成功结束的pod达到指定的数量时,Job将完成执行;

job与pod的关系如下图

三、Job模板配置文件核心配置参数

如下为job的一个模板配置yaml文件中的部分核心配置参数

apiVersion: batch/v1 # 版本号
kind: Job # 类型
metadata: # 元数据
  name: # rs名称
  namespace: # 命名空间
  labels:
    controller: job
spec:
  completions: 6 # 指定job需要成功运行Pods的次数。默认值: 1
  parallelism: 3 # 指定job在任一时刻应该并发运行Pods的数量。默认值: 1
  ttlSecondsAfterFinished: 5
  activeDeadlineSeconds: 30 # 指定job可运行的时间期限,超过时间还未结束,系统将会尝试进行终止。
  backoffLimit: 5 # 指定job失败后进行重试的次数。默认是6
  manualSelector: true # 是否可以使用selector选择器选择pod,默认是false
  selector: # 选择器,通过它指定该控制器管理哪些pod
    matchLabels:      # Labels匹配规则
      app: counter-pod
    matchExpressions: # Expressions匹配规则
      - {key: app, operator: In, values: [counter-pod]}
  template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
    metadata:
      labels:
        app: counter-pod
    spec:
      restartPolicy: Never # 重启策略只能设置为Never或者OnFailure
      containers:
      - name: counter
        image: busybox:1.30
        command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 2;done"]

可以参照各个参数的备注加以理解,下面对其中部分参数做补充说明;

3.1 ttlSecondsAfterFinished

  • 当设置了ttlSecondsAfterFinished参数,job完成或者失败后都会在ttlSecondsAfterFinished所设置的时间后被清理;
  • 假设ttlSecondsAfterFinished 设置成30。在job完成或者失败后30s,job就会被自动清除,包括job和job所管理的pod都会被清除;
  • 假设没有设置,job和job所管理的pod会一直存在,不管是失败还是成功,不过好像有些k8s的版本ttlSecondsAfterFinished是不生效的,建议使用1.20以上的版本;

3.2 activeDeadlineSeconds

  • Job的超时时间,一旦一个Job运行的时间超出该限制,则Job失败,所有运行中的Pod会被结束并删除;
  • 该配置指定的值必须是个正整数,不指定则不会超时;
  • 但是经过实验,job pod并不会自动删除,所以如果希望超时后pod会自动删除还是设置一下ttlSecondsAfterFinished;

3.3 backoffLimit

  • 允许执行失败的次数,默认值是6,0表示不允许执行失败;
  • 如果Pod是restartPolicy为Nerver,则失败后会创建新的Pod,如果是OnFailed,则会重启Pod,不管是哪种情况,只要Pod失败一次就计算一次,而不是等整个Pod失败后再计算一个;
  • 当失败的次数达到该限制时,整个Job随即结束,所有正在运行中的Pod都会被删除;
  • 但是经过实验,jobpod并不会自动删除,所以如果希望超时后pod会自动删除还是设置一下ttlSecondsAfterFinished;

3.4 parallelism

并行运行的Pod的个数,默认值为1,假如设置为3,就会同时开启3个pod去执行任务

3.5 completions

  • 完成该Job需要执行成功的Pod数;
  • 指定需要完成的数量,默认值为1,假设设置为3,需要有三个pod成功完成任务,这个job才算是完成;

四、job案例操作演示

在当前目录下创建一个jod-pod.yaml文件,配置如下内容

apiVersion: batch/v1
kind: Job
metadata:
  name: test-job
  namespace: default
spec:
  manualSelector: true
  selector:
    matchLabels:
      app: counter-pod
  template:
    metadata:
      labels:
        app: counter-pod
    spec:
      restartPolicy: Never
      containers:
      - name: counter
        image: busybox:1.30
        command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]

使用apply创建pod

在另外的两个窗口,我们提前打开监控pod和job的执行情况,可以看到下面的完整执行过程;

从job的执行过程来看,经历了从无到有以及到最终的STATUS状态为Completed的过程,这个也和上文提到的job的生命周期描述吻合;

对于Pod的执行过程来看,从下面这张图可以清晰看到STATUS的各个阶段变化的完整过程;

其他的模板中的参数可以直接往里面添加即可在job运行过程中看到效果,比如我们在该模板文件中补充两个参数;

再次运行这个job,通过job和pod的监控信息,看到如下的效果;

五、cronjob 理论

CronJob其实就是在Job的基础上加上了时间调度,我们可以:在给定的时间点运行一个任务,也可以周期性地在给定时间点运行。这个实际上和我们Linux中的crontab就非常类似了。

CronJob控制器以 Job控制器资源为其管控对象,并借助它管理pod资源对象,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点重复运行的方式。也就是说,CronJob可以在特定的时间点(反复的)去运行job任务

cronjob 运行原理图

六、cronjob 模板配置文件核心配置参数

如下为cronjob模板配置文件中核心参数;

apiVersion: batch/v1beta1 # 版本号
kind: CronJob # 类型
metadata: # 元数据
  name: # rs名称
  namespace: # 命名空间
  labels: #标签
    controller: cronjob
spec: # 详情描述
  schedule: # cron格式的作业调度运行时间点,用于控制任务在什么时间执行
  concurrencyPolicy: # 并发执行策略,用于定义前一次作业运行尚未完成时是否以及如何运行后一次的作业
  failedJobHistoryLimit: # 为失败的任务执行保留的历史记录数,默认为1
  successfulJobHistoryLimit: # 为成功的任务执行保留的历史记录数,默认为3
  startingDeadlineSeconds: # 启动作业错误的超时时长
  jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象;下面其实就是job的定义
    metadata:
    spec:
      completions: 1
      parallelism: 1
      activeDeadlineSeconds: 30
      backoffLimit: 6
      manualSelector: true
      selector:
        matchLabels:
          app: counter-pod
        matchExpressions: 规则
          - {key: app, operator: In, values: [counter-pod]}
      template:
        metadata:
          labels:
            app: counter-pod
        spec:
          restartPolicy: Never
          containers:
          - name: counter
            image: busybox:1.30
            command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 20;done"]

关于配置文件中的补充参数说明

concurrencyPolicy

concurrencyPolicy 配置策略

  • Allow: 允许Jobs并发运行(默认);
  • Forbid: 禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行;
  • Replace: 替换,取消当前正在运行的作业并用新作业替它;

Cron调度语法

注意K8S的定时任务仅支持5位,从minute开始

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │ 7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
#* * * * *

七、cronjob 案例操作演示

在当前目录创建一个cron-job.yaml的配置文件,配置内容如下:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: test-cronjob
  namespace: default
  labels:
    controller: cronjob
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    metadata:
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
          - name: counter
            image: busybox:1.30
            command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]

使用apply(或create命令)创建cronjob

通过开启其他客户端窗口,可以监控cronjob,job以及pod的运行过程中的状态;

cronjob的运行状态

上面的配置策略是每分钟执行,从下图的运行效果中也可以看出来;

job的运行状态

pod的运行状态

cronjob使用场景

Cron 作业对于创建周期性和重复性任务很有用,例如运行备份或发送电子邮件。Cron 作业还可以将单个任务安排在特定时间,例如,你想将作业安排在业务低峰期执行。

到此这篇关于k8s中job与cronjob使用实例详解的文章就介绍到这了,更多相关k8s job与cronjob使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java开源调度如何给xxljob加k8s执行器

    目录 前言 执行器接口 K8S执行器设计 1.在XXL-JOB-ADMIN模块新增执行器 2.引入K8S-CLIENT-JAVA,使用SERVICEACCOUNT机制与K8S交互 3.编写代理执行器调度代码 结语 前言 xxljob 是采用 java 开发的开源的任务调度系统,架构上分为调度管理器.执行器,目前除了官方提供的 java 执行器外,也有 go 开发者提供了 go 语言的执行器(看了 go 执行器的代码,除了任务日志没有实现,其他功能实现都比较完整). xxljob 在设计上,抽象出

  • k8s中job与cronjob使用实例详解

    目录 一.前言 二.k8s中job特点 三.Job模板配置文件核心配置参数 3.1 ttlSecondsAfterFinished 3.2 activeDeadlineSeconds 3.3 backoffLimit 3.4 parallelism 3.5 completions 四.job案例操作演示 五.cronjob 理论 六.cronjob 模板配置文件核心配置参数 七.cronjob 案例操作演示 cronjob的运行状态 job的运行状态 pod的运行状态 cronjob使用场景 一

  • C++ 中const修饰虚函数实例详解

    C++ 中const修饰虚函数实例详解 [1]程序1 #include <iostream> using namespace std; class Base { public: virtual void print() const = 0; }; class Test : public Base { public: void print(); }; void Test::print() { cout << "Test::print()" << end

  • AngularJS中使用three.js的实例详解

    AngularJS中使用three.js的实例详解 一.轨迹球的引入问题 一开始我是用下面的方式引如轨迹球,但是会报Trackballcontrols is undefined的错. import * as THREE from 'three'; import * as Trackballcontrols from 'three'; 但其实我是能够在node_module下的threejs的包中找到Trackballcontrols的文件的,我一开始以为是引用的路径没对然后修改路径到对应包下Tr

  • IOS 中CALayer绘制图片的实例详解

    IOS 中CALayer绘制图片的实例详解 CALayer渲染内容图层.与UIImageView相比,不具有事件响应功能,且UIImageView是管理内容. 注意事项:如何使用delegate对象执行代理方法进行绘制,切记需要将delegate设置为nil,否则会导致异常crash. CALayer绘制图片与线条效果图: 代码示例: CGPoint position = CGPointMake(160.0, 200.0); CGRect bounds = CGRectMake(0.0, 0.0

  • vue中v-model动态生成的实例详解

    vue中v-model动态生成的实例详解 前言: 最近在做公司的项目中,有这么一个需求,每一行有一个input和一个select,其中行数是根据服务器返回的json数据动态变化的.那么问题来了,我们要怎样动态生成v-model? 现在项目做完了就整理了一下,直接贴代码了. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <

  • Linux 中常用的Rpm命令实例详解

    rpm命令是RPM软件包的管理工具.rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎.逐渐受到其他发行版的采用.RPM套件管理方式的出现,让Linux易于安装,升级,间接提升了Linux的适用度. 语法 rpm(选项)(参数) 选项 -a:查询所有套件: -b<完成阶段><套件档>+或-t <完成阶段><套件档>+:设置包装套件的完成阶段,并指定套件档的文件名称: -c:只列出

  • Linux 中fork的执行的实例详解

    Linux 中fork的执行的实例详解 先看看一段fork的程序 int main() { pid_t pid; 语句 a; pid = fork(); 语句 b; } 1.当程序运行到 pid = fork()时,这个进程马上分裂(fork的中文意思)成两个进程,我们称为父进程和子进程,子进程是父进程的副本,副本的意思是子进程把父进程的数据空间,堆和栈都复制一遍给自己用,这要求在内存给子进程分配和父进程同样大的存储空间,这样,父,子进程拥有相同的数据,但不会共享存储空间,他们只是共享正文段.

  • java 中HttpClient传输xml字符串实例详解

    java 中HttpClient传输xml字符串实例详解 介绍:我现在有一个对象page,需要将page对象转换为xml格式并以binary方式传输到服务端 其中涉及到的技术点有: 1.对象转xml流 2.输出流转输入流 3.httpClient发送二进制流数据 POM文件依赖配置 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifact

  • java 中模式匹配算法-KMP算法实例详解

    java 中模式匹配算法-KMP算法实例详解 朴素模式匹配算法的最大问题就是太低效了.于是三位前辈发表了一种KMP算法,其中三个字母分别是这三个人名的首字母大写. 简单的说,KMP算法的对于主串的当前位置不回溯.也就是说,如果主串某次比较时,当前下标为i,i之前的字符和子串对应的字符匹配,那么不要再像朴素算法那样将主串的下标回溯,比如主串为"abcababcabcabcabcabc",子串为"abcabx".第一次匹配的时候,主串1,2,3,4,5字符都和子串相应的

  • IOS 中KVC的使用方法实例详解

    IOS 中KVC的使用方法实例详解 KVC是Key Value Coding的缩写,意思是键值编码.在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象的属性方法.说的有的拗口,实际上就是通过类定义我们可以看到类的各种属性,那么使用属性的名称我们就能访问到类实例化后的对象的这个属性值. 这个方法可以不通过getter/setter方法来访问对象的属性.因为一个类的成员变量如果没有提供getter/setter的话,外界就失去了对这个变量的访问渠道.而KVC则提供了一种访问的

随机推荐