CronJob控制器
CronJob 控制器用于管理 Job 控制器资源的运行时间。Job 控制器定义的作业任务在其控制器资源创建之后立即执行,但 CronJob 可以以类似于 Linux 操作系统的周期性任务作业计划(contab)的方式控制其运行的时间点及重复运行的方式,具体如下:
- 在未来某时间点运行作业一次。
- 在指定的时间点重复运行作业。
CronJob 对象支持使用的时间格式类似于 Crontab,略有不同的是,CronJob 控制器在指定的时间点时,"?" 和 "*" 的意义相同,都表示任何可用的有效值。
一、创建 CronJob 对象
CronJob 控制器的相关配置如下:
[root@mh-k8s-master-prd-243-24 ~]# kubectl explain cronjob
KIND: CronJob
VERSION: batch/v1beta1
DESCRIPTION:
CronJob represents the configuration of a single cron job.
FIELDS:
apiVersion <string>
APIVersion defines the versioned schema of this representation of an
object. Servers should convert recognized schemas to the latest internal
value, and may reject unrecognized values. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
kind <string>
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits
requests to. Cannot be updated. In CamelCase. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
metadata <Object>
Standard object's metadata. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
spec <Object>
Specification of the desired behavior of a cron job, including the
schedule. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
status <Object>
Current status of a cron job. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
[root@mh-k8s-master-prd-243-24 ~]#
spec 字段常用嵌套如下:
[root@mh-k8s-master-prd-243-24 ~]# kubectl explain cronjob.spec
KIND: CronJob
VERSION: batch/v1beta1
RESOURCE: spec <Object>
DESCRIPTION:
Specification of the desired behavior of a cron job, including the
schedule. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
CronJobSpec describes how the job execution will look like and when it will
actually run.
FIELDS:
concurrencyPolicy <string>
Specifies how to treat concurrent executions of a Job. Valid values are: -
"Allow" (default): allows CronJobs to run concurrently; - "Forbid": forbids
concurrent runs, skipping next run if previous run hasn't finished yet; -
"Replace": cancels currently running job and replaces it with a new one
并发执行策略,可用值有 "Allow"(允许)、"Forbid"(禁止)和 "Replace"(替换),
用于定义前一次作业运行尚未完成时是否以及如何运行后一次作业。
failedJobsHistoryLimit <integer>
The number of failed finished jobs to retain. This is a pointer to
distinguish between explicit zero and not specified. Defaults to 1.
为失败的任务执行保留的历史记录数,默认为 1.
jobTemplate <Object> -required-
Specifies the job that will be created when executing a CronJob.
Job 控制器模版,用于为 CronJob 控制器生成 Job 对象;必选字段。
schedule <string> -required-
The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron.
Cron 格式的作业调度运行时间点;必选字段。
startingDeadlineSeconds <integer>
Optional deadline in seconds for starting the job if it misses scheduled
time for any reason. Missed jobs executions will be counted as failed ones.
因各种原因缺乏执行作业的时间点所导致的启动作业错误的超时时长,会被记入错误记录。
successfulJobsHistoryLimit <integer>
The number of successful finished jobs to retain. This is a pointer to
distinguish between explicit zero and not specified. Defaults to 3.
为成功的任务执行保留的历史记录数,默认为 3.
suspend <boolean>
This flag tells the controller to suspend subsequent executions, it does
not apply to already started executions. Defaults to false.
是否挂起后续的任务执行,默认为 false,对运行中的作业不会产生影响。
[root@mh-k8s-master-prd-243-24 ~]#
下面是一个定义在资源清单文件(jaeger-es-index-cleaner.yaml)中的 CronJob 资源对象示例:
kind: CronJob
apiVersion: batch/v1beta1
metadata:
name: jaeger-es-index-cleaner
namespace: istio-system
labels:
app: jaeger
app.kubernetes.io/component: cronjob-es-index-cleaner
app.kubernetes.io/instance: jaeger
app.kubernetes.io/managed-by: jaeger-operator
app.kubernetes.io/name: jaeger-es-index-cleaner
app.kubernetes.io/part-of: jaeger
annotations:
linkerd.io/inject: disabled
prometheus.io/scrape: 'false'
sidecar.istio.io/inject: 'false'
spec:
schedule: 55 23 * * *
concurrencyPolicy: Allow
suspend: false
jobTemplate:
metadata:
creationTimestamp: null
spec:
parallelism: 1
template:
metadata:
creationTimestamp: null
labels:
app: jaeger
app.kubernetes.io/component: cronjob-es-index-cleaner
app.kubernetes.io/instance: jaeger
app.kubernetes.io/managed-by: jaeger-operator
app.kubernetes.io/name: jaeger-es-index-cleaner
app.kubernetes.io/part-of: jaeger
annotations:
linkerd.io/inject: disabled
prometheus.io/scrape: 'false'
sidecar.istio.io/inject: 'false'
spec:
containers:
- name: jaeger-es-index-cleaner
image: >-
registry.cn-beijing.aliyuncs.com/kubesphereio/jaeger-es-index-cleaner:1.17
args:
- '7'
- >-
http://elasticsearch-logging-data.kubesphere-logging-system.svc:9200
envFrom:
- secretRef:
name: jaeger-secret
env:
- name: INDEX_PREFIX
value: logstash
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
restartPolicy: Never
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
serviceAccountName: jaeger
serviceAccount: jaeger
securityContext: {}
schedulerName: default-scheduler
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
二、CronJob 的控制机制
CronJob 控制器是一个更高级别的资源,它以 Job 控制器资源为其管控对象,并借助它管理 Pod 资源的对象。
如果作业重复执行时指定的时间点较近,而作业执行时长跨过了其两次执行的时间长度,则会出现两个 Job 对象同时存在的情形。
有些 Job 对象可能会存在无法或不能同时运行情形,这个时候就要通过 cronjob.spec.concruuencyPolicy 属性控制作业并存的机制,其默认值为
"Allow",即允许前后 Job,甚至属于同一个 CronJob 的更多 Job 同时运行。其他两个可用值中,
"Forbid" 用于禁止前后两个 Job 同时运行,如果前一个尚未结束,后一个则不予启动(跳过)。
"Replcae" 用于让后一个 Job 取代前一个,即终止前一个并启动后一个。