k8s之job和cronjob

news2025/1/11 14:57:53

写在前面

本文一起看下使用k8s来进行作业和定时作业。

1:k8s的业务类型

如果是按照业务类型来划分的话,可以分为离线业务在线业务,如下:

在线业务:容器启动之后就一直不退出的业务,如Nginx
离线业务:容器启动后执行一段时间就退出,如busybox
    job:提供容器单次运行的能力
    cronJob:提供容器多次运行的能力

busybox是一个集成了很多命令和工具的软件,进行了压缩,体积小,方便使用。

针对在线业务使用pod启动容器后,就在那里好好的运行就行了,但是对于离线业务,怎么办呢?pod只具备编排容器的能力,但并不具备以某种运行方式运行容器的能力,比如以某种固定的时间频率运行一组容器,那么我们能不能在pod原有功能的基础上对其改造让其具备这种能力呢?理论上是可以的,但是这就不符合面向对象的单一职责原则了,毕竟k8s的apiserver的请求处理方式也是按照面向对象的思想来封装的,这怎么办呢?我们知道,有一种设计模式叫做装饰模式 ,通过组合原有的对象,即将原有对象作为自己的成员变量,这样在使用其固有能力的同时,也可以增加自己需要的增强逻辑了,比如我们这里对于pod装饰,如果是Job,则装饰后的伪代码可能如下:

class Job {
    private Pod pod = new Pod();
    // 任务执行设置信息
    private JobSetting jobSetting = new JobSetting("任务设置信息");
    public void run() {
       // 满足job要求
       if (满足jobSetting要求) {
          // 通过pod编排容器,执行作业
          pod.orchestrationContainers();
       }
    }
}

现在pod在job的增强下已经能够按照某种设置来执行离线作业了,但是如果是想要实现cronJob又该怎么办呢?依然是如此,继续装饰job即可,如下伪代码:

class CronJob {
    private Job job = new Job();
    // 设置执行频率的对象
    private Cron cron = new Cron("*/1 * * * *");
    public void run() {
       while (true) {
          if (cron判断又该执行了) {
             // 通过job执行离线作业
             job.run();
          }
       }
    }
}

其实k8s也正是这么做的,接下来就一起看下。

2:Job

首先通过如下操作生成Job的yaml:

dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl create job echo-job --image=busybox $out
apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: echo-job
spec:
  template:
    metadata:
      creationTimestamp: null
    spec:
      containers:
      - image: busybox
        name: echo-job
        resources: {}
      restartPolicy: Never
status: {}

修改后最终如下:

apiVersion: batch/v1
kind: Job
metadata:
  name: echo-job

spec:
  template:
    spec:
      restartPolicy: OnFailure
      containers:
      - image: busybox
        name: echo-job
        imagePullPolicy: IfNotPresent
        command: ["/bin/echo"]
        args: ["hello", "world"]

然后创建job:

dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl apply -f job.yml
job.batch/echo-job created

查看pod(因为是对pod的装饰或增强,所以底层还是要创建pod的),如下可以获取job:

dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl get job
NAME       COMPLETIONS   DURATION   AGE
echo-job   1/1           15s        10m

其中COMPLETIONS是1/1说明作业已经完成了,DURATION作业持续时长是15s。当然也可以看其内部的pod,如下:

dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl get pod
NAME             READY   STATUS      RESTARTS   AGE
echo-job-rjq86   0/1     Completed   0          2m9s

可以看到pod的名字是echo-job-rjq86,是在job的name后自动增加了一个随机后缀,这样我们就不需要在yaml中配置了,降低使用的复杂度,另外READY是0/1,是因为这是一个离线任务,执行完毕后就结束了,如下可以看到job包装的pod中容器的输出信息:

dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl logs -c echo-job echo-job-rjq86 
hello world

我们在前面分析了job是对pod的装饰和增强,其实从yaml文件的结构也是可以看出来的,参考下图:

在这里插入图片描述

看到这里,你可能会想,job也不过如此,我直接用pod也可以实现,何必多此一举,但实际job能力远不止于此,它还提供了很多的配置参数,如下的几个:

activeDeadlineSeconds,设置 Pod 运行的超时时间。
backoffLimit,设置 Pod 的失败重试次数。
completions,Job 完成需要运行多少个 Pod,默认是 1 个。
parallelism,它与 completions 相关,表示允许并发运行的 Pod 数量,避免过多占用资源。

然后我们就可以将Job的参数设置成15秒超时,最多重试2次,总共需要运行完4个 Pod,但同一时刻最多并发2个Pod,yaml如下:


apiVersion: batch/v1
kind: Job
metadata:
  name: sleep-job

spec:
  activeDeadlineSeconds: 15
  backoffLimit: 2
  completions: 4
  parallelism: 2

  template:
    spec:
      restartPolicy: OnFailure
      containers:
      - image: busybox
        name: echo-job
        imagePullPolicy: IfNotPresent
        command:
          - sh
          - -c
          - sleep $(($RANDOM % 10 + 1)) && echo done

创建job:

dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl apply -f sleepjob.yml 
job.batch/sleep-job created

查看作业执行进度:

dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl get job
NAME        COMPLETIONS   DURATION   AGE
sleep-job   3/4           9s         9s
dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl get job
NAME        COMPLETIONS   DURATION   AGE
sleep-job   4/4           14s        14s

一共4个任务,最终变成4/4即所有的作业都完成了,如下也可以查看执行的进度:

dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl get pod -w
NAME              READY   STATUS      RESTARTS   AGE
sleep-job-6jdkh   1/1     Running     0          8s
sleep-job-cmwbm   0/1     Completed   0          8s
sleep-job-kgc9l   1/1     Running     0          4s
sleep-job-6jdkh   0/1     Completed   0          9s
sleep-job-6gd9l   0/1     Pending     0          0s
sleep-job-6gd9l   0/1     Pending     0          0s
sleep-job-6gd9l   0/1     ContainerCreating   0          0s
sleep-job-6jdkh   0/1     Completed           0          9s
sleep-job-6gd9l   1/1     Running             0          1s
sleep-job-kgc9l   0/1     Completed           0          9s
sleep-job-kgc9l   0/1     Completed           0          9s
sleep-job-6gd9l   1/1     Completed         0          6s

可以看到容器在不断的进行创建,运行,完成,这个其实就是job在根据我们的设置信息来不断的调用pod的功能的过程,这个不断的创建,运行,完成也正是job对pod装饰的内容。

3:CronJob

上面我们看了job,再看cronjob就容易多了,cronjob就是对job进行了进一步的装饰,增加了按照固定周期执行job的功能,如下生成cronjob对应的yaml:

dongyunqi@dongyunqi-virtual-machine:~/test$ export out="--dry-run=client -o yaml"              # 定义Shell变量
dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl create cj echo-cj --image=busybox --schedule="" $out
apiVersion: batch/v1
kind: CronJob
metadata:
  creationTimestamp: null
  name: echo-cj
spec:
  jobTemplate:
    metadata:
      creationTimestamp: null
      name: echo-cj
    spec:
      template:
        metadata:
          creationTimestamp: null
        spec:
          containers:
          - image: busybox
            name: echo-cj
            resources: {}
          restartPolicy: OnFailure
  schedule: ""
status: {}

修改完善后如下:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: echo-cj

spec:
  schedule: '*/1 * * * *'
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - image: busybox
            name: echo-cj
            imagePullPolicy: IfNotPresent
            command: ["/bin/echo"]
            args: ["hello", "world"]

主要增加了schedule表达式 用来设置job执行的频率,如下创建cronjob对象:

dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl apply -f cronjob.yml 
cronjob.batch/echo-cj created

这样就会按照每分钟一次的频率来执行作业了,如下查看生成的job和pod:

dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl get job
NAME               COMPLETIONS   DURATION   AGE
echo-cj-27884435   1/1           1s         2m4s
echo-cj-27884436   1/1           1s         64s
echo-cj-27884437   1/1           0s         4s
dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl get pod
NAME                     READY   STATUS      RESTARTS   AGE
echo-cj-27884435-j2mjg   0/1     Completed   0          2m8s
echo-cj-27884436-8fbxs   0/1     Completed   0          68s
echo-cj-27884437-5nqkc   0/1     Completed   0          8s

可以看到每个job都对应一个pod(通过pod名称前缀可以匹配到所属的job)。最后看下此时cronjob对job的装饰结构:

在这里插入图片描述

写在后面

小节

本文先分析了面向对象中的装饰设计模式,后又介绍了在线任务和离线任务,然后进行类比分别引出了job对pod的装饰,cronjob对job的装饰,并分别看了具体的例子,希望能帮助到你。

参考文章列表

cron任务表达式 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XSS-Game 通关教程,XSS-Game level1-18,XSS靶场通关教程

​ 「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」: 此文章已录入专栏 靶场通关教程 XSS-GameXSS-Game level1XSS-Game level2XSS-Game level3XSS-Game level4XSS-…

【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.15 绘制温度曲线

本节对应的视频讲解:B_站_视_频 https://www.bilibili.com/video/BV1L24y1Q7hc 前面已经讲解了 QPainter 绘图的基本使用 其中包括: 绘制图形 点、线、矩形、圆角矩形、椭圆、圆、圆弧、饼图、弦图、多段线、多边形、路径、文本、图片 画笔设置 线宽…

crawlergo联动xray漏洞挖掘

SRC漏洞挖掘 简介 SRC漏洞平台:安全应急响应中心(SRC, Security Response Center),是企业用于对外接收来自用户发现并报告的产品安全漏洞的站点。说白了,就是连接白帽子和企业的平台,你去合法提交漏洞给他…

研讨会回顾 | 中国企业在软件自动化测试方面的实践现状、挑战及趋势探讨

2022年12月6日,龙智与软件测试自动化“领导者”SmartBear联合举办了主题为“如何通过自动化测试实现降本、增效与提质”的在线研讨会。 此次研讨会中,龙智技术总监李毅为大家分享中国企业在质量和测试中面临的挑战,以及自动化测试实践的现状与…

关于 Serverless 应用架构对企业价值的一些思考

作者:寒斜 前言 对于企业方而言,最关心的核心诉求就是如何能获取更多的营收,更高的利润,通俗点说就是如何赚更多的钱;企业赚钱的方式主要是通过出售企业服务,当用户购买更多的企业服务,企业赚…

【Linux】vim的基本操作

这里写目录标题一、vim编辑器1、基本概念2、基本操作二、vim指令集1、命令模式命令集2、底行模式命令集一、vim编辑器 1、基本概念 vi和vim都是多模式的编辑器,vim是vi的升级版本,并且兼容vi的所以指令。 vim有多种模式,本文讲解常用的3种模…

c++入门(命名空间+缺省参数+函数重载)

文章目录1. 命名空间1. c语言的两个域2. 命名空间的使用1.类型问题命名空间A和B的实现2. 变量问题3.三种访问方法1.指定命名空间访问2. 全局展开using namespace std 的含义尽量不使用using namespace std的原因3. 部分展开2. 缺省参数(备胎)1. 概念2.全缺省参数3.半缺省参数错…

2023/1/6 Vue学习笔记-3-生命周期

1 引出生命周期 透明度变化的案例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&qu…

HTML实现动态旋转字母背景

演示 css html, body {background: radial-gradient(#181818, #000000);margin: 0;padding: 0;border: 0;-ms-overflow-style: none;}::-webkit-scrollbar {width: 0.5em;height: 0.5em;background-color: #c7c7c7;}/*定义滚动条轨道 内阴影圆角*/::-webkit-scrollbar-track {…

数据分析之数据相关性分析

相关性分析 作者&#xff1a;学者科技 时间&#xff1a;2022/12/25 应用场景 发现数据之间的关联性 比如 啤酒 和 尿布 删减统计指标 比如 城市里的温度传感器&#xff0c;相关性强的可以去掉以节约成本 挑选回归建模的变量 选择与因变量相关性高的自变量自变量间如果有高度…

数字漫画行业繁花似锦,国漫扎根本土文化“向外生长”?

2022年&#xff0c;一半是寒冰&#xff0c;一半是烈火。这一年&#xff0c;我们遇到了消费互联网的降温&#xff0c;包括互联网大厂降本增效潮到来&#xff0c;电商大促节不再公布销售额。同样&#xff0c;我们也见证了经济迸发的新活力&#xff0c;比如元宇宙、虚拟人掀起的热…

配置Domino解决CORS跨域问题

大家好&#xff0c;才是真的好。 前面我们讲过几篇Web应用开发的简单示例&#xff0c;主要功能是同一个站点的同一个应用里里面查看和搜索文档。如果对数据进行操作&#xff0c;可能多少会遇到网页跨域访问问题。 跨域&#xff0c;简单来说&#xff0c;就是浏览器对javascrip…

【知识图谱导论-浙大】第二章:知识图谱的表示

前文&#xff1a; 【知识图谱导论-浙大】第一章&#xff1a;知识图谱概论 本节内容的视频讲解如下&#xff1a; 【知识图谱理论】&#xff08;浙大2022知识图谱课程&#xff09;第二讲-知识图谱的表示什么是知识表示 简而言之&#xff0c;知识表示&#xff08;Knowledge Rep…

【HTML】纯CSS居然能做出这种效果,一款宝藏网页分享(超详细讲解 | 附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

【ASP.NET】家乡网站设计作业「历史」「人文」「自然」「美食」「高中」

文章目录作业描述结果展示代码MasterPage.master(母版页)首页历史页人文页美食页景观页高中页完整资源链接上学期其中ASP.NET网站设计老师布置的作业&#xff0c;在此记录一下&#xff1b;作业描述 为自己的家乡设计一个网站&#xff1a; 要求&#xff1a; 1.网站主要是展示和…

TYPE-C和USB-C接口有什么区别?

USB-C接口全称为USB Type-C&#xff0c;属于USB 3.0下一代接口&#xff0c;其亮点在于更加纤薄的设计、更快的传输速度&#xff08;最高可达10Gbps&#xff09;、更强的电力传输&#xff08;最高100W&#xff09;&#xff0c;此外USB-C接口还支持双面插入&#xff0c;正反面随便…

【NCC】之三:FFT(DFT)加速协方差的计算

FFT加速计算两个图的协方差文章目录<center> FFT加速计算两个图的协方差1. 傅里叶变换和卷积1.1 卷积定理1.2 空域卷积和频域乘积的复杂度2. opencv中的DFT3. FFT用于NCC4. 测试结果部分代码1. 傅里叶变换和卷积 1.1 卷积定理 图片来源 在空域上的卷积就是上面的动图所展…

再学C语言27:输入和输出——缓冲区

I/O函数&#xff1a;输入/输出函数 I/O函数将信息传输至程序并从程序中传出信息&#xff0c;如printf()、scanf()、getchar()、putchar()等函数 getchar()和putchar()每次输入/输出一个字符 示例代码&#xff1a; #include <stdio.h> int main(void) {char c;// 输入回…

Vivado综合设置之-resource_sharing

-​resource_sharing用于对算数运算&#xff08;加法、减法和乘法&#xff09;实现资源共享&#xff0c;以节约LUT资源&#xff0c;有3个值&#xff1a;auto、off和on&#xff0c;默认是auto。 默认情况下&#xff0c;将resource_sharing设置为auto即可。 本文验证-resource_…

[Leetcode] 将二叉搜索树变平衡

将二叉搜索树变平衡&#xff1a;https://leetcode.cn/problems/balance-a-binary-search-tree/给你一棵二叉搜索树&#xff0c;请你返回一棵 平衡后的二叉搜索树&#xff0c;新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法&#xff0c;请你返回任意一种。如果一…