在Kubernetes 中通过创建工作负载资源 Job 可完成大型计算以及一些批处理任务。比如 Job 转码文件、获取部分文件和目录,机器学习中的训练任务等。这篇小作文我们一起来了解 k8s 中关于 job、cronjob 的内容。


Job创建

我们可以通过API版本 batch/v1创建出一个简单的k8s Job

#new-job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: command-job
spec:
template:
spec:
containers:
- name: command-job
image: busybox
command: ["/bin/sh","-c","sleep 5;echo 'job one'"]
restartPolicy: Never

Job对象 将会启动一个pod用于完成我们的工作--睡眠5s,接着输出 job one

应用job定义,查看job工作工作状态:

$ kubectl apply -f new-job.yml
job.batch/command-job created

任务完成后,pod状态被置为Completed:

通过logs查看我们的任务执行结果:


Job重启与失败认定

在上面我们的例子中,job pod顺利的完成了我们的任务。当pod在执行作业时,容器可能会由于一些原因启动失败,比如进程以非0代码退出或超出内存限制等。在pod模板中可以通过restartPolicy控制job pod的重启策略。

重启策略(restartPolicy):

  • Never:pod启动失败时不会重启,而是通过job-controller重新创建pod供节点调度。
  • OnFailure:pod将会在节点重启执行任务。

失败回退策略(backoffLimit):

当Job pod 经过多次重启无果,显然我们应该认定这个Job是一个失败任务,默认失败认定重启次数为6,我们可以通过在spec中添加backoffLimit来改变这一认定。

我们调整new-job.yml如下:

#new-job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: command-job-two
spec:
template:
spec:
containers:
- name: command-job-two
image: busybox
command: ["/bin/sh","-c","sleep 5;echo 'job two';exit 1"]
restartPolicy: Never
backoffLimit: 2

我们通过describe查看创建的Job

job-controller经过2次重建pod达到阈值,job-controller认定本次Job为失败工作流。

在重启策略为Never时,认定失败的Job会将pod遗留在节点上。


Job 期限与清理

除了Job执行结束与重启失败认定的Job 终止外还可以通过配置活跃期限(activeDeadlineSeconds)来自动停止Job任务。

我们可以为 Job 的 .spec.activeDeadlineSeconds 设置一个秒数值。 该值适用于 Job 的整个生命期,无论 Job 创建了多少个 Pod。 一旦 Job 运行时间达到 activeDeadlineSeconds 秒,其所有运行中的 Pod 都会被终止,并且 Job 的状态更新为 type: Failedreason: DeadlineExceeded

注意 Job 的 .spec.activeDeadlineSeconds 优先级高于其 .spec.backoffLimit 设置。 因此,如果一个 Job 正在重试一个或多个失效的 Pod,该 Job 一旦到达 activeDeadlineSeconds 所设的时限即不再部署额外的 Pod,即使其重试次数还未 达到 backoffLimit 所设的限制。

调整new-job.yml如下:

#new-job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: command-job-three
spec:
template:
spec:
containers:
- name: command-job-three
image: busybox
command: ["/bin/sh","-c","sleep 50;echo 'job three'"]
restartPolicy: Never
backoffLimit: 2
activeDeadlineSeconds: 10

虽然是50s的任务,但是由于activeDeadlineSeconds的限制,Job运行10s后被终止

清理job和终止相似,我们可以通过添加spec.ttlSecondsAfterFinished使Job在任务完成后一段时间内被清理,读者感兴趣可动手尝试一下。


Job 任务类型

  • 非并行 Job

    通常只启动一个 Pod,除非该 Pod 失败,Pod中应用成功运行完成即视为Job任务为完成状态,我们上面讨论的任务即属于此类。

  • **并行 Job **

    • 指定任务数的并行 Job

      通过spec.completions指定任务数,一旦所有 Pod 成功完成它的任务. 作业将完成。

      我们添加一个new-jobs.yml,并指定completions为3

      apiVersion: batch/v1
      kind: Job
      metadata:
      name: command-jobs
      spec:
      template:
      spec:
      containers:
      - name: command-jobs
      image: busybox
      command: ["/bin/sh","-c","sleep 50;echo 'jobs '"]
      restartPolicy: Never
      backoffLimit: 2
      completions: 3

      当3个Pod都运行完成时,Job状态为成功执行。

    我们可以从Job pod 运行过程中看到次模式中Pod 创建存在先后顺序,即需要等待一个job完成后,开启下一个Job的运行。

    • 工作队列式的并行 Job

      一旦一个 Pod 成功终止则所有 Pod 都都终止,此时Job 成功完成。

      修改new-jobs.yml,并添加parallelism使其并行数为5

      apiVersion: batch/v1
      kind: Job
      metadata:
      name: command-jobs
      spec:
      template:
      spec:
      containers:
      - name: command-jobs
      image: busybox
      command: ["/bin/sh","-c","sleep 50;echo 'jobs '"]
      restartPolicy: Never
      backoffLimit: 2
      parallelism: 5

      此类Job Pod在同一时间创建和结束。


Cronjob周期性任务

CronJob 用于执行周期性的动作,例如备份、邮件、报告生成等。

cron时间配置与linux crontab相似。

#      ┌────────────────── 时区 (可选)
# | ┌───────────── 分钟 (0 - 59)
# | │ ┌───────────── 小时 (0 - 23)
# | │ │ ┌───────────── 月的某天 (1 - 31)
# | │ │ │ ┌───────────── month (1 - 12)
# | │ │ │ │ ┌───────────── 周的某天 (0 - 6)(周日到周一;在某些系统上,7 也是星期日)
# | │ │ │ │ │
# | │ │ │ │ │
# | │ │ │ │ │
# CRON_TZ=UTC * * * * *

添加cronjob.yml如下:

#cronjob.yml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: cronjob
image: busybox
command: ["/bin/sh","-c","date"]
restartPolicy: Never

我们通过cronjob没隔一分钟打印一次日期。

查看cronjob信息:

通过logs查看任务结果:

[docker@localhost yml]$ kubectl logs cronjob-1635010680-n5gxj
Sat Oct 23 17:38:15 UTC 2021

cronjob可以自动清理任务,默认保留3次成功的任务,我们可以通过添加.spec.successfulJobsHistoryLimit改变保留的历史任务信息即Pod。


以上我们将k8s中Job、Cronjob涉及的大部分内容进行了介绍。

参考:

Job

Running Automated Tasks with a CronJob

希望小作文对你有些许帮助,如果内容有误请指正。

您可以随意转载、修改、发布本文,无需经过本人同意。亦可通过博客阅读本文iqsing.github.io

k8s 关于Job与Cronjob的更多相关文章

  1. Kubernetes --(k8s)Job、CronJob

    Job https://www.kubernetes.org.cn/job https://www.kubernetes.org.cn/cronjob Job负责批量处理短暂的一次性任务 (short ...

  2. 【原创】k8s之job和Cronjob

    1.失败任务 apiVersion: batch/v1 kind: Job metadata: name: bad spec: template: metadata: name: bad spec: ...

  3. k8s job的使用

    1.运行一次性容器 容器按照持续运行的时间可分为两类: 服务类容器 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等. 工作类容器 工作类容器则是一次性任务,比 ...

  4. linux运维、架构之路-K8s应用

    一.Deployment         k8s通过各种Controller管理Pod的生命周期,为了满足不同的业务场景,k8s提供了Deployment.ReplicaSet.DaemonSet.S ...

  5. 15分钟在阿里云Kubernetes服务上快速建立Jenkins X Platform并运用GitOps管理应用发布

    本文主要介绍如何在阿里云容器服务Kubernetes上快速安装部署Jenkins X Platform并结合demo实践演示GitOps的操作流程. 注意:本文中使用的jx工具.cloud-envir ...

  6. Kubernetes 实战-Operator Finalizers 实现

    原文链接:https://zdyxry.github.io/2019/09/13/Kubernetes-%E5%AE%9E%E6%88%98-Operator-Finalizers/ Finalize ...

  7. 7.深入k8s:任务调用Job与CronJob及源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 在使用job中,我会结合源码进行一定的讲解,我们也可以从源码中一窥究竟,一些细节k8s是 ...

  8. Kubernetes K8S之资源控制器Job和CronJob详解

    Kubernetes的资源控制器Job和CronJob详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2 ...

  9. k8s cronjob

    k8s cronjob 只存在于v1beta1中 可以周期性 定时执行任务, 事例 [root@master01 ~]# kubectl apply -f mycronjob-busybox.yaml ...

随机推荐

  1. Windows内核-7-IRP和派遣函数

    Windows内核-7-IRP和派遣函数 IRP以及派遣函数是Windows中非常重要的概念.IRP 是I/O Request Pocket的简称,意思是I/O操作的请求包,Windows中所有Use ...

  2. Linux制作Raid

    1.启动服务器 2.在服务器出现提示的时候,根据提示进入Raid管理界面(Ctrl + R),Raid管理界面如下: 3.删除原有的Raid 4.新建Raid 第一步:进入新建Raid的界面 第二步: ...

  3. 代码注释规范之Doxygen

    1.Doxygen简介 Doxygen是一个程序的文档产生工具,可以将程序中的注释转换成说明文档或者说是API参考手册,从而减少程序员整理文档的时间.当然这里程序中的注释需要遵循一定的规则书写,才能让 ...

  4. Jest中Mock网络请求

    Jest中Mock网络请求 最近需要将一个比较老的库修改为TS并进行单元测试,修改为TS还能会一点,单元测试纯粹是现学现卖了,初学Jest框架,觉得在单元测试中比较麻烦的就是测试网络请求,所以记录一下 ...

  5. redis存取数据Hash

    一.概念 二.存取散列Hash值 1. 2.JSON字符串存取,没有更新值的字段资源浪费 使用散列Hash存取,可以单独到一个或多个字段: 3.hsetnx,属性不存在就新增并赋值,属性已存在啥也不干 ...

  6. python库--tensorflow--可视化

    方法 返回值类型 参数 说明 tf.summary .FileWrite()   创建事件文件     logdir 文件保存路径(C盘), 通过tensorboard --logdir=文件路径(l ...

  7. windows环境下永久修改pip镜像源的方法

    在windows环境下修改pip镜像源的方法 (1)在windows文件管理器中,输入 %APPDATA% (2)会定位到一个新的目录下,在该目录下新建pip文件夹,然后到pip文件夹里面去新建个pi ...

  8. PTA 面向对象程序设计 7-1 2017Final 圆周率山

    7-1 2017Final 圆周率山 为了参加学校的社团风采展,怡山小学数学组的同学们决定画一座圆周率山,以宣传圆周率. 已知圆周率为:3. 1415926535 8979323846 2643383 ...

  9. mysql5.7当两个字段名类似,查询时会出错

    excepInfo: select id,describe from iwebshop_student_problem where id=256 order by id desc -- You hav ...

  10. PHP出现iconv(): Detected an illegal character in input string

    PHP传给JS字符串用ecsape转换加到url里,又用PHP接收,再用网上找的unscape函数转换一下,这样得到的字符串是UTF-8的,但我需要的是GB2312,于是用iconv转换 开始是这样用 ...