设为首页 收藏本站
查看: 1407|回复: 0

[经验分享] kubernetes之Cronjob定时任务

[复制链接]

尚未签到

发表于 2018-9-15 13:44:24 | 显示全部楼层 |阅读模式
  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/v1beta1  
kind: CronJob
  
metadata:
  
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   AGE
  
hello     */1 * * * *     False     0         
  

  
#刚创建还没有活跃的工作,也没有计划任何工作
  然后,每隔一分钟执行kubectl get cronjob hello 查看任务状态,发现的确是每分钟调度了一次。
root@ubuntu# kubectl get cronjob hello  
NAME        SCHEDULE      SUSPEND   ACTIVE         LAST SCHEDULE   AGE
  
hello     */1 * * * *       False     1         Thu, 01 Feb 2018 06:22:00 +0000
  

  
root@ubuntu15:/data/yaml# kubectl get cronjob hello
  
NAME      SCHEDULE      SUSPEND   ACTIVE       LAST SCHEDULE   AGE
  
hello     */1 * * * *   False       0         Thu, 01 Feb 2018 06:22:00 +0000
  

  
#可以看到在指定的时间内已成功执行了一个job,在LAST-SCHEDULE,目前有0个活动作业,意味着作业已完成或失败。
  通过在Node查找Cronjob对应的容器,可以看到每隔一分钟产生一个容器,执行完后就会正常退出,而不会再重启容器。
root@ubuntu:/# docker ps -a |grep hello-cronjob  
94f0e79db981   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 96f93b1dbf53  
Thu Feb  1 06:08:19 UTC 2018
  
Hello from the Kubernetes cluste
  

  
root@ubuntu:/# docker logs 2271a37d07b4
  
Thu Feb  1 06:07:19 UTC 2018
  
Hello 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   AGE
  
hello-1517466900      1               1            2m
  
hello-1517466960      1               1            1m
  
hello-1517467500      1               1            46s
  

  
其中,NAME为CronJob的名称,每一次执行任务都会启动一个Pod
  
   SUCCESSFUL 列为1,表示任务执行成功。
  找出由CronJob资源对象创建出来的Pod: 可以通过上面的CronJob NAME:
root@ubuntu:/# kubectl get pods --show-all -o wide |grep hello-1517467500  
hello-1517467500-brhlx        0/1       Completed   0          56s             10.3.1.16
  找到对应的Pod后,查看它的日志:
root@ubuntu:/# kubectl logs hello-1517467980-q9dvk  
Thu Feb  1 06:33:13 UTC 2018
  
Hello from the Kubernetes cluste
  

  
#正是前面设置的命令输出结果
  如果不需要这个CronJob,删除之:
root@ubuntu:/# kubectl delete cronjob hello  Cronjob就是这么简单。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-583614-1-1.html 上篇帖子: Kubernetes之Taints与Tolerations 污点和容忍 下篇帖子: Kubernetes-leejay
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表