【云原生】Kubernetes中的定时任务CronJob的详细用法与企业级应用案例分享

news2024/9/18 21:48:10

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:云原生K8S,零基础到进阶实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • CronJob
    • 引言
    • CronJob基本概念
    • CronJob的Cron表达式
    • CronJob的创建与管理
      • 1. 创建CronJob
      • 2. 查看CronJob
      • 3. 查看Pod日志
      • 4. 更新CronJob
      • 5. 删除CronJob
    • CronJob的并发策略
      • 并发策略示例
        • 1. Allow(默认)
        • 2. Forbid
        • 3. Replace
    • 实战案例:定时备份数据库
      • 1. 准备备份脚本
      • 2. 创建Docker镜像
      • 3. 定义CronJob
      • 4. 验证CronJob
    • CronJob 的高级应用
      • 1. 失败处理和重试
      • 2. 定时任务的优雅关闭
      • 3. 配置依赖和环境变量
      • 4. 监控和日志记录
      • 5. 版本控制和CI/CD
      • 6. 最佳实践

CronJob

引言

在现代的云原生应用中,定时任务是一个非常重要的组成部分。Kubernetes(简称k8s)提供了一种称为CronJob的机制,可以让我们方便地定义和管理定时任务。CronJob基于Cron表达式,允许在指定的时间间隔内自动运行容器化的任务,如定时备份、数据清理、定期报告等。本文将结合实际案例,详细介绍Kubernetes中CronJob的详细用法。

CronJob基本概念

CronJob是Kubernetes中的一种资源对象,用于定期执行任务。它基于Cron表达式,允许用户在指定的时间间隔内自动运行容器化的任务。CronJob的主要组成部分包括:

  • schedule:指定任务执行的时间表,使用标准的Cron表达式语法。
  • jobTemplate:定义要执行的任务的模板,通常是一个Pod模板,包含任务所需的容器镜像、命令、环境变量等配置。
  • concurrencyPolicy:指定任务并发策略,默认为Allow,表示允许并发执行任务。
  • successfulJobsHistoryLimit和failedJobsHistoryLimit:指定保留成功和失败任务历史记录的数量。

CronJob的Cron表达式

CronJob的Cron表达式由五个字段组成,分别代表分钟、小时、日、月、周几。每个字段可以使用单个数字、逗号分隔的数字列表、连续的数字范围、星号(*)或斜杠(/)来表示。

  • 单个数字:例如5表示第5分钟或5月份。
  • 逗号分隔的数字列表:例如5,15,25表示第5、15和25分钟。
  • 连续的数字范围:例如10-15表示从第10分钟到第15分钟。
  • 星号(*):表示匹配该字段的所有值。
  • 斜杠(/):表示步长值。

CronJob表达式示例:

  • 每小时执行:0 * * * *
  • 每天晚上10点执行:0 22 * * *
  • 每周一早上6点执行:0 6 * * 1
  • 每2分钟运行一次任务:*/2 * * * *

CronJob的创建与管理

1. 创建CronJob

在Kubernetes中,可以通过YAML文件定义CronJob资源,并使用kubectl apply命令创建。以下是一个CronJob的YAML文件示例:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello-cronjob
spec:
  schedule: "*/1 * * * *"  # 每分钟执行一次
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from CronJob
          restartPolicy: OnFailure

该YAML文件定义了一个名为hello-cronjob的CronJob,它每分钟执行一次,执行的任务是打印当前日期和时间,并输出"Hello from CronJob"。

使用kubectl apply命令创建CronJob:

kubectl apply -f hello-cronjob.yaml

2. 查看CronJob

创建CronJob后,可以使用kubectl get cronjob命令查看CronJob的状态:

kubectl get cronjob

输出示例:

NAME           SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello-cronjob  */1 * * * *   False     0        <none>          1m

3. 查看Pod日志

CronJob根据指定的时间表自动创建和调度Job对象,每个Job对象代表了一次任务的执行。可以使用kubectl get pods查看由CronJob创建的Pod:

kubectl get pods

找到对应的Pod后,使用kubectl logs命令查看Pod的日志:

kubectl logs <pod-name>

4. 更新CronJob

如果需要更新CronJob的配置,可以修改YAML文件并重新应用。但是,直接修改正在运行的CronJob的配置可能会导致不可预测的行为。建议的做法是删除旧的CronJob并创建新的。

5. 删除CronJob

使用kubectl delete命令删除CronJob:

kubectl delete cronjob hello-cronjob

CronJob的并发策略

CronJob的concurrencyPolicy字段指定了任务的并发策略,有三种可选值:

  • Allow(默认):允许并发执行任务。
  • Forbid:禁止并发执行任务,新任务将会被跳过。
  • Replace:如果
    存在之前的任务还在运行,则取消之前的任务并启动新任务。

并发策略示例

1. Allow(默认)

在默认情况下,如果CronJob的调度时间重叠,Kubernetes会允许所有任务并行执行。这适用于那些可以并行处理且互不影响的任务。

2. Forbid

如果你希望在同一时间内只有一个任务实例运行,可以将concurrencyPolicy设置为Forbid。当新的任务触发时,如果之前的任务还在运行,新任务将不会被创建。

修改CronJob YAML文件如下:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello-cronjob-forbid
spec:
  concurrencyPolicy: Forbid
  schedule: "*/2 * * * *"  # 每两分钟执行一次
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from CronJob with Forbid policy
          restartPolicy: OnFailure
3. Replace

在某些情况下,你可能希望新的任务能够取代正在运行的任务。这时,可以将concurrencyPolicy设置为Replace。当新的任务触发时,如果之前的任务还在运行,Kubernetes会取消之前的任务,并启动新任务。

修改CronJob YAML文件如下:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello-cronjob-replace
spec:
  concurrencyPolicy: Replace
  schedule: "*/3 * * * *"  # 每三分钟执行一次
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from CronJob with Replace policy
          restartPolicy: OnFailure

实战案例:定时备份数据库

假设你有一个运行在Kubernetes中的MySQL数据库,你需要每天凌晨1点自动备份数据库。以下是如何使用CronJob来实现这一需求的步骤。

1. 准备备份脚本

首先,你需要一个备份数据库的脚本。这里以Shell脚本为例,假设脚本名为backup-db.sh,内容如下:

#!/bin/bash
# 假设MySQL数据库的连接信息已经通过环境变量提供
mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASSWORD $DB_NAME > /backup/db-$(date +%Y%m%d%H%M%S).sql

2. 创建Docker镜像

接下来,你需要将这个脚本打包到一个Docker镜像中。创建一个Dockerfile,内容如下:

FROM busybox
COPY backup-db.sh /usr/local/bin/backup-db.sh
RUN chmod +x /usr/local/bin/backup-db.sh
ENTRYPOINT ["/usr/local/bin/backup-db.sh"]

构建并推送这个Docker镜像到你的镜像仓库。

3. 定义CronJob

最后,使用YAML文件定义CronJob,并在Kubernetes中创建它。假设你的Docker镜像名为my-db-backup:latest,CronJob的YAML文件可能如下所示:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: db-backup
spec:
  schedule: "0 1 * * *"  # 每天凌晨1点执行
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: db-backup
            image: my-db-backup:latest
            env:
            - name: DB_HOST
              value: "your-db-host"
            - name: DB_USER
              value: "your-db-user"
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-secret
                  key: password
            - name: DB_NAME
              value: "your-db-name"
            volumeMounts:
            - name: backup-volume
              mountPath: /backup
          volumes:
          - name: backup-volume
            persistentVolumeClaim:
              claimName: backup-pvc
          restartPolicy: Never

注意,在这个例子中,数据库密码是通过Kubernetes的Secret来管理的,而备份文件被存储在一个PersistentVolumeClaim(PVC)中。

使用kubectl apply命令将上面定义的CronJob YAML文件应用到Kubernetes集群中。首先,确保你的YAML文件(假设名为db-backup-cronjob.yaml)保存在你的本地机器上,并且你已经配置了kubectl以连接到你的Kubernetes集群。

然后,在命令行中运行以下命令:

kubectl apply -f db-backup-cronjob.yaml

这个命令会读取db-backup-cronjob.yaml文件,并将其中的CronJob定义应用到Kubernetes集群中。如果CronJob成功创建,你将看到一条消息,指出CronJob已被创建(例如,“cronjob.batch/db-backup created”)。

现在,CronJob会根据你指定的调度时间(在这个例子中是每天凌晨1点)自动触发。每次触发时,Kubernetes都会根据CronJob中的定义启动一个新的Job,该Job将执行你的备份脚本。

4. 验证CronJob

要验证CronJob是否按预期工作,你可以使用kubectl来检查CronJob的状态和相关的Job。

  • 查看CronJob的状态:

    kubectl get cronjobs
    

    这将列出集群中所有的CronJob,包括你的db-backup CronJob。检查它的SCHEDULESUSPENDACTIVE列,以确保它正在按预期运行。

  • 查看由CronJob创建的Job:

    CronJob每次触发都会创建一个新的Job。要查看这些Job,你可以使用以下命令:

    kubectl get jobs
    

    注意,由于Job在成功完成后可能会自动删除(取决于backoffLimitttlSecondsAfterFinished等设置),你可能需要查看稍早时间点的Job,或者调整你的CronJob和Job定义以保留旧的Job以供查看。

  • 查看Job的日志:

    如果你想要查看由特定Job执行的容器的日志,你可以使用以下命令(将<job-name>替换为实际的Job名称):

    kubectl logs <job-name>
    

    由于Job可能包含多个Pod(尽管在大多数情况下,CronJob触发的Job只会有一个Pod),你可能需要指定Pod的名称或使用其他选项来过滤日志。但是,在大多数情况下,CronJob触发的Job只有一个Pod,因此你可以直接使用上面的命令。

通过这些步骤,你可以验证你的CronJob是否按预期工作,并检查备份脚本是否成功执行。如果出现问题,你可以根据日志和Kubernetes事件来诊断问题,并相应地调整你的CronJob和Job定义。

当然,我们可以继续讨论关于Kubernetes CronJob的一些高级话题和最佳实践。

CronJob 的高级应用

1. 失败处理和重试

如果你的备份脚本或任何CronJob中的任务失败了,你可能想要配置重试策略。然而,CronJob 本身并不直接支持任务失败后的重试。但你可以通过配置 Job 的 backoffLimit 字段来实现一定程度的重试。backoffLimit 指定了Job失败后可以重试的次数。设置为0表示不重试。

spec:
  template:
    spec:
      restartPolicy: Never
      containers:
        ...
  backoffLimit: 4  # Job失败后最多重试4次

但是,请注意,这并不意味着CronJob会在下一个调度时间之前重试失败的Job。相反,它会在Job失败后立即尝试重新创建它,直到达到backoffLimit指定的次数。

2. 定时任务的优雅关闭

有时,你可能需要在CronJob的任务被终止之前执行一些清理操作,比如优雅地关闭数据库连接或释放资源。这可以通过在容器中运行一个前置脚本或命令来实现,该脚本或命令会在容器接收到终止信号时执行。

然而,CronJob 并不直接支持在任务被取消时执行特定的清理操作。但是,你可以通过在你的应用程序或脚本中监听SIGTERM信号来实现这一点。当Kubernetes决定终止Pod时,它会向Pod中的每个容器发送SIGTERM信号,然后等待一段指定的宽限期(默认为30秒),之后发送SIGKILL信号强制终止容器。

3. 配置依赖和环境变量

正如之前的示例所示,你可以通过环境变量将配置信息传递给CronJob中的容器。这包括数据库连接信息、API密钥、配置文件的路径等。确保这些信息以安全的方式存储和传递,例如使用Kubernetes的Secrets或ConfigMaps。

4. 监控和日志记录

监控CronJob的执行情况和日志记录是确保任务按预期运行的关键。你可以使用Kubernetes的日志收集工具(如Fluentd、Fluent Bit、Logstash等)将Pod日志发送到中央日志系统(如Elasticsearch、Splunk、Graylog等)。此外,你还可以使用Prometheus等监控工具来跟踪CronJob的性能指标,如任务执行时间、成功率和失败率。

5. 版本控制和CI/CD

将你的CronJob定义和相关的Docker镜像纳入版本控制系统(如Git)中,并使用持续集成/持续部署(CI/CD)管道来自动化构建、测试和部署过程。这有助于确保你的CronJob在每次更改后都能以可预测和可靠的方式运行。

6. 最佳实践

  • 使用Secrets和ConfigMaps来管理敏感信息和配置
  • 定期审查和更新CronJob的调度时间和任务逻辑
  • 监控CronJob的性能和日志,以快速识别和解决潜在问题
  • 确保CronJob中的任务能够优雅地处理终止信号和异常
  • 将CronJob定义纳入版本控制,并使用CI/CD管道来管理部署

通过遵循这些最佳实践,你可以确保你的Kubernetes CronJob能够稳定、可靠地运行,从而满足你的定时任务需求。

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

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

相关文章

皮尔逊(Person)相关系数

目录 一、总体和样本 二、总体皮尔逊相关系数 三、样本皮尔逊相关系数 四、皮尔逊相关系数的理解误区 五、总结 六、相关系数大小的解释&#xff08;并不严格&#xff09; 七、皮尔逊相关系数的计算 一、总体和样本 二、总体皮尔逊相关系数 三、样本皮尔逊相关系数 四、…

Java并发之ThreadLocal

1. 简介 ThreadLocal是 Java 中提供的一种用于实现线程局部变量的工具类。它允许每个线程都拥有自己的独立副本&#xff0c;从而实现线程隔离&#xff0c;用于解决多线程中共享对象的线程安全问题。 通常&#xff0c;我们会使用 synchronzed 关键字 或者 lock 来控制线程对临…

iPhone 手机如何查看自己的电话号码?这两种方法都可以

设置应用程序查看 第一种查看自己的电话号码的方法是在设置应用程序中的电话选项中查看当前手机的电话号码&#xff0c;下面是具体的操作步骤&#xff1a; 首先我们先打开设置应用程序&#xff0c;然后往下滑动找到电话选项&#xff0c;点击进入。 然后就可以看见界面中有“本…

【100个深度学习实战项目】目标检测、语义分割、目标追踪、图像分类等应有尽有,持续更新~~~

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 引言 本文主要介绍深度学习在各…

智能城市管理系统设计思路详解:集成InfluxDB、Grafana和MQTTx协议(代码示例)

引言 随着城市化进程的加快&#xff0c;城市管理面临越来越多的挑战。智能城市管理系统的出现&#xff0c;为城市的基础设施管理、资源优化和数据分析提供了现代化的解决方案。本文将详细介绍一个基于开源技术的智能城市管理系统&#xff0c;涵盖系统功能、技术实现、环境搭建…

【扒模块】DFF

图 医学图像分割任务 代码 import torch import torch.nn as nnfrom timm.models.layers import DropPath # 论文&#xff1a;D-Net&#xff1a;具有动态特征融合的动态大核&#xff0c;用于体积医学图像分割&#xff08;3D图像任务&#xff09; # https://arxiv.org/abs/2403…

[C#]基于wpf实现的一百多种音色的Midi键盘软件

键盘 音色库 源码地址&#xff1a;https://download.csdn.net/download/FL1623863129/89599322

前端必知必会-html表单的基本使用

文章目录 HTML 表单<form> 元素<input> 元素文本字段<label> 元素单选按钮复选框提交按钮<input> 的 Name 属性总结 HTML 表单 HTML 表单用于收集用户输入。用户输入通常发送到服务器进行处理。 <form> 元素 HTML <form> 元素用于创建 H…

无人机环保行业解决方案-河道自动巡检

搭配大疆机场&#xff0c;智能化巡检 轻量一体化设计 相较于其他市面产品&#xff0c;大疆机场更加小巧&#xff0c;占地面积不足1平方米。 展开状态&#xff1a;长1675 mm&#xff0c;宽895 mm&#xff0c;高530mm&#xff08;不含气象站&#xff09; 闭合状态&#xff1a;…

C++之引用(详解,引用与指针的区别)

目录 1. 引⽤的概念和定义 2. 引⽤的特性 3. 引⽤的使⽤ 4. const引⽤ 5. 指针和引⽤的关系 1. 引⽤的概念和定义 引⽤不是新定义⼀个变量&#xff0c;⽽是给已存在变量取了⼀个别名(相当于是给变量起了个外号)&#xff0c;编译器不会为引⽤变量开辟内存空间&#xff0c;它…

冷月大佬的EVA-GAN: 可扩展的音频生成GAN结构-论文阅读笔记

前言&#xff1a; 最近在调研asr和tts相关的内容&#xff0c;准备开始学习相关的经典工作&#xff0c;为了倒逼自己学进脑子&#xff0c;我尝试将这些看到的一些好的学习笔记分享出来。 萌新学徒&#xff0c;欢迎相关领域的朋友推荐学习路径和经典工作&#xff01;拜谢&#x…

idea 配置 Tomcat

一、状态栏找到 “ Preferences ” 二、 搜索栏输入“application”——>“Application Servers”——>“”号 三、 点击“Tomcat Sever” 四、 选择电脑中Tomcat所在位置——>OK 五、状态栏——>Run——>Edit Configurations 六、 点击&#xff1a;“ ”号 七…

对称密码体制的工作模式及标准解析

目录 1. 对称加密 2. 分组密码工作模式 2.1 ECB 2.2 CBC 2.3 CFB 2.4 OFB 2.5 CTR ​​​​​​​2.6 XTS 3. DES/3DES ​​​​​​​4. AES ​​​​​​​5. SM4 1. 对称加密 对称加密是一种发送方和接收方都使用相同密钥对数据进行加解密的方法。它只提供保密性…

Django的响应对象

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) Django的请…

支持向量机和梯度提升决策树

支持向量机&#xff08;SVM, Support Vector Machine&#xff09; 原理 支持向量机是一种监督学习模型&#xff0c;适用于分类和回归任务。SVM 的目标是找到一个能够最大化类别间间隔的超平面&#xff0c;以便更好地对数据进行分类。对于非线性数据&#xff0c;SVM 通过核技巧…

C语言程序设计17

程序设计17 问题17_1代码17_1结果17_1 问题17_2代码17_2结果17_2 问题17_3代码17_3结果17_3 问题17_1 下列给定程序的功能是 &#xff1a;调用函数 f u n fun fun 将指定源文件中的内容复制到指定的目标文件中&#xff0c;复制成功时函数返回 1 1 1 &#xff0c;失败时返回 …

Brant-2:开启脑信号分析新篇章的基础模型

人工智能咨询培训老师叶梓 转载标明出处 脑信号&#xff0c;包括通过侵入性或非侵入性方式收集的脑电图&#xff08;EEG&#xff09;和立体脑电图&#xff08;SEEG&#xff09;等生物测量信息&#xff0c;为我们理解大脑的生理功能和相关疾病的机制提供了宝贵的洞见。然而脑信号…

vue3+cesium创建地图

1.我这边使用的是cdn引入形式 比较简单的方式 不需要下载依赖 在项目文件的index.html引入 这样cesium就会挂载到window对象上面去了 <!-- 引入cesium-js文件 --><script src"https://cesium.com/downloads/cesiumjs/releases/1.111/Build/Cesium/Cesium.js"…

Java二十三种设计模式-外观模式(9/23)

外观模式&#xff1a;简化复杂系统的统一接口 引言 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供一个统一的高层接口。外观模式定义了一个可以与复杂子系统交互的简化接口&#xff0c;使得子系统更加易于使用…

科研绘图系列:R语言GWAS曼哈顿图(Manhattan plot)

介绍 曼哈顿图(Manhattan Plot)是一种常用于展示全基因组关联研究(Genome-Wide Association Study, GWAS)结果的图形。GWAS是一种研究方法,用于识别整个基因组中与特定疾病或性状相关的遗传变异。 特点: 染色体表示:曼哈顿图通常将每个染色体表示为一个水平条,染色体…