php schedule 只执行一次_Kubernetes入门到实战(十三)一次性任务Job和周期任务

作者:HappyLau

链接:https://cloud.tencent.com/developer/article/1579382?s=original-sharing&from=10680

1. Jobs让单次任务跑起来

1.1 Jobs简介

Windows下可以通过批处理脚本完成批处理任务,脚本运行完毕后任务即可终止,从而实现批处理任务运行工作,类似的任务如何在kubernetes中运行呢?答案是Jobs,Jobs是kubernetes中实现一次性计划任务的Pod控制器—JobController,通过控制Pod来执行任务,其特点为:

  • 创建Pod运行特定任务,确保任务运行完成

  • 任务运行期间节点异常时会自动重新创建Pod

  • 支持并发创建Pod任务数和指定任务数

ec18700b116cbb96d4208d4478ba5415.png

jobs

Jobs任务运行方式有如下三种:

  • 运行单个Jobs任务,一般运行一个pod,pod运行结束任务运行完成;

  • 运行特定数量的任务,通过completion指定总计运行任务;

  • 并发运行任务,通过parallelism指定并发数

1.2 运行单个Jobs任务

1、 定义一个jobs任务,通过在command中运行特定一个脚本,将当前的时间打印100次

apiVersion: batch/v1
kind: Job
metadata:
name: jobs-demo
labels:
controller: jobs
spec:
parallelism: 1 #并发数,默认为1,即创建pod副本的数量
template:
metadata:
name: jobs-demo
labels:
controller: jobs
spec:
containers:- name: echo-time
image: centos:latest
imagePullPolicy: IfNotPresent
command:- /bin/sh- -c- "for i in `seq 0 100`;do echo ${date} && sleep 1;done"
restartPolicy: Never #设置为Never,jobs任务运行完毕即可完成

2、 运行Jobs任务

[root@node-1 happylau]# kubectl apply -f job-demo.yaml
job.batch/job-demo created[root@node-1 happylau]# kubectl get jobs job-demo
NAME COMPLETIONS DURATION AGE
job-demo 0/1 41s 41s

3、 此时jobs控制器创建了一个pod容器运行任务,此时处于Running状态,任务处在运行过程中,如果运行完毕则会变为completed状态

[root@node-1 happylau]# kubectl get pods  |grep job
job-demo-ssrk7 1/1 Running 0 97s

4、查看jobs日志日志数据,可以看到当前jobs创建的任务是持续在终端中打印数字,且每次打印暂停1s钟

3ebfb0dbde71bdd84e1ccc746c7d916e.png

jobs任务输出

5、再次查看jobs的任务,可以看到任务已经completions,运行时长为103s,对应的pod状态处于completed状态

[root@node-1 ~]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
job-demo 1/1 103s 5m12s

6b57274c3e3fd498a73ff7ac09715674.png

jobs之pod状态

1.3 Jobs运行多个任务

Jobs控制器提供了两个控制并发数的参数:completions和parallelism,completions表示需要运行任务数的总数,parallelism表示并发运行的个数,如设置为1则会依次运行任务,前面任务运行再运行后面的任务,如下以创建5个任务数为例演示Jobs控制器实现并发数的机制。

1、 定义计算圆周率的Jobs任务

apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(100)"]
restartPolicy: Never
parallelism: 1
completions: 5

2、运行jobs任务,并用kubectl get jobs --watch查看jobs创建过程,可以看到pod任务是依次运行,直至达到completions所定义的数量

444c191af79dfaf7a999558927b5710e.png

jobs创建并发任务

3、Jobs任务都已运行完毕,查看Jobs列表可以看到任务都处于Completed状态,查看pod日志可以看到Pi圆周率计算的结果

7d055472ff7b544cb1dc1df92e68a81c.png

jobs批量运行并发任务

1.4 Jobs运行并发任务

Jobs控制器支持运行并发任务,并发任务即Jobs控制器一次运行多个Pod执行任务处理,如下以一次性运行3个Pod并发数为例演示通过Jobs控制器实现并发任务

1、定义Jobs任务,设置3个并发数任务

apiVersion: batch/v1
kind: Job
metadata:
name: jobs-demo
labels:
controller: jobs
spec:
parallelism: 3 #运行并发数为3,一次性创建3个pod
template:
metadata:
name: jobs-demo
labels:
controller: jobs
spec:
containers:- name: echo-time
image: centos:latest
imagePullPolicy: IfNotPresent
command: - /bin/sh- -c- "for i in `seq 0 10`;do echo `date` && sleep 1;done"
restartPolicy: Never

2、运行Jobs任务并查看,Jobs控制器同时创建了3个并发任务

f2df42dbeea64493ff259a0d0e5cd581.png

Jobs并发运行任务

3、通过上面的演示可知,通过parallelism指定并发数量,Jobs控制器会创建出多个Pod副本并运行直至任务completed,同时parallelism可以配合completions一起使用,通过并发创建特定数量的任务,如下以单次运行3个并发任务实现9个任务的Jobs任务

apiVersion: batch/v1
kind: Job
metadata:
name: jobs-demo
labels:
controller: jobs
spec:
parallelism: 3 #并发任务为3
completions: 9 #任务数为9
template:
metadata:
name: jobs-demo
labels:
controller: jobs
spec:
containers:- name: echo-time
image: centos:latest
imagePullPolicy: IfNotPresent
command: - /bin/sh- -c- "for i in `seq 0 10`;do echo `date` && sleep 1;done"
restartPolicy: Never

4、运行Jobs任务并观察创建过程,在describe jobs的详情events日志中可以看到一共创建了9个任务,每3个任务创建时间一样,即并发创建的任务

c543c374135409c80d2d70e12e4b0f45.png

并发运行多任务

总结:通过前面的例子解析可得知,Jobs能在kubernetes中实现类似Windows下批处理或Linux下shell任务的功能,通过运行特定任务数+并发数控制创建Pod任务。需要注意一点的是,Jobs控制器和Deployments副本控制器不一样,其不支持修改Jobs的yaml文件,如果有需要修改则需要提前将Jobs任务删除,然后再将修改后的yaml提交任务。

2. CronJobs周期性运转

2.1 CronJobs简介

CronJobs用于实现类似Linux下的cronjob周期性计划任务,CronJobs控制器通过时间线创建Jobs任务,从而完成任务的执行处理,其具有如下特点:

  • 实现周期性计划任务

  • 调用Jobs控制器创建任务

  • CronJobs任务名称小于52个字符

  • 应用场景如:定期备份,周期性发送邮件

8af6f38def893764dc0202f860905e73.png

Cronjob

CronJobs可通过schedule指定任务运行的周期,其使用参数和cronjob类似,分别使用:分时日月星5个参数表示周期性,其中*表示任意时间点,/表示每隔多久,-表示范围

  • 分钟  范围为0-59

  • 小时  范围为0-23

  • 日期  范围为1-31

  • 月份  范围为1-12

  • 星期  范围为0-7,其中0和7表示星期日

举例子说明:

1、 /1  * * *      表示每隔1分钟运行任务

2、 1 0 * * 6-7    表示每周六日的0点01分运行任务

2.2 运行Cronjobs任务

CronJobs任务是编写和Deployments类似,需啊哟一个schedule定期任务调度周期,通过jobTemplate定义生成Jobs任务的模版,定义一个任务为例:

1、 定义一个CronJobs任务,每隔5分钟运行一个任务

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-demo
labels:
jobgroup: cronjob-demo
spec:
schedule: "*/5 * * * *" #调度任务周期
jobTemplate: #创建Jobs任务模版
spec:
template:
spec:
containers:- name: cronjob-demo
image: busybox:latest
imagePullPolicy: IfNotPresent
command:- /bin/sh- -c- "for i in `seq 0 100`;do echo ${i} && sleep 1;done"
restartPolicy: Never

2、 运行CronJobs并查看任务列表

3115879f2ec4f67e73b2ec9806103a2c.png

运行cronjobs任务

3、校验CronJobs任务运行的情况,可以看到CronJobs任务调用Jobs控制器创建Pod,Pod创建周期和schedule中定义的周期一致

fdfc507359d06e2f750909bfcf43ed12.png

校验cronjobs

当然,CronJobs中通过Jobs的模版也可以定义运行任务的数量和并发数,实现计划时间范围内并发运行多个任务的需求。

写在最后

文章总结了在kubernetes集群中运行Jobs批处理任务和CronJobs两种控制器的功能使用,适用于特定场景下任务,Jobs任务执行完毕即completed,CronJobs周期性调用Jobs控制器完成任务的创建执行。

参考文章

不错的博客:https://draveness.me/kubernetes-job-cronjob

运行Jobs任务:https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/

计划任务ConJobs:https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/

自动运行任务:https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/

TKE创建Jobs任务:https://cloud.tencent.com/document/product/457/31708

TKE创建CronJobs:https://cloud.tencent.com/document/product/457/31709

往期文章

Kubernetes部署

Kubernetes 1.18.2集群部署 (单Master)+docker—kubeadm方式

Kubernetes 1.18.2集群部署 (多Master)+docker—kubeadm方式

Kubernetes 1.18.2集群部署 (多Master)+docker—二进制方式

Kubernetes 1.18.2集群部署 (单Master)+docker—shell脚本方式

Kubernetes 1.19.0集群部署 (多Master)+docker—kubeadm方式

Kubernetes 1.19.0集群部署 (多Master)+docker—二进制方式

Kubernetes 一条命令快速部署 Kubernetes 高可用集群—sealos

Kubernetes 一条命令快速部署 Kubernetes 高可用集群—kubei

Kubernetes Harbor v2.0.0私有镜像仓库部署

Kubernetes Harbor v2.0.2高可用私有镜像仓库部署

Kubernetes kubectx/kubens切换context和namespace

Kubernetes kubeadm更新一个10年有效期的证书

Kubernetes kubeadm初始化kubernetes集群延长证书过期时间

Kubernetes kubeadm升级集群

Kubernetes kubeadm基础使用

Kubernetes基础篇

Kubernetes 是什么?

Kubernetes 基础概念

Kubernetes 从零开始了解

Kubernetes 快速了解Kubernetes

Kubernetes kubectl命令

Kubernetes kubectl常用命令

Kubernetes kubectl常用命令大全

Kubernetes 创建、更新应用

Kubernetes 资源清单

Kubernetes Pod状态和生命周期管理

Kubernetes Pod Controller

Kubernetes ReplicaSet Controller

Kubernetes Deployment Controller

Kubernetes DamonSet Controller

Kubernetes Job、CronJob Controller

Kubernetes HPA Controller

Kubernetes HPA Controller 使用详解

Kubernetes KEDA基于Kubernetes事件驱动的自动缩放

Kubernetes 服务发现—Service

Kubernetes 内部服务发现—Coredns

Kubernetes 外部服务发现—Traefik ingress

Kubernetes 外部服务发现—Nginx Ingress Controller

Kubernetes 存储卷—Volumes

Kubernetes 存储卷—部署NFS服务器,供给静态pv和动态pv

Kubernetes 存储卷—PV和PVC的状态变化

Kubernetes 特殊存储卷—Secret和ConfigMap

Kubernetes StatefulSet Controller

Kubernetes 认证、授权和准入控制

Kubernetes dashboard认证访问-更新

Kubernetes 网络模型和网络策略

Kubernetes 网络原理解析

Kubernetes 网络插件-flannel

Kubernetes 网络插件-calico

Kubernetes Pod资源调度

Kubernetes 资源指标和集群监控

Kubernetes 容器云平台技术落地方案

Kubernetes v1.19.0 正式发布

Kubernetes Ratel自动生成yaml文件

Kubernetes 部署策略详解

Kubernetes 集群规模应该有多大?

Kubernetes 集群备份/恢复velero实战

Kubernetes 集群备份/恢复etcd数据实战

Kubernetes基础篇—Kubernetes 原理剖析与实战应用

Kubernetes 如何深入掌握 Kubernetes

Kubernetes 如何火起来的

Kubernetes 架构为什么是这样的

Kubernetes 集群搭建

Kubernetes 是如何搞定“不可变基础设施”的

Kubernetes Pod:最小调度单元的使用进阶及实践

Kubernetes 无状态应用:剖析K8S业务副本及水平扩展底层原理

Kubernetes 有状态应用:K8S如何通过 StatefulSet 支持有状态应用

Kubernetes 配置管理:K8S管理业务配置方式有哪些

Kubernetes 存储类型:如何挑选合适的存储插件

Kubernetes 存储管理:怎样对业务数据进行持久化存储

Kubernetes基础篇—Kubernetes 入门到实战

Kubernetes 入门到实战(一)俯瞰kubernetes全貌

Kubernetes 入门到实战(二)kubeadm部署kubernetes集群

Kubernetes 入门到实战(三)kubernetes快速入门

Kubernetes 入门到实战(四)kubernetes dashboard图形界面

Kubernetes 入门到实战(五)深入浅出详解Pod

Kubernetes 入门到实战(六)资源管理和服务质量

Kubernetes 入门到实战(七)深入玩转pod调度

Kubernetes 入门到实战(八)Pod健康检查机制

Kubernetes 入门到实战(九)初识Pod存储管理

Kubernetes 入门到实战(十)深入学习持久化存储PV和PVC

Kubernetes 入门到实战(十一)深入学习Deployment控制器

Kubernetes 入门到实战(十二)详解DaemonSet控制器

Kubernetes应用部署

Kubernetes 部署WordPress博客

Kubernetes 部署Nginx+php-fpm+MySQL并运行Discuz

Kubernetes 使用StatefulSet部署MySQL高可用集群

Kubernetes 使用StatefulSet部署MongoDB高可用集群

Kubernetes 包管理工具—Helm2.13安装和使用

Kubernetes Helm2部署gitlab私有代码仓库

Kubernetes Helm2部署MySQL数据库

Kubernetes 包管理工具—Helm3.3安装和使用

Kubernetes Helm3部署MySQL数据库

Kubernetes Helm3部署kubernetes-dashboard

Kubernetes Helm3部署nginx-ingress  NodePort方式

Kubernetes Helm3部署nginx-ingress  LoadBalancer方式

Kubernetes监控

Kubernetes 部署Prometheus+Grafana+Alertmanager监控告警系统

Kubernetes Prometheus监控Nginx

Kubernetes Prometheus监控MySQL

Kubernetes Prometheus监控tomcat

Kubernetes 部署kube-prometheus监控告警系统

Kubernetes kube-prometheus中添加自定义监控项-监控etcd

Kubernetes kube-prometheus监控指标targets

Kubernetes kube-prometheus配置kubernetes-cadvisor服务自动发现

Kubernetes kube-prometheus Configuration信息

Kubernetes kube-prometheus中添加自定义监控项-监控MySQL

Kubernetes Grafana匿名登录/密码登录Kubernetes

Kubernetes Grafana迁移(导出导入)dashboard

Kubernetes Grafana数据持久化

Kubernetes日志

Kubernetes 使用Elastic Stack构建Kubernetes全栈监控

Kubernetes 日志架构

Kubernetes 使用 Loki 进行日志监控和报警

Kubernetes故障排除

Kubernetes 删除namespace时卡在Terminating状态

Kubernetes deploy,rs,sts Mismatch 的处理

Kubernetes master机器文件系统故障恢复过程

Kubernetes 如何修改容器时间而不改变宿主机时间?

Kubernetes面试问题

Kubernetes IT运维面试问题总结-简述Etcd、Kubernetes、Lvs、HAProxy等

Kubernetes 50个必须了解的Kubernetes面试问题

Kubernetes 面试题汇总1

Kubernetes 面试题汇总2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值