本次 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 层搞定时任务还是有多好处的
- 如果用 shell 开发那也没有现成的定时框架,总不能 sleep 吧
- 把任务拆小的,并且把一个服务的生命周期从长变短绝对是一键好事,毕竟软件行业有句老话——重启试试

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

被折叠的 条评论
为什么被折叠?



