Kubernetes集群使用Cron Job管理基于时间的作业,可以在指定的时间点执行一次或在指定时间点执行多次任务。 一个Cron Job就好像Linux crontab中的一行,可以按照Cron定时运行任务。

定时任务对我们并不陌生,例如Linux的crontab,各种编程语言都内置了定时任务支持,这在我们应用开发中比较常见,但这种定时任务在分布式系统中使用会有限制,因此需要分布式计划任务。 Kubernetes的CronJob可以理解为Kubernetes对分布式计划任务的支持。

在使用Cron Job之前需要确认Kubernetes集群的版本>=1.5,因为它还处于alpha,所以还需要对kube-apiserver加入启动参数--runtime-config=batch/v2alpha1=true,开启batch/v2alpha1。 下面我们来试验一下,试验的Kubernetes集群的版本为1.6.8。

在加入启动参数--runtime-config=batch/v2alpha1=true后,要重启kube-apiserver, kube-controller-manager, kube-scheduler,创建crontab才会被调度

创建Cron Job

创建一个简单的CronJob,每隔1分钟打印当前的时间并”say Hello”,cronjob.yaml:

apiVersion: batch/v2alpha1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: alpine
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure

下面创建这个CronJob:

kubectl create -f cronjob.yaml
cronjob "hello" created

查看这个CronJob的状态:

kubectl get cronjob hello
NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
hello */1 * * * * False 0 <none>

从上面的输出看这个cronjob还没有被调度,等大约1分钟再次查看:

kubectl get jobs --watch
NAME DESIRED SUCCESSFUL AGE
hello-1503321060 1 1 2m
hello-1503321120 1 1 1m
hello-1503321180 1 1 36s kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
hello */1 * * * * False 0 Mon, 21 Aug 2017 21:14:00 +0800

删除Cron Job

kubectl delete cronjob hello
cronjob "hello" deleted

或

kubectl delete -f cronjob.yaml

删除命令会停止已经创建出来的作业,当时正在运行的作业不会被被停止,同时Job和Pod不会被删除:

kubectl get jobs
NAME DESIRED SUCCESSFUL AGE
hello-1503321060 1 1 7m
hello-1503321120 1 1 6m
hello-1503321180 1 1 5m
hello-1503321240 1 1 4m
hello-1503321300 1 1 3m
hello-1503321360 1 1 2m
hello-1503321420 1 1 1m

需要手动删除上面的job,job被删除,它创建出来的Pod也会被删除掉。

使用kubectl delete jobs --all可以删除当前namespaces下所有的job

当前Cron Job的限制

当前一个CronJob在执行期间“大约”创建一个Job,之所以说“大约”是因为在特殊的情况下可能会创建两个或没有Job被创建。Kubernetes官方正在试图使这种情况尽量少发生,但目前还不能保证完全杜绝。 因此如果我们现在使用它,那么Job应该被我们设计成幂等的。

Kubernetes的Cron Job的更多相关文章

  1. Kubernetes 在知乎上的应用

    从 Mesos 到 Kubernetes 之前的调度框架是基于 Mesos 自研的.采用的语言是 Python.运行了大概两年多的时间了,也一直比较稳定.但随着业务的增长,现有的框架的问题逐渐暴露. ...

  2. k8s系列0--Kubernetes基础知识

    Kubernetes介绍 参考:Kubernetes核心组件解析 Pod是k8s的最小调度单元 每个pod有独立的IP,但是pod的IP是不可靠的,重新调度pod就会改变IP,service概念就是为 ...

  3. Kubernetes — Job与CronJob

    有一类作业显然不满足这样的条件,这就是“离线业务”,或者叫作 Batch Job(计算业务). 这 种业务在计算完成后就直接退出了,而此时如果你依然用 Deployment 来管理这种业务的话,就会 ...

  4. 如何将云原生工作负载映射到 Kubernetes 中的控制器

    作者:Janakiram MSV 译者:殷龙飞 原文地址:https://thenewstack.io/how-to-map-cloud-native-workloads-to-kubernetes- ...

  5. How to trigger a Kubernetes cronjob manually-手动触发一个cronjob

    What should you do when you’ve developed and installed a cron job for your Kubernetes application, a ...

  6. [译]Kubernetes 分布式应用部署和人脸识别 app 实例

    原文地址:KUBERNETES DISTRIBUTED APPLICATION DEPLOYMENT WITH SAMPLE FACE RECOGNITION APP 原文作者:skarlso 译文出 ...

  7. Kubernetes基础:编排调度的那些Controllers

    0. 概述 Kubernetes提供了很多Controller资源来管理.调度Pod,包括Replication Controller.ReplicaSet.Deployments.StatefulS ...

  8. K8S学习笔记之Kubernetes核心概念

    0x00  Kubernetes简介 Kubernetes(K8S)是Google开源的容器集群管理系统,其设计源于Google在容器编排方面积累的丰富经验,并结合社区创新的最佳实践. K8S在Doc ...

  9. centos7.5单机yum安装kubernetes

    1.系统配置 centos7.5 docker 1.13.1 centos7下安装docker 2.关闭防火墙,selinux,swapoff systemctl disable firewalld ...

随机推荐

  1. 华为推送 简介 集成 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. SQLServer 数据库镜像+复制切换方案

    目标: 主机做了Mirror和Replication,当主机出现问题时,Replication和Mirror实现自动的故障转移(Mirror 和Replication都切换到备机,而当主机 重新启动后 ...

  3. 计算GDOP

    #include <iostream> #include <fstream> #include "..\include\CPosition.h" #incl ...

  4. Concurrent HTTP connections in Node.js

    原文: https://fullstack-developer.academy/concurrent-http-connections-in-node-js/ -------------------- ...

  5. jQuery 图片裁剪插件 Jcrop

    Jcrop是一个jQuery图片裁剪插件,它能为你的WEB应用程序快速简单地提供图片裁剪的功能.特点如下: 对所有图片均unobtrusively(无侵入的,保持DOM简洁) 支持宽高比例锁定 支持 ...

  6. CSS3实现的苹果网站搜索框效果

    在线演示 本地下载 用CSS3相关属性生成的动态搜索框效果.

  7. C#.NET常见问题(FAQ)-索引器indexer有什么用

    索引器就是名值对,你声明一个名值对的类,就可以给数组的指定元素赋值,也可以很方面的访问到指定元素值对应的下标(个人认为完全可以自己写一个类似的list来实现,没有必要多此一举学一个额外的方法)   复 ...

  8. C#.NET常见问题(FAQ)-如何使用DataGridView跟Excel数据交互

    1 从工具箱中拖进来一个DataGridView   2 就像Excel表头,可以添加一个表头(即一列的抬头,比如叫做A)   3 一次添加ABCDE等项目,也可以修改该类目的类型为Button或者C ...

  9. Vue.js 2.0 独立构建和运行时构建的区别

    Vue.js 2.0 独立构建和运行时构建的区别 在使用 Vue.js 2.0 时,有独立构建(standalone)和运行时构建(runtime-only)两种版本可供选择.而在 Vue.js 1. ...

  10. 轻松把玩HttpClient之封装HttpClient工具类(五),携带Cookie的请求

    近期更新了一下HttpClientUtil工具类代码,主要是加入了一个參数HttpContext,这个是用来干嘛的呢?事实上是用来保存和传递Cookie所须要的. 由于我们有非常多时候都须要登录.然后 ...