k8s 与 cronjob

本文介绍了如何在无法使用Linux cronjob的情况下,利用k8s的CronJob功能来实现定时任务。通过创建带有mysql client的Docker镜像,结合k8s CronJob的YAML配置文件,实现每分钟向MySQL数据库写入一条数据。同时,讨论了k8s CronJob的语法和监控方案,强调了k8s层处理定时任务的优势。

本次 More Time 介绍 k8s 与 cronjob。
有的时候有各种各样的限制不能执行 Linux 的 cronjob
但是可以用 k8s(这个k8s上的有点牵强)。本文介绍一个用 k8s 的定时功能。如果能从 OS 层面解构定时任务,就会节约很多时间。没错,肯定要绕道本公众号的宗旨——节约开发时间上。
那么来个场景,就往 mysql 里写数据吧,1分钟写1条。

mysql client docker image

第一步,我们先搞一个带 mysql client 的 docker 镜像
docker 官方 apline demo 就给了个
Dockerfile

FROM alpine:3.7
RUN apk add --no-cache mysql-client

关于 alpine 的 apk 是什么意思,可以看 Apline Linux packages)
之后

docker build . -t mysql-client:1.0.0 
docker run -it mysql-clinet:1.0.0
mysql -uroot -p -h${host} -P${port}

就可以连同一个网段下的数据库了
之后镜像 push 到远端

docker save mysql-client:1.0.0  > mysql-client.1.0.0.tar
scp mysql-client.1.0.0.tar ...
docker load < mysql-client.1.0.0.tar
docker tag mysql-client:1.0.0 ${ip}:${port}/mysql-client:1.0.0
docker push ${ip}:${port}/mysql-client:1.0.0

k8s cronjob

接下来研究一下 k8s Cron Job 。这个只支持 k8s 1.5+。
先直接上 YAML 文件
cron.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: ${ip}:${port}/mysql-client:1.0.0
            args:
            - /bin/sh
            - -c
            - mysql -uroot -p -h${ip} -P${port} --p${password} -e "-e "insert into ${db}.${table} values(${values})""
          restartPolicy: OnFailure
  • kind: CronJob 表明了这个配置文件的类型是 cronjob
  • schedule: 这个就是定时任务的表达式
  • image: 表明了用上述镜像

schedule 的语法可以参考 Cron 。简单的说就是
分 时 日 月 星期
填数字就是那个数字的时间,填 * 就匹配,填 /a/b a 单位开始,然后每 b 单位开始
出于简单,下文的 k == kubectl
之后
k create -f cron.yaml
就好了。
去 MySQL 看,会发现确实1分钟加了一条
要删除可以用
k delete -f cron.yaml

监控

k get cronjob # 看 cronjob 的列表
k get jobs # 看历史任务
k get pods --show-all | grep ${job-name} # 看 job 对应的 pod
k logs ${pod-name} # 看 pod log

总结

k8s 层搞定时任务还是有多好处的

  1. 如果用 shell 开发那也没有现成的定时框架,总不能 sleep 吧
  2. 把任务拆小的,并且把一个服务的生命周期从长变短绝对是一键好事,毕竟软件行业有句老话——重启试试

在这里插入图片描述

<think>嗯,我现在需要解释一下Kubernetes中的CronJob。首先,我应该回忆一下Kubernetes的基本概念,以及Job和CronJob的关系。 用户可能已经知道Job是用来执行一次性任务的,比如批处理作业。而CronJob应该是基于时间调度的,类似Linux的crontab。我需要确认这一点是否正确。 接下来,CronJob的主要特点是什么?它允许用户按照预定的时间表来运行任务。比如说,每天凌晨执行一次备份,或者每小时清理一次日志。这样的例子能帮助用户理解应用场景。 需要提到CronJob的调度语法,使用的是类似cron的时间格式,分五个字段:分钟、小时、日、月、星期。比如"0 * * * *"表示每小时的第0分钟执行。这里要注意时区的问题,默认情况下可能使用kube-controller-manager的时区,但用户可能需要显式设置。 然后要说明CronJob会创建Job对象来执行任务,每个Job会启动Pod运行容器中的命令。用户可能需要配置并发策略,比如是否允许同时运行多个Job实例,或者如果旧的任务还在运行,新的任务是否被跳过。 还要注意一些注意事项,比如如果调度的时间段内集群不可用,CronJob可能会错过执行,需要根据需求配置是否补执行。另外,资源限制和权限设置也是需要考虑的,避免任务占用过多资源或者权限过高。 最后,举一个简单的例子,比如定义一个每天执行一次的CronJob,用来清理临时文件。通过YAML示例展示apiVersion、schedule、jobTemplate等关键字段。这样用户能更直观地理解如何配置。 可能需要检查是否有遗漏的重要点,比如CronJob的版本兼容性,不同Kubernetes版本中的差异。例如,旧版本可能使用batch/v1beta1,而新版本使用batch/v1。需要提醒用户注意使用的API版本是否正确。 总结的话,CronJob在自动化周期性任务中非常有用,帮助用户管理定时任务,提高运维效率。确保解释清晰,结构合理,方便用户理解。</think>Kubernetes 中的 **CronJob** 是一个用于管理周期性任务(定时任务)的资源对象,类似于 Linux 系统的 `crontab`。它的核心功能是按照预定义的时间表(Schedule)自动创建一次性任务(Job),完成诸如备份、清理、批量处理等重复性操作。 --- ### 核心特点 1. **时间调度** 使用 `cron` 格式定义任务执行时间,例如: - `0 * * * *` → 每小时整点执行 - `*/5 * * * *` → 每 5 分钟执行 - `0 3 * * SAT` → 每周六凌晨 3 点执行 2. **任务模板** 每个 CronJob 需要定义一个 `Job 模板`(`jobTemplate`),用于描述实际执行的任务内容(如容器镜像、命令等)。 3. **自动创建 Job** 到达预定时间后,CronJob 控制器会自动创建一个 Job,由 Job 进一步创建 Pod 运行具体任务。 4. **容错重试** 若任务执行失败(Pod 异常退出),Job 会根据配置自动重试,确保任务最终完成。 --- ### 典型应用场景 - **数据备份**:每天凌晨备份数据库。 - **日志清理**:每小时清理一次过期日志。 - **定时报告生成**:每周一生成周报。 - **资源回收**:定期清理临时文件或无效资源。 --- ### 示例 YAML 配置 ```yaml apiVersion: batch/v1 kind: CronJob metadata: name: daily-cleanup spec: schedule: "0 3 * * *" # 每天凌晨3点执行 jobTemplate: spec: template: spec: containers: - name: cleanup image: busybox:latest command: ["/bin/sh", "-c", "echo '清理临时文件...' && rm -rf /tmp/*"] restartPolicy: OnFailure ``` --- ### 关键配置参数 - **`schedule`**:必填,cron 表达式定义执行时间。 - **`concurrencyPolicy`**(可选):控制任务并发策略: - `Allow`(默认):允许多个 Job 同时运行。 - `Forbid`:禁止并发,前一个 Job 完成后再执行下一个。 - `Replace`:新 Job 替换未完成的旧 Job。 - **`startingDeadlineSeconds`**(可选):任务启动的最长等待时间(超时后标记为失败)。 - **`successfulJobsHistoryLimit`**:保留成功 Job 的历史记录数量(默认 3)。 - **`failedJobsHistoryLimit`**:保留失败 Job 的历史记录数量(默认 1)。 --- ### 注意事项 1. **时区问题** CronJob 默认使用 kube-controller-manager 所在节点的时区。若需指定时区,可在 Kubernetes 1.27+ 中通过 `timeZone` 字段设置(例如 `timeZone: "Asia/Shanghai"`)。 2. **资源限制** 在 `jobTemplate` 中需合理配置 CPU/内存资源限制,避免任务占用过多集群资源。 3. **任务幂等性** 确保任务可重复执行(如清理操作避免误删未过期数据)。 --- ### 操作命令 - 查看 CronJob 状态: ```bash kubectl get cronjobs ``` - 手动触发一次任务: ```bash kubectl create job --from=cronjob/daily-cleanup manual-cleanup-001 ``` - 查看关联的 Job: ```bash kubectl get jobs ``` 通过 CronJob,你可以轻松实现 Kubernetes 集群内的自动化运维任务,减少手动操作成本。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值