k8s 与 cronjob

本次 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. 把任务拆小的,并且把一个服务的生命周期从长变短绝对是一键好事,毕竟软件行业有句老话——重启试试

k8s 与 cronjob_第1张图片

你可能感兴趣的:(k8s 与 cronjob)