Kubernetes的资源控制器Job和CronJob详解与示例

主机配置规划

服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟)
k8s-master CentOS7.7 2C/4G/20G 172.16.1.110 10.0.0.110
k8s-node01 CentOS7.7 2C/4G/20G 172.16.1.111 10.0.0.111
k8s-node02 CentOS7.7 2C/4G/20G 172.16.1.112 10.0.0.112

什么是控制器

kubernetes中内建了很多controller(控制器),这些相当于一个状态机,用来控制pod的具体状态和行为。

部分控制器类型如下:
  • ReplicationController 和 ReplicaSet
  • Deployment
  • DaemonSet
  • StatefulSet
  • Job/CronJob
  • HorizontalPodAutoscaler

Job

负责批处理任务

Job创建一个或多个Pod,并确保指定数量的Pod成功终止。Pod成功完成后,Job将跟踪成功完成的情况。当达到指定的成功完成次数时,任务(即Job)就完成了。删除Job将清除其创建的Pod。

一个简单的情况是创建一个Job对象,以便可靠地运行一个Pod来完成。如果第一个Pod发生故障或被删除(例如,由于节点硬件故障或节点重启),则Job对象将启动一个新的Pod。

当然还可以使用Job并行运行多个Pod。

Job终止和清理

Job完成后,不会再创建其他Pod,但是Pod也不会被删除。这样使我们仍然可以查看已完成容器的日志,以检查是否有错误、警告或其他诊断输出。Job对象在完成后也将保留下来,以便您查看其状态。

当我们删除Job对象时,对应的pod也会被删除。

特殊说明

  • 单个Pod时,默认Pod成功运行后Job即结束
  • restartPolicy 仅支持Never和OnFailure
  • .spec.completions 标识Job结束所需要成功运行的Pod个数,默认为1
  • .spec.parallelism 标识并行运行的Pod个数,默认为1
  • .spec.activeDeadlineSeconds 为Job的持续时间,不管有多少Pod创建。一旦工作到指定时间,所有的运行pod都会终止且工作状态将成为type: Failed与reason: DeadlineExceeded。

CronJob

Cron Job 创建是基于时间调度的 Jobs

一个 CronJob 对象就像 crontab (cron table) 文件中的一行。它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job。

CronJob 限制

CronJob 创建 Job 对象,每个 Job 的执行次数大约为一次。 之所以说 “大约” ,是因为在某些情况下,可能会创建两个 Job,或者不会创建任何 Job。虽然试图使这些情况尽量少发生,但不能完全杜绝。因此,Job 应该是幂等的。

CronJob 仅负责创建与其调度时间相匹配的 Job,而 Job 又负责管理其代表的 Pod。

使用案例:

1、在给定时间点调度Job

2、创建周期性运行的Job。如:数据备份、数仓导数、执行任务、邮件发送、数据拉取、数据推送

特殊说明

.spec.schedule 必选,任务被创建和执行的调度时间。同Cron格式串,例如 0 * * * *。

  • .spec.jobTemplate 必选,任务模版。它和 Job的语法完全一样
  • .spec.startingDeadlineSeconds 可选的。默认未设置。它表示任务如果由于某种原因错过了调度时间,开始该任务的截止时间的秒数。过了截止时间,CronJob 就不会开始任务。不满足这种最后期限的任务会被统计为失败任务。如果没有该声明,那任务就没有最后期限。
  • .spec.concurrencyPolicy 可选的。它声明了 CronJob 创建的任务执行时发生重叠如何处理。spec 仅能声明下列规则中的一种:

Allow (默认):CronJob 允许并发任务执行。

Forbid:CronJob 不允许并发任务执行;如果新任务的执行时间到了而老任务没有执行完,CronJob 会忽略新任务的执行。

Replace:如果新任务的执行时间到了而老任务没有执行完,CronJob 会用新任务替换当前正在运行的任务。

请注意,并发性规则仅适用于相同 CronJob 创建的任务。如果有多个 CronJob,它们相应的任务总是允许并发执行的。

  • .spec.suspend 可选的。如果设置为 true ,后续发生的执行都会挂起。这个设置对已经开始执行的Job不起作用。默认是关闭的false。
    备注:在调度时间内挂起的执行都会被统计为错过的任务。当 .spec.suspend 从 true 改为 false 时,且没有开始的最后期限,错过的任务会被立即调度。
  • .spec.successfulJobsHistoryLimit 和 .spec.failedJobsHistoryLimit 可选的。 这两个声明了有多少执行完成和失败的任务会被保留。默认设置为3和1。限制设置为0代表相应类型的任务完成后不会保留。

说明:如果 startingDeadlineSeconds 设置为很大的数值或未设置(默认),并且 concurrencyPolicy 设置为 Allow,则作业将始终至少运行一次。

Job示例

yaml文件

 [root@k8s-master controller]# pwd
/root/k8s_practice/controller
[root@k8s-master controller]# cat job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
#completions: # 标识Job结束所需要成功运行的Pod个数,默认为1
template:
spec:
containers:
- name: pi
image: registry.cn-beijing.aliyuncs.com/google_registry/perl:5.26
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit:

创建job,与状态查看

 [root@k8s-master controller]# kubectl apply -f job.yaml
job.batch/pi created
[root@k8s-master controller]# kubectl get job -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
pi / 16s 16s pi registry.cn-beijing.aliyuncs.com/google_registry/perl:5.26 controller-uid=-fd5e--9bbb-cd0698e19cb9
[root@k8s-master controller]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pi-6zvm5 / ContainerCreating 85s <none> k8s-node01 <none> <none>

之后再次查看

 [root@k8s-master controller]# kubectl get job -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
pi / 14m 44m pi registry.cn-beijing.aliyuncs.com/google_registry/perl:5.26 controller-uid=-fd5e--9bbb-cd0698e19cb9
[root@k8s-master controller]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pi-6zvm5 / Completed 44m 10.244.4.63 k8s-node01 <none> <none>
[root@k8s-master controller]#
[root@k8s-master controller]# kubectl describe job pi
Name: pi
Namespace: default
Selector: controller-uid=76680f6f-442c-4a09-91dc-c3d4c18465b0
Labels: controller-uid=76680f6f-442c-4a09-91dc-c3d4c18465b0
job-name=pi
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"batch/v1","kind":"Job","metadata":{"annotations":{},"name":"pi","namespace":"default"},"spec":{"backoffLimit":,"
Parallelism:
Completions:
Start Time: Tue, Aug :: +
Completed At: Tue, Aug :: +
Duration: 18s
Pods Statuses: Running / Succeeded / Failed
Pod Template:
Labels: controller-uid=76680f6f-442c-4a09-91dc-c3d4c18465b0
job-name=pi
Containers:
pi:
Image: registry.cn-beijing.aliyuncs.com/google_registry/perl:5.26
Port: <none>
Host Port: <none>
Command:
perl
-Mbignum=bpi
-wle
print bpi()
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 2m33s job-controller Created pod: pi-6zvm5

并查看 Pod 的标准输出

 [root@k8s-master controller]# kubectl logs --tail  pi-6zvm5
3.141592653589793238462643383279502884197169399375105820974944592307816406………………

CronJob示例

yaml文件

 [root@k8s-master controller]# pwd
/root/k8s_practice/controller
[root@k8s-master controller]# cat cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure

启动cronjob并查看状态

 [root@k8s-master controller]# kubectl apply -f cronjob.yaml
cronjob.batch/hello created
[root@k8s-master controller]# kubectl get cronjob -o wide
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE CONTAINERS IMAGES SELECTOR
hello */ * * * * False 8s 27s hello registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 <none>
[root@k8s-master controller]#
[root@k8s-master controller]# kubectl get job -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
hello- / 2s 21s hello registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 controller-uid=9e0180e8--4a58-8b93-089b92774b5e
[root@k8s-master controller]#
[root@k8s-master controller]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello--m4fr8 / Completed 36s 10.244.4.66 k8s-node01 <none> <none>

几分钟之后的状态信息

 [root@k8s-master controller]# kubectl get cronjob -o wide
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE CONTAINERS IMAGES SELECTOR
hello */ * * * * False 55s 7m14s hello registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 <none>
[root@k8s-master controller]#
[root@k8s-master controller]#
[root@k8s-master controller]# kubectl get job -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
hello- / 1s 3m1s hello registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 controller-uid=0676bd6d-861b-440b-945b-4b2704872728
hello- / 2s 2m1s hello registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 controller-uid=09c1902e-76ef--b3b4-3188961c13e9
hello- / 2s 61s hello registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 controller-uid=f30dc159--4cfc-b06b-f950c8dcfc28
[root@k8s-master controller]#
[root@k8s-master controller]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello--m4pxf / Completed 2m6s 10.244.4.70 k8s-node01 <none> <none>
hello--wk7jh / Completed 66s 10.244.2.77 k8s-node02 <none> <none>
hello--rcx7v / Completed 6s 10.244.4.72 k8s-node01 <none> <none>
[root@k8s-master controller]#
[root@k8s-master controller]# kubectl describe cronjob hello
Name: hello
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"batch/v1beta1","kind":"CronJob","metadata":{"annotations":{},"name":"hello","namespace":"default"},"spec":{"jobTemplate":{"...
Schedule: */ * * * *
Concurrency Policy: Allow
Suspend: False
Successful Job History Limit:
Failed Job History Limit:
Starting Deadline Seconds: <unset>
Selector: <unset>
Parallelism: <unset>
Completions: <unset>
Pod Template:
Labels: <none>
Containers:
hello:
Image: registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24
Port: <none>
Host Port: <none>
Args:
/bin/sh
-c
date; echo Hello from the Kubernetes cluster
Environment: <none>
Mounts: <none>
Volumes: <none>
Last Schedule Time: Wed, Aug :: +
Active Jobs: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 19m cronjob-controller Created job hello-
Normal SawCompletedJob 19m cronjob-controller Saw completed job: hello-, status: Complete
Normal SuccessfulCreate 18m cronjob-controller Created job hello-
Normal SawCompletedJob 18m cronjob-controller Saw completed job: hello-, status: Complete
Normal SuccessfulCreate 17m cronjob-controller Created job hello-
Normal SawCompletedJob 17m cronjob-controller Saw completed job: hello-, status: Complete
Normal SuccessfulCreate 16m cronjob-controller Created job hello-
Normal SuccessfulDelete 16m cronjob-controller Deleted job hello-
Normal SawCompletedJob 16m cronjob-controller Saw completed job: hello-, status: Complete
Normal SuccessfulCreate 15m cronjob-controller Created job hello-
Normal SawCompletedJob 15m cronjob-controller Saw completed job: hello-, status: Complete
Normal SuccessfulDelete 15m cronjob-controller Deleted job hello-
Normal SuccessfulCreate 14m cronjob-controller Created job hello-
Normal SuccessfulDelete 14m cronjob-controller Deleted job hello-
Normal SawCompletedJob 14m cronjob-controller Saw completed job: hello-, status: Complete
Normal SuccessfulCreate 13m cronjob-controller Created job hello-
Normal SawCompletedJob 13m cronjob-controller Saw completed job: hello-, status: Complete
………………
Normal SawCompletedJob 11m cronjob-controller Saw completed job: hello-, status: Complete
Normal SuccessfulDelete 11m cronjob-controller Deleted job hello-
Normal SawCompletedJob 10m cronjob-controller (combined from similar events): Saw completed job: hello-, status: Complete
Normal SuccessfulCreate 4m13s (x7 over 10m) cronjob-controller (combined from similar events): Created job hello-

找到最后一次调度任务创建的 Pod, 并查看 Pod 的标准输出。请注意任务名称和 Pod 名称是不同的。

 [root@k8s-master controller]#  kubectl logs pod/hello--rcx7v   # 或者 kubectl logs hello--rcx7v
Fri May :: UTC
Hello from the Kubernetes cluster

删除 CronJob

 [root@k8s-master controller]# kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */ * * * * False 32s 19m
[root@k8s-master controller]#
[root@k8s-master controller]# kubectl delete cronjob hello # 或者 kubectl delete -f cronjob.yaml
cronjob.batch "hello" deleted
[root@k8s-master controller]# kubectl get cronjob # 可见已删除
No resources found in default namespace.

相关阅读

1、Kubernetes K8S之资源控制器RC、RS、Deployment详解

2、Kubernetes K8S之资源控制器StatefulSets详解

3、Kubernetes K8S之资源控制器Daemonset详解

4、官网:Jobs

5、官网:CronJob

完毕!


———END———
如果觉得不错就关注下呗 (-^O^-) !

Kubernetes K8S之资源控制器Job和CronJob详解的更多相关文章

  1. Kubernetes K8S之资源控制器StatefulSets详解

    Kubernetes的资源控制器StatefulSet详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2 ...

  2. Kubernetes K8S之资源控制器Daemonset详解

    Kubernetes的资源控制器Daemonset详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C/ ...

  3. Kubernetes K8S之Taints污点与Tolerations容忍详解

    Kubernetes K8S之Taints污点与Tolerations容忍详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master C ...

  4. Kubernetes K8S之资源控制器RC、RS、Deployment详解

    Kubernetes的资源控制器ReplicationController(RC).ReplicaSet(RS).Deployment(Deploy)详解与示例 主机配置规划 服务器名称(hostna ...

  5. Kubernetes K8S之affinity亲和性与反亲和性详解与示例

    Kubernetes K8S之Node节点亲和性与反亲和性以及Pod亲和性与反亲和性详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-mas ...

  6. k8s学习-资源控制器

    4.3.资源控制器 4.3.1.概念 Kubernetes中内建了很多种controller(控制器),这些相当于一个状态机,用来控制Pod的具体状态和行为. 4.3.2.分类 Replication ...

  7. kubernetes进阶(一) kubectl工具使用详解

    管理k8s核心资源的三种基本方法: 一.陈述式-主要依赖命令行工具  --可以满足90%以上的使用场景,但是缺点也很明显: 命令冗长,复杂,难以记忆 特定场景下,无法实现管理需求 对资源的增.删.查操 ...

  8. Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解

    一.控制器定义 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求并将其转换为一个模型.在Spring MVC中一个控制器可以包含多个Action(动作. ...

  9. 【八】Kubernetes 五种资源控制器详细介绍以及功能演示

    一.控制器说明 Pod 的分类: 自主式 Pod:该类型的 Pod 无论是异常退出还是正常退出都不会被创建,也就是说没有对应的管理者. 控制器管理的 Pod:该类型 Pod 在控制器的生命周期里,控制 ...

随机推荐

  1. 机器学习 | 详解GBDT梯度提升树原理,看完再也不怕面试了

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第30篇文章,我们今天来聊一个机器学习时代可以说是最厉害的模型--GBDT. 虽然文无第一武无第二,在机器学习领域并没有 ...

  2. Bytom DAPP 开发流程

    从目前已经发布的DAPP来看,DAPP架构大致可以分成3种类型:插件钱包模式.全节点钱包模式和兼容模式. 插件钱包模式是借助封装了钱包的浏览器插件通过RPC协议与区块链节点通信,插件在运行时会将Web ...

  3. 推荐:pyqt5入门教程

    版权声明:本文为CSDN博主「AzureMouse」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/azure ...

  4. SCHP代码中的问题

    1.subprocess.CalledProcessError: Command ‘[‘where’, ‘cl’]’ returned non-zero exit status 1. 这个问题是因为电 ...

  5. Java—io流之打印流、 commons-IO

    打印流 打印流根据流的分类: 字节打印流  PrintStream 字符打印流  PrintWriter /* * 需求:把指定的数据,写入到printFile.txt文件中 * * 分析: * 1, ...

  6. day27:异常&反射

    目录 认识异常处理 1.程序错误的种类    2.异常的分类 3.AssertionError(断言assert语句失败) 异常处理的基本语法 1.异常处理的基本语法 2.带有分支的异常处理 3.处理 ...

  7. 微博AnalysisQl动态数据视图元数据设计

    前言 目前,AnalysisQl 数据视图的元数据(维度.指标.指标计算器)需要通过代码(API)或资源文件的形式硬编码,应用启动时,按照声明的顺序依次注册.这种模式下,数据视图是 静态 的,任何一项 ...

  8. myBatis源码解析-反射篇(4)

    前沿 前文分析了mybatis的日志包,缓存包,数据源包.源码实在有点难顶,在分析反射包时,花费了较多时间.废话不多说,开始源码之路. 反射包feflection在mybatis路径如下: 源码解析 ...

  9. troubleshoot之:使用JFR解决内存泄露

    目录 简介 一个内存泄露的例子 使用JFR和JMC来分析内存泄露 OldObjectSample 总结 简介 虽然java有自动化的GC,但是还会有内存泄露的情况.当然java中的内存泄露跟C++中的 ...

  10. Mybatis-05-使用注解开发

    使用注解开发 1 面向接口编程 原因: 解耦.可扩展性.提高复用性 关于接口的理解 定义与实现的分离 两类接口 一个个体的抽象,abstract class 一个个体某个方面的抽象,interface ...