【云原生|K8S系列】如何创建Kubernetes job和Cronjobs 入门指南
本kubernetes教程解释了如何创建kubernetes作业和cronjobs,以及它的基础知识、用例和一些提示和技巧。

什么是Kubernetes Job?
Kubernetes job和cronjob是Kubernetes对象,主要用于短期和批处理工作负载。
kubernetes作业对象基本上部署了一个pod,但它是为了完成而运行的,而不是像deployment、replicasets、复制控制器和DaemonSets这样的对象,它们是持续运行的。
这意味着,作业将一直运行,直到作业中指定的任务完成,如果pods给出退出代码0,则作业将退出。该任务可以是shell脚本执行、API调用或执行数据转换并将其上传到云存储的java python执行。
然而,在正常的Kubernetes部署中,无论退出代码如何,部署对象都会在终止或抛出错误时创建新的pod,以保持部署所需的状态。
在作业运行期间,如果承载pod的节点失败,作业pod将自动重新调度到另一个节点。
Kubernetes Jobs和CronJobs用例
Kubernetes作业的最佳用例是:
-
批处理:假设您希望每天运行一次批处理任务,或者在特定的计划中运行一次。它可以是从存储或数据库中读取文件,并将其提供给服务以处理文件。
-
操作/特别任务:假设您想要运行运行数据库清理活动的脚本/代码,或者甚至备份kubernetes集群本身。
在我参与的一个项目中,我们将Kubernetes作业广泛用于ETL工作负载。
如何创建Kubernetes作业
在这个例子中,我将使用一个Ubuntu容器,它运行一个shell脚本,该脚本有一个for循环,根据您传递给容器的参数回显消息。参数应该是一个数字,决定循环运行的次数以回显消息。
例如,如果传递100作为参数,shell脚本将回显消息100次,容器将退出。
你可以在这里查看Dockerfile和shell脚本-> kube-job-example Docker configs
让我们从一个简单设置的作业开始。
步骤1:创建一个任务。使用我们自定义的Docker映像,以100作为命令参数。值100将作为参数传递给docker ENTRYPOINT脚本。
apiVersion: batch/v1
kind: Job
metadata: name: kubernetes-job-example labels: jobgroup: jobexample
spec: template: metadata: name: kubejob labels: jobgroup: jobexample spec: containers: - name: c image: devopscube/kubernetes-job-demo:latest args: ["100"] restartPolicy: OnFailure
步骤2:让我们使用kubectl创建一个Job.yaml文件。Job部署在默认名称空间中。
kubectl apply -f job.yaml
步骤3:使用kubectl获取Job的状态。
kubectl get jobs
步骤4:现在,使用kubectl获取pod列表。
kubectl get po
步骤5:您可以使用kubectl获取Job pod日志。将pod名称替换为您在输出中看到的pod名称。
kubectl logs kubernetes-job-example-bc7s9 -f
您应该看到如下所示的输出。

多个Job Pod和并行性
在部署作业时,您可以让它在多个具有并行性的pod上运行。
例如,在一个Job中,如果您希望并行运行6个pod和2个pod,则需要将以下两个参数添加到Job清单中。
completions: 6
parallelism: 2
completions: 6 指定 job 需要成功运行 Pods 的次数为 6
parallelism: 3 指定 job 并发运行 Pods 的数量为 3
下面是带有这些参数的清单文件。
apiVersion: batch/v1
kind: Job
metadata:name: kubernetes-parallel-joblabels:jobgroup: jobexample
spec:completions: 6parallelism: 2template:metadata:name: kubernetes-parallel-joblabels:jobgroup: jobexamplespec:containers:- name: cimage: devopscube/kubernetes-job-demo:latestargs: ["100"]restartPolicy: OnFailure
并行pod处理的一个用例是消息队列上的批处理操作。假设您有一个消息队列,其中在每天的特定时间要处理数千条消息。
您可以将消息处理代码作为具有并行性的Job运行,以加快处理速度。尽管所有pod使用相同的消息处理代码,但每个pod将处理来自队列的不同消息。
生成Kubernetes Job的随机名称
你不能使用单一的Job清单文件创建多个Job。Kubernetes 会抛出一个错误,指出已经存在同名的 Job。
为了解决这个问题,你可以在元数据中添加 generateName参数。
例如:
apiVersion: batch/v1
kind: Job
metadata:generateName: kube-job-labels:jobgroup: jobexample
在上述示例中,每次运行该清单时,都会创建一个名称以
kube-job-为前缀,后跟随机字符串的 Job。
如何创建 Kubernetes CronJob
如果你想在特定时间表上运行批处理任务,例如每两小时一次,你可以使用cron表达式创建一个Kubernetes CronJob。该任务将按照你在Job中指定的时间表自动启动。
以下是如何指定cron时间表。你可以使用crontab生成器来生成你自己的时间表。
schedule: "0,15,30,45 * * * *"
下图显示了 Kubernetes CronJob 的调度语法。

如果我们要将之前的Job作为CronJob每15分钟运行一次,可以使用以下清单。
创建一个名为cron-job.yaml的文件,并复制以下清单内容。
apiVersion: batch/v1beta1
kind: CronJob
metadata:name: kubernetes-cron-job
spec:schedule: "0,15,30,45 * * * *"jobTemplate:spec:template:metadata:labels:app: cron-batch-jobspec:restartPolicy: OnFailurecontainers:- name: kube-cron-jobimage: devopscube/kubernetes-job-demo:latestargs: ["100"]
让我们使用kubectl部署cronjob。
kubectl create -f cron-job.yaml
列出cronjob
kubectl get cronjobs
要检查Cronjob日志,您可以列出Cronjob pod,并从处于运行状态的pod或已完成的pod中获取日志。
手动运行Kubernetes CronJob
在某些情况下,您可能希望以临时方式执行cronjob。您可以通过从现有的cronjob创建一个作业来实现这一点。
例如,如果您希望手动触发cronjob,那么我们应该这样做。
kubectl create job --from=cronjob/kubernetes-cron-job manual-cron-job
--from=cronjob/kubernetes-cron-job将复制cronjob模板并创建一个名为manual-cron-job的作业
几个关键的Kubernetes Job参数
还有一些关键参数可以根据需要用于kubernetes Job/cronjobs。让我们各看一看。
-
failedJobHistoryLimit和successfulJobsHistoryLimit:根据您提供的保留数删除失败和成功的作业历史记录。当您尝试列出作业时,这对于减少所有失败的条目非常有用。例如:failedJobHistoryLimit: 5 successfulJobsHistoryLimit: 10 -
backoffLimit:如果您的pod失败,重试的总次数。 -
activedeadlinesseconds:如果您想要指定cronjob运行时间的硬限制,可以使用此参数。例如,如果您只想运行cronjob一分钟,则可以将其设置为60。
总结
Kubernetes Job和CronJob是处理批处理任务和周期性任务的强大工具。通过定义相应的YAML文件,并使用kubectl命令创建和管理这些任务,可以轻松实现复杂的任务调度和执行。希望这篇指南能帮助你快速上手Kubernetes Job和CronJob,提升你的容器编排能力。
相关文章:
【云原生|K8S系列】如何创建Kubernetes job和Cronjobs 入门指南
本kubernetes教程解释了如何创建kubernetes作业和cronjobs,以及它的基础知识、用例和一些提示和技巧。 什么是Kubernetes Job? Kubernetes job和cronjob是Kubernetes对象,主要用于短期和批处理工作负载。 kubernetes作业对象基本上部署了一个pod&…...
力扣每日一题 6/23 字符串/模拟
博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 520.检测大写字母【简单】 题目: 我们定义,在以下…...
Google trend搜索关键词
Google trend地址:https://trends.google.com/trends/?geoUS&hlzh-CN 1、具体的操作步骤如下: 2、Google trend搜索页面如下:...
Unity C#调用Android,IOS震动功能
最近在Unity上需要很原生移动端进行交互, 原理:新建一个android项目,把生成的app module给干掉,然后留下一个vibrationPlugin module,在这个module下写android震动代码,将这个android工程构建出来的 aar移…...
Ruby 注释
Ruby 注释 在编程中,注释是用于解释代码如何工作以及为什么这样编写的重要工具。Ruby作为一种解释型、面向对象的脚本语言,提供了灵活的注释方式,帮助开发者更好地组织和理解代码。本文将详细介绍Ruby中的注释类型、用法以及最佳实践。 Rub…...
C语言入门系列:特殊的main函数和exit函数
文章目录 一,main函数二,exit函数1,exit函数2,atexit()函数2.1 atexit函数的简介2.2 atexit注册的函数一定会被调用吗2.2.1 正常退出测试2.2.2 异常退出测试 一,main函数 一个C程序至少包含一个函数,这个函…...
JAVA复习3
目录 19. 下列关于 do…while 语句和 while 语句的叙述中错误的是( C ) 20. 若有定义 int a9, b6; System.out.println(a > b) 的结果是( D ) 21. 关于接口和抽象类,下列说法正确的是(A) …...
Oracle共享内存不释放
Oracle数据库使用共享内存来管理其系统全局区(SGA)和程序全局区(PGA)。当Oracle数据库的共享内存没有正确释放时,可能会导致数据库启动失败或性能问题。以下是一些可能的原因和解决方法: /dev/shm空间不足&…...
windows cmd中单引号和双引号的问题
文章目录 前言单引号和双引号的用法单引号双引号 示例对比Linux ShellWindows CMD PowerShell中的引号用法结论 前言 这个问题的起因是在windows cmd中运行一个简单的命令 node -e console.log(process)发现没有输出,但是进入node环境后,直接执行conso…...
Nacos 2.x 系列【15】数据源插件支持达梦、Oracel、PostgreSQL......
文章目录 1. 概述2. 持久层机制2.1 固定语句2.2 数据源插件 3. 案例演示3.1 编译已实现插件3.2 自定义插件3.3 数据库初始化3.4 插件引入3.4.1 方式一:引入到源码3.4.2 方式二:插件加载目录 3.5 修改配置3.6 测试 1. 概述 在实际项目开发中,…...
HJ39判断两个IP是否属于同一子网(中)
提示:文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 接上文HJ39判断两个IP是否属于同一子网 查了下,atoi可以转换负数。 修改成下面的代码 #include <stdio.h> #include <stdlib.h> #include <stdbool.h>bool isTargetSonN…...
渗透测试基础(二) Linux+Win常用命令介绍
1. Linux常用命令 1.1 解压缩相关 1.1.1 tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName1.1.2 gz命令 对于.gz格式的解压1:gunzip FileName.gz解压2:gzip -d FileName.gz压缩:gzip FileN…...
手机usb共享网络电脑没反应的方法
适用于win10电脑,安卓手机上可以 开启usb网络共享选择,如果选择后一直跳,让重复选择usb选项的话,就开启 开发者模式,进到 开发者模式 里设置 默认usb 共享网络 选项 ,就不会一直跳让你选。 1.先用数据线 连…...
Scrivener v3 解锁版安装教程 (写作辅助软件)
前言 Scrivener,一个多功能的写作软件,被世界各地的作家广泛采用,从小说家到剧本家,再到非小说类作家和学术研究者,它的用户群跨越了广泛的领域,包括学生、法律专业人士、记者和翻译。这个软件非常注重用户…...
Python开发——用什么数据储存结构复杂的数据
在Python中,当需要储存包含不同类型的数据时,可以使用以下几种数据结构: 1. 字典(dict) 字典是一种非常灵活的数据结构,允许使用键-值对来存储不同类型的数据。 data {"name": "Alice&quo…...
【0-1系列】从0-1快速了解搜索引擎Scope以及如何快速安装使用(下)
前言 近日,社区版家族正式发布V2024.5版本,其中,社区开发版系列重磅发布Scope开发版以及StellarDB开发版。 为了可以让大家更进一步了解产品,本系列文章从背景概念开始介绍,深入浅出的为读者介绍Scope的优势以及能力…...
前端核心框架Vue指令详解
目录 ▐ 关于Vue指令的介绍 ▐ v-text与v-html ▐ v-on ▐ v-model ▐ v-show与v-if ▐ v-bind ▐ v-for ▐ 前言:在学习Vue框架过程中,大家一定要多参考官方API ! Vue2官方网址https://v2.cn.vuejs.org/v2/guide/ ▐ 关于Vue指令的…...
SD卡无法读取?原因分析与数据恢复策略
一、SD卡无法读取的困境 SD卡作为便携式的存储介质,广泛应用于手机、相机、平板等多种电子设备中。然而,在使用过程中,我们可能会遭遇SD卡无法读取的困扰。当我们将SD卡插入设备时,设备无法识别SD卡,或者虽然识别了SD…...
线程池的工作原理
线程池可以减少创建和销毁线程的次数,从而减少系统资源的消耗。当一个任务(Runnable或Callable对象)(Runnable无返回值,Callable有返回值)被提交到线程池时: 一、首先判断核心线程池中的线程是…...
Nikto一键扫描Web服务器(KALI工具系列三十)
目录 1、KALI LINUX 简介 2、Nikto工具简介 3、信息收集 3.1 目标IP(服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描特定端口 4.3 保存扫描结果 4.4 指定保存格式 4.5 连接尝试 4.6 仅扫描文件上传 5、总结 1、KALI LINUX 简介 Kali Linux 是一…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
统计学(第8版)——统计抽样学习笔记(考试用)
一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征(均值、比率、总量)控制抽样误差与非抽样误差 解决的核心问题 在成本约束下,用少量样本准确推断总体特征量化估计结果的可靠性(置…...
