【kubernetes系列】Kubernetes之job和cronjob控制器

这篇具有很好参考价值的文章主要介绍了【kubernetes系列】Kubernetes之job和cronjob控制器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本章节将分享kubernetes中的job控制器和cronjob控制器,这是用于另外两种场景的pod控制器。

一、job控制器

对于Deployment、ReplicaSet、ReplicationController等类型的控制器而言,它希望pod保持预期数目、持久运行下去,除非用户明确删除,否则这些对象一直存在,它们针对的是耐久性任务,如web服务等。对于非耐久性任务,比如压缩文件,任务完成后,pod需要结束运行,不需要pod继续保持在系统中,这个时候就要用到Job。因此说Job是对Deployment、ReplicaSet等持久性控制器的补充。目前在实际工作中,这两种类型的控制器使用不多。

Job与其它控制器的细微差别:
Job定义方法与RC(RS)控制器类似,有细微差别,如下:
Job中的restartPolicy仅支持Never或OnFailure,这个很好理解,因为pod要运行到结束,而不是反复重新启动。
Job不需要选择器,其中的pod也不需要标签,系统在创建Job时会自动添加相关内容。当然用户也可以出于资源组织的目的添加标签,但这个与Job本身的实现没有关系。
Job新增加两个字段:.spec.completions、.spec.parallelism。
Job的重要参数:

  • spec.backoffLimit指定在此Job在标记为失败之前重试的次数,默认为6次
  • spec.completions标志Job结束需要成功运行的Pod个数,默认为1
  • spec.parallelism标志并行运行的Pod的个数,默认为1
    具体语法格式可以通过kubectl explain job.spec 查看

根据.spec.completions和.spec.Parallelism的设置,可以将Job划分为以下几种pattern:

Job类型 使用示例 行为 completions Parallelism
一次性Job 数据库迁移 创建一个Pod直至其成功运行结束 1 1
固定结束次数的Job 处理工作队列的Pod 依次创建一个Pod运行直至有competition个后成功结束 2+ 1
固定结束次数的并行Job 多个Pod同时处理工作队列 依次创建一个Pod运行直至有competition个后成功结束 2+ 2+
并行Job 多个Pod同时处理工作队列 创建一个或多个Pod直至有一个成功结束 1 2+

Job Controller:
Job Controller负责根据Job Spec创建Pod,并持续监控Pod的状态,直至其成功结束。如果失败,则根据restartPolicy(只支持OnFailure和Never,不支持Always)决定是否创建新的Pod再次重试任务。

示例:

1、1个completions+1个Parallelism

[root@k8s-m1 k8s-volumes]# cat job.yml 
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    metadata:
      name: pi
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(10)"]
      restartPolicy: Never
##作用就是打印π的前10位

[root@k8s-m1 k8s-volumes]# kubectl apply -f job.yml 
job.batch/pi created

[root@k8s-m1 k8s-volumes]# kubectl get pod -w
NAME               READY   STATUS              RESTARTS   AGE
annotations-test   1/1     Running             0          42h
pi-wdgql           0/1     ContainerCreating   0          9s
pi-wdgql           0/1     Completed           0          94s

[root@k8s-m1 k8s-volumes]# kubectl logs  pi-wdgql 
3.141592654

.2、多个completions+1个Parallelism

[root@k8s-m1 k8s-volumes]# cat job.yml 
apiVersion: batch/v1
kind: Job
metadata:
  name: busybox
spec:
  completions: 3
  template:
    metadata:
      name: busybox
    spec:
      containers:
      - name: busybox
        image: busybox
        command: ["echo", "hello world"]
      restartPolicy: Never

[root@k8s-m1 k8s-volumes]# kubectl apply -f job.yml 
job.batch/busybox created

[root@k8s-m1 k8s-volumes]# kubectl get pod 
NAME               READY   STATUS      RESTARTS   AGE
annotations-test   1/1     Running     0          42h
busybox-5ffpp      0/1     Completed   0          42s
busybox-65hl6      0/1     Completed   0          48s
busybox-cpd8m      0/1     Completed   0          24s
pi-wdgql           0/1     Completed   0          8m45s

其他两种模式请自行测试使用。

裸Pods:
所谓裸Pods是指直接用PodSpec来创建的Pod,即没有使用RC(RS)或者Deployment控制器管理的Pods。这些Pod在Node重启后不会自动重启,但Job则会创建新的Pod继续任务。所以,推荐使用Job来替代裸Pods,即便是应用只需要一个Pod。

二、cronjob控制器

类似于Linux的Crond服务的功能,CronJob用来执行定时性任务,或者周期性、重复性任务。注意CronJob启动的是kubernetes中的Job,不是ReplicaSet、DaemonSet等其它控制器类型。用途:

  • 在给定时间点只运行一次
  • 在给定时间点周期性地运行,如:数据库备份、发送邮件。

格式参数:
具体语法格式可以通过kubectl explain cronjob.spec查看
下面解释CronJob中的重要字段。

  • schedule 指定什么时候运行 Job,其格式与 Linux cron 一致。这里 */1 * * * * 的含义是每一分钟运行一次。
  • jobTemplate 定义 Job 的模板,格式与Job控制器的模板一致。
  • spec.startingDeadlineSeconds:单位是秒,表示如果Job因为某种原因无法按调度准时启动,在spec.startingDeadlineSeconds时间段之内,CronJob仍然试图重新启动Job,如果在.spec.startingDeadlineSeconds时间之内没有启动成功,则不再试图重新启动。如果spec.startingDeadlineSeconds的值没有设置,则没有按时启动的任务不会被尝试重新启动。spec.startingDeadlineSeconds同时也影响到CronJob计算任务损失率。如果指定,那么CronJob计算有多少Job没有按时启动时是从当前时间向后推spec.startingDeadlineSeconds秒数,如果没有指定,那么是从当前时间向后推到最后一次成功调度的时间。无论那种算法,如果损失的按时任务超过一定个数,那么CronJob会报错并停止运行。
  • spec.concurrencyPolicy:并发策略,字段可选,有三个可选项。
    Allow:上一次Job没有完成,本次Job可以启动。
    Forbid:上一次Job没有完成,本次Job不可以启动。
    Replace:上一次Job没有完成,本次Job取而代之,用一个新的来替换。
  • spec.suspend:true或者false,表示是否临时阻塞CronJob,它对已经开始执行的 Job 不起作用。默认值为 false。
  • spec.successfulJobsHistoryLimit:保存成功历史Job的数量,默认3,如果为0则CronJob在Job成功后立即删除。
    .spec.failedJobsHistoryLimit:保存失败历史Job的数量,默认1,如果为0则CronJob在Job失败后立即删除。

示例:

以下CronJob每分钟运行一次,打印出当前时间与hello消息。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello World
          restartPolicy: OnFailure

#以上内容,schedule: "*/1 * * * *"与Linux Crond中定义相同,表示每分钟启动一次。

#运行CronJob
[root@k8s-m1 k8s-volumes]# kubectl create -f  cronjob.yml 
cronjob.batch/hello created
#或者通过命令行方式:

[root@k8s-m1 k8s-volumes]# kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello World"
cronjob "hello" created
#查看CronJob状态:
[root@k8s-m1 k8s-volumes]# kubectl get cronjobs.batch 
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        <none>          31s

  • NAME:CronJob名称。
  • SCHEDULE:基于时间的调度规则。
  • SUSPEND:如果其值为True表示此CronJob暂时失效,不变成False之前不再创建新任务。对于已经创建的任务没有影响。
  • ACTIVE:表示当前活动的任务数,0表示当前没有活动任务。1表示有一个活动任务。此值可能大于1,原因如下:
    任务允许重复启动,如前一次启动后还没有退出,下一次已经启动。
    允许延后启动,当CronJob Controller发现因为某种原因错误启动,并且任务允许延后启动,则会启动任务。
  • LAST-SCHEDULE:表示最后一次调度时间是多久之前
    从CronJob状态可以看出,其输出中并没有相关字段指示其所创建的JOB是否运行成功,运行如上命令查看JOB的详细信息:
  • AGE:该cronjob存在的时间

查看CronJob创建的Job:

[root@k8s-m1 k8s-volumes]# kubectl get jobs --watch 
NAME               COMPLETIONS   DURATION   AGE
hello-1687845000   1/1           20s        2m38s
hello-1687845060   1/1           19s        97s
hello-1687845120   1/1           5s         37s
  • NAME:表示CronJob创建的Job名称,后边的数字由系统自动生成,保证不重复。
  • COMPLETIONS :表示历史执行的job数量和成功数量。
  • DURATION :表示pod的持续时间。
  • AGE:表示该Job是多长时间之前执行的。

CronJob 中保存的任务其实是有上限的,spec.successfulJobsHistoryLimit 和 spec.failedJobsHistoryLimit 分别记录了能够保存的成功或者失败的任务上限,超过这个上限的任务都会被删除,默认情况下这两个属性分别为 spec.successfulJobsHistoryLimit=3 和 spec.failedJobsHistoryLimit=1。

CronJob创建Job,Job创建pod,通过下面的方法可以查看job对应的pod(名字的前面两节一样):

[root@k8s-m1 k8s-volumes]# kubectl get jobs.batch 
NAME               COMPLETIONS   DURATION   AGE
hello-1687846440   1/1           19s        2m57s
hello-1687846500   1/1           5s         116s
hello-1687846560   1/1           20s        56s

[root@k8s-m1 k8s-volumes]# kubectl get pods  
NAME                     READY   STATUS      RESTARTS   AGE
hello-1687846440-9v5kq   0/1     Completed   0          2m58s
hello-1687846500-h77rc   0/1     Completed   0          118s
hello-1687846560-w72jf   0/1     Completed   0          58s
[root@k8s-m1 k8s-volumes]# kubectl logs  hello-1687846560-w72jf
Tue Jun 27 06:12:08 UTC 2023
Hello World

删除CronJob:

[root@k8s-m1 k8s-volumes]#  kubectl delete cronjob hello
cronjob "hello" deleted

删除CronJob会使通过其创建的Job、pod一起被删除。

更多关于kubernetes的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出文章来源地址https://www.toymoban.com/news/detail-503863.html

到了这里,关于【kubernetes系列】Kubernetes之job和cronjob控制器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【探索 Kubernetes|作业管理篇 系列 16】离线业务 Job、CronJob

    大家好,我是秋意零。 在上一篇中,我们讲解了 DaemonSet 控制器,相信你以及理解了其的工作过程,分为三部。一是,获取所有 Node 节点中的 Pod;二是,判断是否有符合 DaemonSet 管理的 Pod;三是,通过“亲和性”和“容忍”来精确控制并保证 Pod 在目标节点运行。 今天的内容

    2024年02月12日
    浏览(29)
  • Kubernetes 准入控制器

    Kubernetes 极大地提高了当今生产中后端集群的速度和可管理性。由于灵活、可扩展、易用,Kubernetes 已成为容器编排的事实标准。Kubernetes 还提供了一系列保护功能。而 Admission Controllers(准入控制器) 是一组安全相关的插件,启用后能进一步使用 Kubernetes 更高级的安全功能。

    2024年02月06日
    浏览(33)
  • kubernetes-控制器

    目录 一、replicaset 二、deployment 1、版本迭代 2、回滚 3、滚动更新策略 4、暂停与恢复 三、daemonset 四、statefulset 五、job 六、cronjob ReplicaSet用于保证指定数量的 Pod 副本一直运行 replicaset是通过标签匹配pod replicaset自动控制副本数量,pod可以自愈 回收资源 Deployment 的主要作用是实

    2024年02月06日
    浏览(35)
  • Kubernetes Pod控制器

    Pod控制器及其功用 Pod控制器,又称之为工作负载(workload),是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效,则会重新新建pod的资源 Deployment 部署无状态应用 负责创建和管理 ReplicaSet , 维护 Pod 副本数

    2024年02月12日
    浏览(27)
  • 【云原生 | 从零开始学Kubernetes】二十三、Kubernetes控制器Statefulset

    该篇文章已经被专栏《从零开始学k8s》收录 上一篇文章:kubernetes持久化存储下 点击跳转 StatefulSet 是为了管理有状态服务的问题而设计的 对于StatefulSet中的Pod,每个Pod挂载自己独立的存储,如果一个Pod出现故障,从其他节点启动一个同样名字的Pod,要挂载上原来Pod的存储继续

    2024年02月03日
    浏览(25)
  • 【云原生】kubernetes控制器deployment的使用

        目录 ​编辑 1 Controller 控制器 1.1 什么是 Controller 1.2 常见的 Controller 控制器 1.3 Controller 如何管理 Pod 2 Deployment 2.1 创建 deployment 2.2 查看 deployment 2.3 扩缩 deployment 2.4 回滚 deployment 2.5 删除 deployment 1 Controller 控制器 官网: 控制器 | Kubernetes 1.1 什么是 Controller Kubernetes 通常不会

    2024年02月13日
    浏览(25)
  • 5、Kubernetes核心技术 - Controller控制器工作负载

    目录 一、Deployments - 控制器应用 二、Deployment升级回滚和弹性收缩 2.1、创建一个 1.14 版本的 pod 2.2、应用升级 2.3、查看升级状态 2.4、查看历史版本 2.5、应用回滚 2.6、弹性伸缩  三、StatefulSet - 有状态应用 四、DaemonSet - 守护进程 五、Job - 单次任务 六、Cronjob - 定时任务 Deplo

    2024年02月15日
    浏览(28)
  • 【云原生|Kubernetes】14-DaemonSet资源控制器详解

    ​ 在 Kubernetes 中,DaemonSet 是一种用于在节点上运行指定的 Pod 的控制器(Controller)。与 ReplicaSet 或 Deployment 不同,DaemonSet 不是为了扩展 Pod 数量而创建的,而是为了在每个节点上运行一个实例或多个实例的 Pod。 ​ DaemonSet 通常用于在 Kubernetes 集群中运行一些系统级别的服务

    2024年02月13日
    浏览(27)
  • 【Kubernetes资源篇】DaemonSet控制器入门实战详解

    中文官方文档参考: 1、DaemonSet控制器是什么? Kubernetes中的DaemonSet(简写ds)控制器是一种 用来运行守护进程应用程序的控制器,它确保每个Node节点都运行具有指定配置的 Pod副本,当Node节点的加入或删除DaemonSet控制器会自动创建或删除相应的 Pod副本。 特点: 每个节点只运行

    2024年02月10日
    浏览(60)
  • 【Kubernetes资源篇】Replicaset控制器入门实战详解

    官方中文参考文档: ReplicaSet是k8s中一种资源对象,简写 rs , 用于管理Pod副本数量和健康状态,在 spec.replicas 字段中可以定义Pod副本数量,ReplicaSet会始终保持Pod在指定数量 ,当发现Pod数量大于副本数量时,会移除多出的Pod,当发现Pod小于副本数量会自动创建Pod,使其始终维

    2024年02月09日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包