一、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. MacOS安装 JDK 及动态切换版本

    MacOS安装 JDK 及动态切换版本 JDK下载  我自己使用的是Mac m2系列.无所谓用的哪一种开源的OPEN JD,按需下载,我下载了8,11,17三个版本. 安装完成后,终端输入 java ...

  2. 替换Spring容器中已经存在的Bean

    一.背景 我们在开发的过程中,经常会引入别人写的jar包实现某些功能.而别人的jar包一般都自动注入Spring容器中,假设别人都是通过@Bean或@Component注入的,并且没有加入@Condi ...

  3. #并查集,单调栈#美团2018年CodeM大赛-决赛 C-Traffic

    题目 分析 首先如果枚举起点\(i\),点\(i\)到点\(j\)(i<j)的距离跳到点\(k\)(k<i)一定不优,所以可以先处理这种情况, 用单调栈维护\(dp\)单调递增,并且如果栈 ...

  4. #Tarjan,拓扑排序#洛谷 3436 [POI2006]PRO-Professor Szu

    题目 分析 考虑有向图缩点然后拓扑排序, 最恶心的地方是这题有自环, 一旦存在自环就意味着答案一定超过阈值 其实更难过的是Tarjan大小写写错没有发现qwq 代码 #include <cstd ...

  5. #莫比乌斯反演,整除分块,欧拉定理#U137539 虚伪的最小公倍数

    题目 \[\large\prod_{i_1=1}^n\prod_{i_2=1}^n\dots\prod_{i_k=1}^n\frac{i_1*i_2*\dots*i_k}{gcd(i_1,i_2,\d ...

  6. 开发人员使用HANA交付业务的学习路径

    本文于2019年7月22日完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 入门 编程规范. 开发环境使用方法. 基本语法,与其它同类软件的 ...

  7. 简单3步,OpenHarmony上跑起ArkUI分布式小游戏

    转自:OpenAtom OpenHarmony 在9月30日更新的 OpenHarmony3.0 LTS 上,标准系统新增支持了方舟开发框架(ArkUI).分布式组网和 FA 跨设备迁移能力等新特性, ...

  8. redis 简单整理——内存的管理[二十六]

    前言 redis 是一个内存型数据库,那么就需要重点关注一下内存了. 正文 理解Redis内存,首先需要掌握Redis内存消耗在哪些方面.有些内存消 耗是必不可少的,而有些可以通过参数调整和合理使用来 ...

  9. jenkins 持续集成和交付——pipeline(五)

    前言 整理一下pipeline. 正文 介绍 什么是pipeline呢? 根据前面的所得,我们知道,以前都是模板形式,但是如果有些复杂的项目,需要用更加自定义的写法,那么就有了pipeline,也就是 ...

  10. redis如何在保持读写分离+高可用的架构下,还能横向扩容支撑1T+海量数据

    单机redis在海量数据面前的瓶颈. 怎么才能够突破单机瓶颈,让redis支撑海量数据? redis集群架构 redis cluster 支撑N个redis master node,每个master ...