Kubernetes通过CronJob实现Linux任务的自动化运行
Kubernetes中的CronJob对象是自动化Linux任务的核心工具,其设计灵感来源于Linux系统的crontab,但提供了更强大的集群化管理能力——可在指定时间周期内自动调度并执行容器化任务,支持失败重试、并发控制及日志收集等功能,适用于日志清理、数据备份、定时报表生成等场景。
CronJob通过YAML配置文件定义,关键字段说明如下:
schedule:任务调度的cron表达式(格式与Linux crontab一致,如* * * * *表示每分钟执行一次),是CronJob的核心调度规则。jobTemplate:定义任务的具体执行逻辑,包含容器的镜像、命令、参数及重启策略(如OnFailure表示任务失败时自动重启)。concurrencyPolicy:并发执行策略,支持Allow(允许并发,任务可重叠执行)、Forbid(禁止并发,前一个任务未完成时跳过下一个任务)、Replace(替换并发,取消前一个未完成的任务并启动新任务)。startingDeadlineSeconds:任务启动的截止期限(单位:秒),若任务因故障未在规定时间内启动,则不会执行(用于避免任务长时间延迟)。以“每分钟打印当前时间并输出问候语”为例,配置文件hello-cronjob.yaml内容如下:
apiVersion: batch/v1 # Kubernetes 1.21+推荐使用batch/v1 API
kind: CronJob
metadata:
name: hello-cronjob # CronJob名称(需符合DNS子域名规范)
spec:
schedule: "* * * * *" # 每分钟执行一次
jobTemplate:
spec:
template:
spec:
containers:
- name: hello-container # 容器名称
image: busybox:1.28 # 使用轻量级busybox镜像
command: ["/bin/sh", "-c", "date; echo Hello from Kubernetes automated task"] # 执行的命令
restartPolicy: OnFailure # 任务失败时自动重启
concurrencyPolicy: Forbid # 禁止并发执行(避免任务重叠)
startingDeadlineSeconds: 300 # 任务启动截止期限为5分钟(若5分钟内未启动则放弃)
注:Kubernetes 1.21及以上版本需使用
batch/v1API(旧版本如1.18及以下可使用batch/v1beta1,但已弃用)。
使用kubectl命令将配置文件提交到Kubernetes集群:
kubectl apply -f hello-cronjob.yaml
执行后,系统会返回cronjob.batch/hello-cronjob created,表示CronJob创建成功。
查看CronJob列表及状态:
kubectl get cronjobs
输出示例:
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello-cronjob */1 * * * * False 0 10s 1m
其中,LAST SCHEDULE表示最后一次调度时间,ACTIVE表示当前正在运行的任务数(0表示无任务运行)。
查看任务执行日志:
等待1分钟后,通过以下命令获取CronJob调度的Job名称,并查看其Pod日志:
# 获取最近调度的Job名称
JOB_NAME=$(kubectl get jobs --sort-by=.metadata.creationTimestamp -o jsonpath='{.items[-1].metadata.name}')
# 查看Job对应的Pod日志
kubectl logs $JOB_NAME
输出示例:
Fri Sep 29 10:01:00 UTC 2024
Hello from Kubernetes automated task
表示任务已成功执行。
若不再需要CronJob,可使用以下命令删除(删除后,CronJob创建的所有Job及Pod也会被清除):
kubectl delete cronjob hello-cronjob
schedule字段,如0 2 * * *表示每天凌晨2点执行,*/5 * * * *表示每5分钟执行一次。container字段中添加resources配置,限制CPU、内存使用(避免任务占用过多集群资源):containers:
- name: hello-container
image: busybox:1.28
command: ["/bin/sh", "-c", "date; echo Hello"]
resources:
limits:
cpu: "100m" # CPU限制为0.1核
memory: "64Mi" # 内存限制为64MB
restartPolicy: OnFailure
successfulJobsHistoryLimit(成功任务保留数量)和failedJobsHistoryLimit(失败任务保留数量)字段,保留任务历史以便排查问题(默认保留1个成功任务和3个失败任务):spec:
successfulJobsHistoryLimit: 3 # 保留最近3个成功任务
failedJobsHistoryLimit: 5 # 保留最近5个失败任务
jobTemplate:
# ...其他配置
ntp或chrony服务同步)。RBAC权限。