【云原生】k8s Job 执行一次性/批处理任务

news/2024/7/4 7:48:37 标签: kubernetes, 云原生, 数据库

文章目录

  • 前言
  • Job 是什么
  • Job 的一些使用场景
  • Job 控制器
  • Job Spec 格式定义
  • Job pod 自动清理
  • 暂停和重启 Job
  • 案例讲解
  • 使用 Job 的注意事项
  • 总结

前言

Job 类型是 Kubernetes 资源对象之一,用于执行一次性任务或批处理作业。

本文将介绍 Kubernetes 的 Job 与相关概念,帮助理解和使用 Kubernetes 中的 Job。

Job 是什么

  • Job 是一种 Kubernetes 资源对象,用于执行一次性任务或批处理作业。

  • Job 可以控制 Pod 的数量,确保一定数量的 Pod 成功完成任务后停止并完成作业。

  • 在 Kubernetes 中,Job 类型通常用于数据处理、备份和恢复操作等场景。

Job 的一些使用场景

  • 数据导出和转换:例如从数据库中导出数据到 CSV 文件、将图片转换为缩略图等。
  • 日志打包和压缩:例如按时间段打包日志文件、将多个日志文件压缩成一个文件等。
  • 备份和恢复操作:例如备份数据库、配置文件等,并将其存储到云存储服务中以便后续恢复。
  • Batch 任务:例如根据输入参数计算机器学习模型的特征向量、数据预处理等。

Job 控制器

在这里插入图片描述

  • Job 控制器是 Kubernetes 中的一个组件,可以监视 Job 对象的状态,并根据需要启动或停止 Pod。

  • Job 控制器接受用户提交的 Job Spec,根据其定义的规则创建一定数量的 Pod,确保它们能够执行指定的任务。

  • 当所有 Pod 都成功完成任务后,Job 控制器会停止 Pod 并标记 Job 为已完成。

Job Spec 格式定义

Job Spec 定义了 Job 对象的规格,包括任务名称、镜像、命令、参数等信息。以下是一个示例 Job Spec:

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  template:
    spec:
      containers:
        - name: example-container
          image: example-image
          command: ["echo", "Hello, Kubernetes!"]
      restartPolicy: Never

在上述示例中,Job 名称为 example-job,使用了一个名为 example-container 的容器,它运行了一个名为 echo 的命令和参数 Hello, Kubernetes!。该容器将从名为 example-image 的镜像中获取。

Job pod 自动清理

在 Kubernetes 中,Job 控制器可以自动清理已完成的 Pod。
默认情况下,Job 控制器会在 Pod 成功完成任务并退出后自动删除 Pod。
如果 Pod 失败,则控制器将根据重试限制进行重试,并在达到最大限制后删除 Pod。

暂停和重启 Job

Job 对象支持暂停和继续操作。通过修改 Job Spec 中的 .spec.suspend 字段可以实现暂停 Job,例如:

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  suspend: true
  template:
    spec:
      containers:
        - name: example-container
          image: example-image
          command: ["echo", "Hello, Kubernetes!"]
      restartPolicy: Never

在上述示例中,将 .spec.suspend 设为 true 可以暂停 Job 执行。用户可以在需要时再次将其设置为 false,恢复 Job 的执行。

另外,用户也可以通过 kubectl 命令行工具来手动暂停和恢复 Job 的执行。例如,要暂停一个名为 example-job 的 Job,可以运行以下命令:

$ kubectl rollout pause job/example-job

注意:在暂停 Job 后,Job 将不会启动新的 Pod 或继续未完成的任务。

案例讲解

为了更好地理解 Kubernetes Job 资源对象,我们将通过一个实际案例来演示其用法。

假设有一个应用程序需要从数据库中导出一定数量的数据,并将其转换为 CSV 文件。由于该操作比较耗时,因此需要使用 Job 对象来执行此任务。

首先,我们需要定义一个 Job Spec,包括容器镜像、命令及其参数等信息。以下是一个示例 Job Spec:

apiVersion: batch/v1
kind: Job
metadata:
  name: export-data-job
spec:
  template:
    spec:
      containers:
        - name: export-data-container
          image: database-exporter:v1.0
          command: ["./export.sh"]
          args: ["--count=1000", "--output=exported_data.csv"]
      restartPolicy: Never

在上述示例中,我们定义了一个名为 export-data-job 的 Job,使用了一个名为 export-data-container 的容器。

该容器基于镜像 database-exporter:v1.0,并运行了一个名为 export.sh 的脚本文件。该脚本将按照参数 --count 指定的数量从数据库中导出数据,并将其存储为参数 --output 指定的 CSV 文件。

接下来,我们可以使用 kubectl apply 命令提交该 Job Spec,例如:

$ kubectl apply -f export-data-job.yaml

Kubernetes 将根据该 Spec 创建一个 Job 对象,并启动一个或多个 Pod 执行任务。Job 控制器将监视这些 Pod 的状态,并在所有 Pod 成功完成操作后停止它们。

使用 Job 的注意事项

在使用 Kubernetes Job 时,需要注意以下几点:

  1. Job 对象适用于一次性任务或批处理作业,不适用于长时间运行的服务。
  2. 需要确保 Job Spec 中定义的容器可以正常运行,并有足够的资源和权限执行指定的操作。
  3. 在设计 Job 时,应考虑 Pod 失败和重试的情况,并设置合适的重试次数和间隔时间。
  4. 如果 Job 执行时间过长,需要设置合适的 Pod 生命周期以避免过度消耗资源。
  5. 在使用 Job 控制器时,应确保控制器的版本和 Kubernetes 版本兼容。在不同版本之间可能存在语法变更和行为差异。

总结

本文介绍了 Kubernetes 中的 Job 资源对象及其相关概念,包括 Job 类型、Job 控制器、Job Spec 格式、Job pod 自动清理、暂停和重启等内容。

通过一个实际案例,我们演示了如何使用 Job 对象执行一次性任务或批处理作业。最后,我们列举了使用 Job 对象时需要注意的事项。


http://www.niftyadmin.cn/n/200759.html

相关文章

如何使用微服务架构?使用过程需要注意什么?

一、使用微服务架构的规范 1.1 服务拆分 微服务的服务拆分是根据业务领域和业务功能来划分的,目的是将复杂的单体应用程序分解为小型、自治的服务,每个服务都专注于处理一个特定的业务领域或功能。 以下是微服务拆分的一些常见策略: 领域…

头歌(Linux之进程管理一):第4关:进程终止

任务描述 在上一关我们学习使用vfork函数创建新进程,并且使用exit来结束子进程,本关我们将介绍Linux系统中结束进程的其它方法。 本关任务:学习终止进程的常见方法。 相关知识 在上一关以及看到,开发人员使用vfork创建出来的子…

七大排序算法

文章目录1. 冒泡排序2. 插入排序3. 希尔排序4. 选择排序5. 堆排序6. 快速排序7. 归并排序1. 冒泡排序 从 0 号下标开始遍历,相邻两个数相互比较,如果左边的数大于右边的数,执行交换操作,最终每一趟冒泡都会将一个最大的数移到最右…

微信小程序-注册app和page

微信小程序-注册app和page app 判断进入的场景 App({//小程序初始化完成时触发,全局只触发一次onLaunch(options){console.log(options);},//小程序启动,或从后台进入前台显示时触发onShow(options){// 判断小程序的进入场景console.log(onshow,optio…

【springboot】自动加载分析

文章目录问题SpringBootApplication注解AutoConfigurationPackages.Registrar类AutoConfigurationImportSelector类springboot如何加载其他的starter总结问题 为什么我们在使用springboot的时候,只需要在maven中导入starter就能够使用呢?这里来分析一下…

类的加载过程-过程二:Linking阶段

链接过程之验证阶段(Verification) 当类加载到系统后,就开始链接操作,验证是链接操作的第一步。 它的目的是保证加载的字节码是合法、合理并符合规范的。 验证的步骤比较复杂,实际要验证的项目也很繁多,大体上Java虚拟机需要做…

排序算法之不同版本的快速排序

快速排序思想:选取一个关键字,通过一趟排序将这些待排序的数据分隔为两个部分,一部分数据全小于关键字,一部分数据全大于关键字,通过一趟排序就可以将一个关键字排好序,然后再可以对这两部分执行相同类似的…

python提取多个pdf特定页,并合并为新pdf文件

文章目录1,代码结构2,代码详解2.1,将范围字符串转成list2.2,获取pdf文件特定页2.3,将pdf页list合并为pdf文件并保存2.4,遍历所有要合并的文件,进行合并2.5,给出要合并的pdf文件及范围…