第五章 Kubernetes Pod控制器-Cronjob

一、CronJob特性

CronJob是基于时间的Job控制器,简单理解就是CronJob控制器会依赖Job控制器,基于Job控制器之上增加了时间方面的约束。所以CronJob是周期性的执行Job控制器,Job控制器跑Pod的方式来完成周期性任务的。

CronJob有些特性如下:

以上特性,对其中某些做些说明:

1、spec.schedule:这个跟linux里面的corntab类似,采用 \* \* \* \* \* job命令 方式。5个*分别代表了分时日月周。

2、spce.concurrencyPolicy:并发策略。并发策略需要根据你实际业务情况进行设定。其中:

  • Allow(默认):允许并发允许Job,比如当你的任务在周期时刻被调度的时候,上一次跑的任务都还没有结束,那么Allow就是允许本次被调度运行,与前一次的任务可以并行的。
  • Forbid:禁止并发运行。如果前一次调度的任务还没有完成,本次调度的任务就会跳过,不会执行本次调度任务。
  • Replace:在本次调度时刻,如果上次调度的任务还在运行中,那么就会取消正在运行的Job,用一个新的Job来替换。

3、spec.suspend:挂起。将后续所有任务都挂起,对已经开始执行的Job不起作用。比如临时业务情况有变化,比如周期性备份数据库任务需要暂停,这时候可以设置suspend为ture。

4、spec.successfulJobsHistoryLimit和spec.failedJobsHistoryLimit:成功的job和失败的job的历史记录限制条数。假如我们有一个是每分钟要执行的任务,那么一个月一年下来,我们创建的Job控制器的记录都会保留在etcd中,记录太多了,没必要记录这么多,因为对于我们使用者来说关注的是当前最新几个pod的情况是否正常,所以系统默认分别设置了'3'和'1'。

二、CronJob实操

1、创建CronJob控制器

vim 12.cronjob.yaml

复制代码
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob-demo
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      completions: 3
      template:
        spec:
          containers:
          - name: cronjob-demo-container
            image: nginx:v1
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

root@k8s-master01 5# kubectl apply -f 12.cronjob.yaml

cronjob.batch/cronjob-demo created

root@k8s-master01 5# kubectl get cronjob

NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE

cronjob-demo */1 * * * * False 0 <none> 24s

  • SCHEDULE:调度周期。这里是1分钟调度一次。
  • SUSPEND:是否为挂起
  • ACTIVE:激活数量
  • LAST SCHEDULE:最后一次调度距离现在的时长
  • AGE:Cronjob资源对象创建的时长

注意:cronjob资源对象创建之后,第一次调度运行任务,并不会是严格在1分钟后执行,可能是1分钟前也可能是1分钟后,这个时间不定。如果你对于这个第一次调度的时间有一个很明确的要求,那么就需要在pod内部进行判断,在cronjob这个级别是做不到这个控制的。

2、查看Job/Pod资源对象情况

root@k8s-master01 5# kubectl get job

NAME COMPLETIONS DURATION AGE

cronjob-demo-28971561 3/3 10s 2m50s

cronjob-demo-28971562 3/3 9s 110s

cronjob-demo-28971563 3/3 9s 50s

验证结果:发现已经有3个Job创建并已经完成了。根据上章节Job控制器讲的,每个Job控制器中,COMPLETIONS是3/3,说明我们要求3个pod成功完成,目前已经有3个pod完成了。

root@k8s-master01 5# kubectl get pod

NAME READY STATUS RESTARTS AGE

cronjob-demo-28971561-26l5q 0/1 Completed 0 2m14s

cronjob-demo-28971561-965tb 0/1 Completed 0 2m11s

cronjob-demo-28971561-ppspp 0/1 Completed 0 2m7s

cronjob-demo-28971562-2km7d 0/1 Completed 0 74s

cronjob-demo-28971562-kwzm4 0/1 Completed 0 68s

cronjob-demo-28971562-pvk8w 0/1 Completed 0 71s

cronjob-demo-28971563-h4zvb 0/1 Completed 0 8s

cronjob-demo-28971563-jqkxg 0/1 Completed 0 14s

cronjob-demo-28971563-xdxtk 0/1 Completed 0 11s

验证结果:通过pod可以看到,每个Job下产生了3个pod,比如cronjob-demo-28971561这个job产生了cronjob-demo-28971561-26l5q、cronjob-demo-28971561-965tb、cronjob-demo-28971561-ppspp三个pod,并且STATUS都是Completed,表示成功执行完成。

相关推荐
螺蛳粉 螺蛳粉20 小时前
第 02 篇:镜像分层与 containerd 2.x 实战:SystemdCgroup 与 pause 镜像配置踩坑(底座认知 02)
docker·云原生·容器·kubernetes·etcd·containerd·kube-apiserver
小白的码BUG之路1 天前
K8s -- 搭建过程中经常遇到的问题
云原生·容器·kubernetes
螺蛳粉 螺蛳粉1 天前
第 03 篇:为什么 K8s 的最小调度单元是 Pod 而不是容器:pause 容器与边车模式(底座认知 03)
docker·云原生·容器·kubernetes·etcd·运维排障·kube-apiserver
艾伦_耶格宇1 天前
【kubernetes - 1.28版本】-9 K8S-dashbord可视化界面
云原生·容器·kubernetes
无人生还别怕2 天前
如何搭建k8s服务(containerd部署)
linux·云原生·容器·kubernetes·openanolisos
fb_123452 天前
从探针到权限:一篇吃透 Kubernetes 健康检查、RBAC 认证授权与 Dashboard 可视化管理
云原生·容器·kubernetes
mengge.cloud2 天前
10-28-Kubernetes健康检查认证授权与Dashboard
云原生·容器·kubernetes
SatanII2 天前
Kubernetes 认证与授权详解:守护集群API访问安全
安全·贪心算法·kubernetes
闲云野鹤在人间2 天前
头秃修炼手册:StorageClass+StatefulSet+ETCD 全套渡劫笔记
linux·数据库·笔记·云原生·kubernetes·etcd
艾伦_耶格宇2 天前
【kubernetes - 1.28版本】-7 K8S命令
云原生·容器·kubernetes