一、Job与CronJob概念与与原理解读

     Job 控制器用于管理 Pod 对象运行一次性任务,比方说我们对数据库备份,可以直接在 k8s 上启动一个 mysqldump 备份程序,也可以启动一个 pod,这个 pod 专门用来备份用的,备份结束 pod 就可以终止了,不需要重启,而是将 Pod 对象置于"Completed"(完成)状态,
若容器中的进程因错误而终止,则需要按照重启策略配置确定是否重启,对于 Job 这个类型的控制器来说,需不需要重建 pod 就看任务是否完成,完成就不需要重建,没有完成就需要重建 pod。 Job 控制器的 Pod 对象的状态转换如下图所示:

0:完成状态、非0:错误状态;以非0状态码退出就会重启pod

1.1 Job三种使用场景

1、非并行任务:只启一个 pod,pod 成功,job 正常结束
2、并行任务同时指定成功个数:.spec.completions 为指定成功个数,可以指定也可以不指定.spec.parallelism(指定>1,会有多个任务并行运行)。当成功个数达到.spec.completions,任务结束。
3、有工作队列的并行任务:.spec.completions 默认1,.spec.parallelism 为大于 0 的整数。此时并行启动多个 pod,只要有一个成功,任务结束,所有 pod 结束

1.2 适用场景

Job 不是设计用来完成通信密集型的并行程序,如科学计算领域常见的场景。它支持并行地处理一组独立但相关的 work item,如发送邮件,渲染帧,转码文件和扫描 NoSql 数据库中的 key

kubectl explain Job.spec
相关配置:
.spec.completions:完成该 Job 需要执行成功的 Pod 数
.spec.parallelism:能够同时运行的 Pod 数
.spec.backoffLimit:允许执行失败的 Pod 数,默认值是 6,0 表示不允许 Pod 执行失败。如果Pod 是 restartPolicy 为 Nerver,则失败后会创建新的 Pod,如果是 OnFailed,则会重启 Pod,不管是哪种情况,只要 Pod 失败一次就计算一次,
而不是等整个 Pod 失败后再计算一个。当失败的次数达到该限制时,整个 Job 随即结束,所有正在运行中的 Pod 都会被删除。
.spec.activeDeadlineSeconds: Job 的超时时间,一旦一个 Job 运行的时间超出该限制,则 Job失败,所有运行中的 Pod 会被结束并删除。该配置指定的值必须是个正整数。不指定则不会超时

1.3 CronJob 概念、原理解读

CronJob 跟 Job 完成的工作是一样的,只不过 CronJob 添加了定时任务能力可以指定时间,实现周期性运行。Job,CronJob 和 Deployment,DaemonSet 显著区别在于不需要持续在后台运行

Deployment 主要用于管理无状态的应用(kubernetes 集群有一些 pod,某一个 pod 出现故障, 删除之后会重新启动一个 pod,那么 kubernetes 这个集群中 pod 数量就正常了,更多关注的是群体, 这就是无状态应用)。

使用场景:
1、在给定时间点只运行一次。
2、在给定时间点周期性地运行。 CronJob 的典型用法如下:
1、在给定的时间点调度 Job 运行。
2、创建周期性运行的 Job,例如数据库备份、发送邮件

二、Job控制器-资源清单编写技巧

# 查看Job资源对象由哪几部分组成
[root@master dmgame]# kubectl explain Job
KIND: Job
VERSION: batch/v1 FIELDS:
apiVersion <string>
kind <string>
metadata <Object> #元数据,定义资源的名字和所在名称空间
spec <Object>
status <Object> #查看 Job 下的 spec 字段
[root@master dmgame]# kubectl explain Job.spec
FIELDS:
activeDeadlineSeconds <integer> #通过指定job 存活时间,来结束一个 job。当 job 运行时间达到 activeDeadlineSeconds 指定的时间后,job 会停止由它启动的所有任务(如:pod),并设置 job 的状态为 failed backoffLimit <integer> #job 建议指定 pod 的重启策略为 never,如:.spec.template.spec.restartPolicy = "Never",然后通过 job 的 backoffLimit 来指定失败重试次数,在达到 backoffLimit 指定的次数后,
                job 状态设置为 failed(默认为 6 次) completionMode <string>
completions <integer> #指定job 启动的任务(如:pod)成功运行 completions 次,job 才算成功结束
manualSelector <boolean>
parallelism <integer> #指定job 同时运行的任务(如:pod)个数,Parallelism 默认为 1, 如果设置为 0,则 job 会暂定 podFailurePolicy <Object>
selector <Object>
suspend <boolean>
template <Object> -required- ttlSecondsAfterFinished <integer> #默认情况下,job 异常或者成功结束后,包括 job 启动的任务(pod),都不会被清理掉,因为你可以依据保存的 job 和 pod,查看状态、日志,以及调试等。这些用户可以手动删除,
用户手动删除 job,job controller 会级联删除对应的 pod,除了手动删除,通过指定参数 ttlSecondsAfterFinished 也可以实现自动删除 job,以及级联的资源,如:pod。如果设置为 0,job 会被立即删除。如果不指定,job 则不会被删除

2.1 实战:Job使用案例-创建一个一次性任务

[root@master ~]# cat job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: my-busybox-job
spec:
completions: 6  # job 结束需要成功运行的 Pod 个数,即状态为 Completed 的 pod 数
parallelism: 3 # 一次运行3个pod,这个值不会超过Completed个数
backoffLimit: 6 # 如果job失败,重试次数
template:
metadata:
labels:
app: test
spec:
restartPolicy: Never
containers:
- name: my-container-job
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c']
args: ['echo "Welcome to xc";sleep 60; echo "Next to Meet you"'] [root@master ~]# kubectl apply -f job.yaml
job.batch/my-busybox-job created [root@master ~]# kubectl get pods -l app=test -w NAME READY STATUS RESTARTS AGE
my-busybox-job-mct9j 0/1 Pending 0 0s
my-busybox-job-mct9j 0/1 Pending 0 1s
my-busybox-job-ph6fp 0/1 Pending 0 0s
my-busybox-job-xx2rh 0/1 Pending 0 0s
my-busybox-job-ph6fp 0/1 Pending 0 0s
my-busybox-job-mct9j 0/1 ContainerCreating 0 1s
my-busybox-job-xx2rh 0/1 Pending 0 0s
my-busybox-job-ph6fp 0/1 ContainerCreating 0 0s
my-busybox-job-xx2rh 0/1 ContainerCreating 0 0s
my-busybox-job-xx2rh 0/1 ContainerCreating 0 0s
my-busybox-job-mct9j 0/1 ContainerCreating 0 1s
my-busybox-job-ph6fp 0/1 ContainerCreating 0 1s
my-busybox-job-ph6fp 1/1 Running 0 2s
my-busybox-job-xx2rh 1/1 Running 0 2s
my-busybox-job-mct9j 1/1 Running 0 3s
启动了3个pod,completed后又启动了3个
#################################
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-busybox-job-4pbc5 1/1 Running 0 44s
my-busybox-job-dwqwm 1/1 Running 0 44s
my-busybox-job-mct9j 0/1 Completed 0 109s
my-busybox-job-ntf9d 1/1 Running 0 44s
my-busybox-job-ph6fp 0/1 Completed 0 108s
my-busybox-job-xx2rh 0/1 Completed 0 108s

[root@master ~]# kubectl logs my-busybox-job-4pbc5
Welcome to xc
Next to Meet you

############################
my-busybox-job-xx2rh 0/1 Completed 0 62s
my-busybox-job-ph6fp 0/1 Completed 0 62s
my-busybox-job-mct9j 0/1 Completed 0 63s
my-busybox-job-xx2rh 0/1 Completed 0 63s
my-busybox-job-ph6fp 0/1 Completed 0 63s
my-busybox-job-mct9j 0/1 Completed 0 64s
my-busybox-job-xx2rh 0/1 Completed 0 64s
my-busybox-job-mct9j 0/1 Completed 0 65s
my-busybox-job-ph6fp 0/1 Completed 0 64s
my-busybox-job-ntf9d 0/1 Pending 0 0s
my-busybox-job-4pbc5 0/1 Pending 0 0s
my-busybox-job-dwqwm 0/1 Pending 0 0s
my-busybox-job-ntf9d 0/1 Pending 0 0s
my-busybox-job-4pbc5 0/1 Pending 0 0s
my-busybox-job-ph6fp 0/1 Completed 0 64s
my-busybox-job-dwqwm 0/1 Pending 0 0s
my-busybox-job-xx2rh 0/1 Completed 0 64s
my-busybox-job-mct9j 0/1 Completed 0 65s
my-busybox-job-ntf9d 0/1 ContainerCreating 0 0s
my-busybox-job-4pbc5 0/1 ContainerCreating 0 0s
my-busybox-job-dwqwm 0/1 ContainerCreating 0 0s
my-busybox-job-ntf9d 0/1 ContainerCreating 0 1s
my-busybox-job-dwqwm 0/1 ContainerCreating 0 1s
my-busybox-job-4pbc5 0/1 ContainerCreating 0 1s
my-busybox-job-4pbc5 1/1 Running 0 2s
my-busybox-job-dwqwm 1/1 Running 0 2s
my-busybox-job-ntf9d 1/1 Running 0 2s
my-busybox-job-4pbc5 0/1 Completed 0 62s
my-busybox-job-dwqwm 0/1 Completed 0 62s
my-busybox-job-ntf9d 0/1 Completed 0 62s
my-busybox-job-dwqwm 0/1 Completed 0 63s
my-busybox-job-ntf9d 0/1 Completed 0 63s
my-busybox-job-4pbc5 0/1 Completed 0 63s
my-busybox-job-4pbc5 0/1 Completed 0 64s
my-busybox-job-dwqwm 0/1 Completed 0 64s
my-busybox-job-ntf9d 0/1 Completed 0 64s
my-busybox-job-ntf9d 0/1 Completed 0 64s
my-busybox-job-dwqwm 0/1 Completed 0 64s
my-busybox-job-4pbc5 0/1 Completed 0 64s

2.2 实战:CronJob使用案例-创建周期性定时任务

[root@master ~]# cat cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
metadata:
labels:
app: cro
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure [root@master ~]# kubectl apply -f cronjob.yaml
cronjob.batch/hello created [root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-28215840-s5kgt 0/1 Completed 0 22s [root@master ~]# kubectl get cronjob -w
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 <none> 0s
hello */1 * * * * False 1 0s 9s
hello */1 * * * * False 0 3s 12s
hello */1 * * * * False 0 3s 12s [root@master ~]# kubectl get job -w
NAME COMPLETIONS DURATION AGE
hello-28215840 0/1 0s
hello-28215840 0/1 0s 0s
hello-28215840 0/1 3s 3s
hello-28215840 1/1 3s 3s [root@master ~]# kubectl logs hello-28215840-s5kgt
Fri Aug 25 08:00:00 UTC 2023
Hello from the Kubernetes cluster

k8s核心资源Job&&CronJob调度pod的更多相关文章

  1. k8s核心资源之namespace与pod污点容忍度生命周期进阶篇(四)

    目录 1.命名空间namespace 1.1 什么是命名空间? 1.2 namespace应用场景 1.3 namespacs常用指令 1.4 namespace资源限额 2.标签 2.1 什么是标签 ...

  2. k8s核心资源之Pod概念&入门使用讲解(三)

    目录 1. k8s核心资源之Pod 1.1 什么是Pod? 1.2 Pod如何管理多个容器? 1.3 Pod网络 1.4 Pod存储 1.5 Pod工作方式 1.5.1 自主式Pod 1.5.2 控制 ...

  3. k8s核心资源:精简版yaml示例

    yaml语法及格式校验 详见:https://www.cnblogs.com/uncleyong/p/15437385.html 创建资源的三种方式 参考:https://www.cnblogs.co ...

  4. k8s核心资源之:标签(label)

    简介 label是标签的意思,一对 key/value ,被关联到对象上,k8s中的资源对象大都可以打上标签,如Node.Pod.Service 等 一个资源可以绑定任意多个label,k8s 通过  ...

  5. k8s核心资源之:名称空间(ns)

    简介 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或者用户组. 常见的pod.service.replicaSet和deployment等都是属于某一个namespac ...

  6. K8s容器资源限制

    在K8s中定义Pod中运行容器有两个维度的限制: 1. 资源需求:即运行Pod的节点必须满足运行Pod的最基本需求才能运行Pod. 如: Pod运行至少需要2G内存,1核CPU    2. 资源限额: ...

  7. K8S(02)管理核心资源的三种基本方法

    系列文章说明 本系列文章,可以基本算是 老男孩2019年王硕的K8S周末班课程 笔记,根据视频来看本笔记最好,否则有些地方会看不明白 需要视频可以联系我 管理k8s核心资源的三种基本方法: 目录 系列 ...

  8. 图解Kubernetes的Pod核心资源-来白嫖啊

    目录 一.Pod定义 二.Pod入门yaml描述文件 三.共享NetworkNamespace 四.共享PID 五.容器生命周期 六.初始化容器 6.1.简介 6.2.与普通容器的区别 6.3.实验 ...

  9. Kubernetes K8S之资源控制器Job和CronJob详解

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

  10. K8s Scheduler 在调度 pod 过程中遗漏部分节点的问题排查

    问题现象 在TKE控制台上新建版本为v1.18.4(详细版本号 < v1.18.4-tke.5)的独立集群,其中,集群的节点信息如下: 有3个master node和1个worker node, ...

随机推荐

  1. Spring Security 中的 BCryptPasswordEncoder

    一.使用BCryptPasswordEncoder加密的值可以解出来吗 Spring Security 中的 BCryptPasswordEncoder 是一种单向加密算法,它是为了安全性考虑而设计的 ...

  2. rnacos 版本更新为 v0.1.4

    rnacos是一个用 rust重新实现的nacos. 周一发布 rnacos 后,有收到部分对2.0版本兼容问题的反馈. 主要是nacos2.0版本的注册心跳与1.0不同,rnacos之前没对2.0版 ...

  3. Bad magic number for central directory

    Bad magic number for central directory 运行代码输出如下bug: File "/home/a/Prediction/Predict_Models.py& ...

  4. -bash: jps:未找到命令 CentOS7

    yum install java-1.8.0-openjdk-devel.x86_64

  5. Android将数据导入到已有的excel表格_0

    用到的jxl2.6.12 jar 包下载地址: https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl/2.6.12

  6. #线性基,点分治#洛谷 3292 [SCOI2016]幸运数字

    题目 分析 题目就是将\(x\)到\(y\)路径上的线性基合并求解, 这里用的是点分治,每次换根到重心的时候维护前缀线性基, 查询的时候如果属于不同的子树就能询问答案,记得\(x=y\)要特判 代码 ...

  7. Jetty的http3模块

    启用http3模块,执行如下命令: java -jar $JETTY_HOME/start.jar --add-modules=http3 命令的输出,如下: ALERT: There are ena ...

  8. Solon 的事务管理工具类(TranUtils)

    Solon 在编码上,是强调注解与手写并重的一个风格.它有个 @Tran 注解,用于事务管理(可以参考:<事务的全局控制及应用>).这里,主要是讲讲它的手动处理工具类 TranUtils. ...

  9. 树模型-label boosting-GBDT

    GBDT GBDT是boosting系列算法的代表之一,其核心是 梯度+提升+决策树. GBDT回归问题 通俗的理解: 先来个通俗理解:假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时 ...

  10. 面向切面编程AOP[一](java 代码详解)

    前言 说句实话,在工作中,使用的aop不是特别多,但是特别重要,一般是辅助程序,在现代开发者辅助程序相当重要,比如说我们需要打印一些log,但是我们不可能去卸载我们的业务程序中,因为这太..... 正 ...