分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

kubernetes之Cronjob定时任务

发布时间:2023-09-06 01:40责任编辑:熊小新关键词:kubernetes
     Cronjob从名字上可以看到,它就是一个计划任务,与Linux中的crontab无异,其格式基本上都crontab一样,

     其格式如下: 

  Minutes Hours DayofMonth Month DayofWeek Yea

     支持 ", - * / "四个字符,

          *:表示匹配任意值,如果在Minutes 中使用,表示每分钟

          /: 表示起始时间开始触发,然后每隔固定时间触发一次,

           例如在Minutes 设置的是5/20,则表示第一次触发是在第5min时,接下来每20min触发一次,

                                    即,第25min,45min等时刻触发


示例:比如每隔1min执行一次任务:则Cron 表达式如下:

  */1 * * * *


现在编写一个Cronjob资源对象来执行job:    

Cronjob 在Kubernetes1.8版本之前使用的API版本是batch/v2alpha1, 需要在API Server启动时启用此功能:

    --runtime-config=batch/v2alpha1=true

在版本>1.8后,API版本已转为batch/v1beta1,并且默认启用。

apiVersion: batch/v1beta1kind: CronJobmetadata: name: hello #Cronjob的名称spec:  schedule: "*/1 * * * *"   #job执行的周期,cron格式的字符串 jobTemplate:  #job模板   spec:       template:    spec:     containers:     - name: hello-cronjob      image: 10.3.1.15:5000/ubuntu:16.04      command: ["bash","-c","date;echo  Hello from the Kubernetes cluste"] #job具体执行的任务      restartPolicy: OnFailure

创建并查看任务状态:

root@ubuntu15:# kubectl get cronjob NAME      SCHEDULE      SUSPEND   ACTIVE    LAST SCHEDULE   AGEhello     */1 * * * *     False     0         <none>#刚创建还没有活跃的工作,也没有计划任何工作

然后,每隔一分钟执行kubectl get cronjob hello 查看任务状态,发现的确是每分钟调度了一次。

root@ubuntu# kubectl get cronjob hello  NAME        SCHEDULE      SUSPEND   ACTIVE         LAST SCHEDULE   AGEhello     */1 * * * *       False     1         Thu, 01 Feb 2018 06:22:00 +0000root@ubuntu15:/data/yaml# kubectl get cronjob helloNAME      SCHEDULE      SUSPEND   ACTIVE       LAST SCHEDULE   AGEhello     */1 * * * *   False       0         Thu, 01 Feb 2018 06:22:00 +0000#可以看到在指定的时间内已成功执行了一个job,在LAST-SCHEDULE,目前有0个活动作业,意味着作业已完成或失败。


通过在Node查找Cronjob对应的容器,可以看到每隔一分钟产生一个容器,执行完后就会正常退出,而不会再重启容器。

root@ubuntu:/# docker ps -a |grep hello-cronjob94f0e79db981   10.3.1.15:5000/ubuntu  "bash -c 'date;ech..."  11 seconds ago    Exited (0) 11 seconds ago        k8s_hello-cronjob_hello-15174...3d79b4e4a8f0   10.3.1.15:5000/ubuntu  "bash -c 'date;ech..."  About a minute ago Exited (0) About a minute ago      k8s_hello-cronjob_hello-15176...f5d99c855c77   10.3.1.15:5000/ubuntu  "bash -c 'date;ech..."  2 minutes ago     Exited (0) 2 minutes ago         k8s_hello-cronjob_hello-15174...0fd8f23cb624   10.3.1.15:5000/ubuntu  "bash -c 'date;ech..."  3 minutes ago     Exited (0) 3 minutes ago         k8s_hello-cronjob_hello-15174...

查看任意容器的日志:  

root@ubuntu:/# docker logs 96f93b1dbf53Thu Feb  1 06:08:19 UTC 2018Hello from the Kubernetes clusteroot@ubuntu:/# docker logs 2271a37d07b4Thu Feb  1 06:07:19 UTC 2018Hello from the Kubernetes cluste#两个相临的时间的容器刚好是一分钟执行一次命令。


如上每一次执行一次任务就会产生一个容器,且任务执行完成后就会正常退出容器,根据在定义contains

重启策略为 OnFailure所以不会再重启容器,下次执行任务的时间到了就会再启动一个容器来执行,

这样就会不会造成很多Exited的容器,但是Kubernetes

不会让它出现这样的情况的,在CronJob中有个字段来限制历史作业的个数:

.spec.successfulJobsHistoryLimit: #成功完成的作业保存多少个,默认为3.spec.failedJobsHistoryLimit:   #失败的作业保存多少个,默认为1      # 设置为0则不会保存。这两个字段与jobTemplate同级.


使用如下命令可更加直观的实时看到每次Cron Job定期触发任务执行的历史和现状情况:

root@ubuntu:/# kubectl get job --watch   NAME                 DESIRED   SUCCESSFUL   AGEhello-1517466900      1               1            2mhello-1517466960      1               1            1mhello-1517467500      1               1            46s其中,NAME为CronJob的名称,每一次执行任务都会启动一个Pod   SUCCESSFUL 列为1,表示任务执行成功。


 找出由CronJob资源对象创建出来的Pod: 可以通过上面的CronJob

root@ubuntu:/# kubectl get pods --show-all -o wide |grep hello-1517467500hello-1517467500-brhlx        0/1       Completed   0          56s       <none>      10.3.1.16

找到对应的Pod后,查看它的日志:

root@ubuntu:/# kubectl logs hello-1517467980-q9dvkThu Feb  1 06:33:13 UTC 2018Hello from the Kubernetes cluste#正式前面设置的命令输出结果

  

  如果不需要这个CronJob,删除之:

root@ubuntu:/# kubectl delete cronjob hello

   

  Cronjob就是这么简单。



kubernetes之Cronjob定时任务

原文地址:http://blog.51cto.com/newfly/2067907

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved