【K8S系列】深入解析Job(上))

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 【K8S系列】深入解析Job

1 基础介绍

1.1 概念介绍

在 Kubernetes 中,Job 是一种控制器用于在集群中运行一次性任务。Job 控制器会创建一个或多个 Pod,以运行指定的任务。

当任务完成后,Job 控制器将删除 Pod。

1.2 Job 的类型

在 Kubernetes 中,有两种类型的 Job:

  1. 单次 Job
  2. CronJob

1 单次 Job

单次 Job 用于运行一次性任务,例如在集群中运行一个批处理作业或者初始化数据库。

当任务完成后,Job 将自动终止。

特点:

  • 创建Pod运行特定任务,确保任务运行完成
  • 任务运行期间节点异常时会自动重新创建Pod
  • 支持并发创建Pod任务数和指定任务数

总之,单次 Job 是 Kubernetes 中用于运行一次性任务的一种控制器,通过简单的配置文件即可完成任务的运行和管理。

单次:

并发示意图:

2 CronJob

CronJob 类型的 Job 允许按照指定的时间表运行任务。

可以指定任务在每天、每周、每月或其他时间间隔内运行。CronJob 会创建一个 Job 来运行指定的任务,并在任务完成后终止该 Job。

特点:

  • 周期性:实现周期性计划任务
  • 调用Jobs控制器创建任务
  • CronJobs任务名称小于52个字符
  • 应用场景如:定期备份,周期性发送邮件


2 原理介绍

2.1 单次 Job实现原理

在 Kubernetes 中,单次 Job 的实现原理是通过控制器(Controller)的方式来实现的。控制器会监视 Kubernetes API 中的 Job 对象,并根据 Job 对象的定义创建、更新和删除 Pod

创建:创建 Job 时,控制器会根据 Job 对象的定义创建一个 Pod 模板。然后,控制器根据需要创建一个或多个 Pod 实例,并将 Pod 调度到集群中的节点上运行。

监视:在这个过程中,控制器会监视 Pod 的状态,并根据需要更新 Pod 或创建新的 Pod。当任务完成后,控制器会删除 Pod。

更新/删除:控制器还会监视 Job 的状态根据需要更新 Pod 或创建新的 Pod并更新 Job 对象的状态。例如,当任务完成后,控制器会将 Job 对象的状态设置为“完成”,控制器会删除 Pod。。

此外,控制器还支持一些选项,例如 backoffLimit、activeDeadlineSeconds、completions 和 parallelism。这些选项可以控制 Job 的行为,例如在任务失败后进行重试的次数。

总之,Kubernetes 单次 Job 的实现原理是通过控制器来实现的,控制器会根据 Job 对象的定义创建、更新和删除 Pod,并监视 Job 的状态。

这种方式使得 Kubernetes 可以方便地管理和运行一次性的任务。

2.2 CronJob 的实现原理

Kubernetes 中 CronJob 的实现原理大体上可以分为以下步骤:

创建 CronJob 对象。当创建一个 CronJob 对象时,Kubernetes API 服务器将存储 CronJob 的定义,并为其分配唯一的名称。

接收到任务触发时间。CronJob 控制器会定期检查 CronJob 对象的时间表以确定下一个任务的触发时间。当控制器检测到某个任务的触发时间已到达时,它将开始执行下一步操作。

创建 Job 对象。CronJob 控制器会根据 CronJob 对象的定义创建一个 Job 模板,并在需要的时候创建一个或多个 Job 实例。

创建 Pod 对象。在创建 Job 实例期间,CronJob 控制器会根据 Job 模板创建一个或多个 Pod 实例,并将它们调度到集群中的节点上运行。监视 Pod 状态。CronJob 控制器会监视 Pod 的状态,并根据需要更新 Pod 或创建新的 Pod。删除 Job 和 Pod 对象。一旦任务完成,CronJob 控制器会删除 Job 和 Pod 对象。如果 Job 是成功完成的,则 Pod 也将被删除。否则,控制器可根据需要重试任务。更新 CronJob 对象状态。CronJob 控制器会监视 Job 的状态,并更新 CronJob 对象的状态。例如,当 Job 完成后,控制器会将 CronJob 对象的状态设置为“最近一次成功运行的时间”和“最近一次运行的状态”。

3单次job使用案例

详细讲解如何使用k8s的Job控制器运行一次性任务的示例

3.1 创建一个容器镜像

首先,需要创建一个容器镜像,该镜像将包含要运行的任务。

例如,创建一个基于Ubuntu的镜像,并在其中安装Python和必要的依赖项。

Dockerfile示例:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y python3 python3-pip
COPY requirements.txt /app/
RUN pip3 install --no-cache-dir -r /app/requirements.txt
COPY main.py /app/
CMD ["python3", "/app/main.py"]

在该镜像中,安装了Python3和pip3,并将应用程序的依赖项安装到容器中。还将应用程序的主要代码复制到容器中,并使用CMD指令指定容器启动时要运行的命令。

3.2 创建一个k8s Job

接下来,需要创建一个k8s Job来运行刚刚创建的容器镜像。

可以使用kubectl命令行工具或编写Python代码来创建Job。在这里,将展示如何使用Python Kubernetes客户端API创建Job。

from kubernetes import client, config
# 加载k8s集群配置
config.load_kube_config()
# 创建k8s API客户端
api_client = client.BatchV1Api()
# 定义Job对象
job_name = "my-job"
job_namespace = "default"
job = client.V1Job()
job.metadata = client.V1ObjectMeta(name=job_name, namespace=job_namespace)
# 定义Job的Pod模板
pod_template = client.V1PodTemplateSpec()
pod_template.metadata = client.V1ObjectMeta(labels={"app": job_name})
container = client.V1Container(name="my-container", image="my-image:latest")
pod_template.spec = client.V1PodSpec(containers=[container])
# 定义Job的规范
job.spec = client.V1JobSpec(template=pod_template, backoff_limit=0, ttl_seconds_after_finished=600)
# 创建Job
api_client.create_namespaced_job(namespace=job_namespace, body=job)

在这个例子中,

  1. 加载配置:加载k8s集群的配置,并创建一个BatchV1Api对象来与k8s API进行交互。
  2. 定义Job:定义一个V1Job对象,设置其元数据(包括名称和命名空间)。
  3. 定义Pod:定义Job的Pod模板,其中包含一个容器,该容器将运行刚刚创建的容器镜像。
  4. 定义Job的规范:包括Pod模板和一些其他属性,例如backoff_limit和ttl_seconds_after_finished。
  5. 创建Job:使用API客户端创建该Job。

3.3 查看Job的状态

一旦Job被创建,k8s将自动创建一个Pod并在其中运行对应的容器镜像。

可以使用kubectl命令行工具或编写Python代码来查看Job的状态。

kubectl命令行示例:

$ kubectl get jobs
NAME      COMPLETIONS   DURATION   AGE
my-job    1/1           1s         5m1. $

Python代码示例:

from kubernetes import client, config
# 加载k8s集群配置
config.load_kube_config()
# 创建k8s API客户端
api_client = client.BatchV1Api()
# 获取Job状态
job_name = "my-job"
job_namespace = "default"
job = api_client.read_namespaced_job(name=job_name, namespace=job_namespace)
status = job.status
if status.succeeded == 1:
    print("Job completed successfully!")
else:
    print("Job failed or is still running.")1. f

在这个示例中,使用Python Kubernetes客户端API获取Job的状态。

首先读取Job对象,然后检查其状态属性以确定Job的状态

如果Job已成功完成,将打印一条消息表示它已成功完成。否则,将打印一条消息表示Job失败或仍在运行。

3.4 小结:

介绍了如何使用k8s的Job控制器运行一次性任务。首先创建了一个容器镜像,并在其中安装了必要的依赖项和我们要运行的任务。然后,使用Python Kubernetes客户端API创建了一个k8s Job,并检查了Job的状态以确定任务是否已成功完成。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
8天前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Job控制器单工作队列的串行方式
Kubernetes中的Job控制器用于管理一次性任务,确保任务完成后不再重启。本文介绍了Job的工作原理、运行方式及示例,包括创建Job、查看Job和Pod信息等步骤,并附有视频讲解。
|
3月前
|
Kubernetes API 调度
Kubernetes 架构解析:理解其核心组件
【8月更文第29天】Kubernetes(简称 K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用。它提供了一个可移植、可扩展的环境来运行分布式系统。本文将深入探讨 Kubernetes 的架构设计,包括其核心组件如何协同工作以实现这些功能。
325 0
|
11天前
|
运维 Kubernetes Cloud Native
Kubernetes云原生架构深度解析与实践指南####
本文深入探讨了Kubernetes作为领先的云原生应用编排平台,其设计理念、核心组件及高级特性。通过剖析Kubernetes的工作原理,结合具体案例分析,为读者呈现如何在实际项目中高效部署、管理和扩展容器化应用的策略与技巧。文章还涵盖了服务发现、负载均衡、配置管理、自动化伸缩等关键议题,旨在帮助开发者和运维人员掌握利用Kubernetes构建健壮、可伸缩的云原生生态系统的能力。 ####
|
8天前
|
Kubernetes 调度 容器
【赵渝强老师】K8s的Job控制器多工作队列的并行方式
Kubernetes Job 是一次性任务控制器,用于控制 Pod 中的容器执行特定任务。本文介绍了 Job 控制器的工作原理、运行方式及多工作队列并行执行的示例。示例中创建了 5 个作业,以 3 个队列并行执行,整个过程需 2 分钟。文中还提供了详细的 YAML 文件配置和执行命令。
|
9天前
|
存储 Kubernetes 调度
深度解析Kubernetes中的Pod生命周期管理
深度解析Kubernetes中的Pod生命周期管理
|
26天前
|
存储 Kubernetes 监控
深度解析Kubernetes在微服务架构中的应用与优化
【10月更文挑战第18天】深度解析Kubernetes在微服务架构中的应用与优化
97 0
|
3月前
|
Kubernetes 负载均衡 网络协议
在K8S中,DNS组件有什么特性?
在K8S中,DNS组件有什么特性?
|
3月前
|
存储 Kubernetes 网络协议
在K8s中,提供的DNS组件是什么?有什么特性?
在K8s中,提供的DNS组件是什么?有什么特性?
|
4月前
|
Kubernetes 负载均衡 Cloud Native
Kubernetes经典理论与核心概念解析
Kubernetes经典理论与核心概念解析
|
4月前
|
运维 Kubernetes Docker

推荐镜像

更多