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

本文涉及的产品
云解析 DNS,旗舰版 1个月
容器镜像服务 ACR,镜像仓库100个 不限时长
全局流量管理 GTM,标准版 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的状态以确定任务是否已成功完成。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
存储 Kubernetes API
使用Kubernetes管理容器化应用的深度解析
【5月更文挑战第20天】本文深度解析Kubernetes在管理容器化应用中的作用。Kubernetes是一个开源平台,用于自动化部署、扩展和管理容器,提供API对象描述应用资源并维持其期望状态。核心组件包括负责集群控制的Master节点(含API Server、Scheduler、Controller Manager和Etcd)和运行Pod的工作节点Node(含Kubelet、Kube-Proxy和容器运行时环境)。
|
2月前
|
存储 数据采集 Kubernetes
一文详解K8s环境下Job类日志采集方案
本文介绍了K8s中Job和Cronjob控制器用于非常驻容器编排的场景,以及Job容器的特点:增删频率高、生命周期短和突发并发大。文章重点讨论了Job日志采集的关键考虑点,包括容器发现速度、开始采集延时和弹性支持,并对比了5种采集方案:DaemonSet采集、Sidecar采集、ECI采集、同容器采集和独立存储采集。对于短生命周期Job,建议使用Sidecar或ECI采集,通过调整参数确保数据完整性。对于突发大量Job,需要关注服务端资源限制和采集容器的资源调整。文章总结了不同场景下的推荐采集方案,并指出iLogtail和SLS未来可能的优化方向。
101 1
|
2月前
|
域名解析 Kubernetes 网络协议
【域名解析DNS专栏】云原生环境下的DNS服务:Kubernetes中的DNS解析
【5月更文挑战第29天】本文探讨了Kubernetes中的DNS解析机制,解释了DNS如何将服务名转换为网络地址,促进集群内服务通信。Kubernetes使用kube-dns或CoreDNS作为内置DNS服务器,每个Service自动分配Cluster IP和DNS条目。通过示例展示了创建Service和使用DNS访问的流程,并提出了优化DNS解析的策略,包括使用高性能DNS解析器、启用DNS缓存及监控日志,以实现更高效、可靠的DNS服务。
|
2月前
|
存储 弹性计算 Kubernetes
【阿里云云原生专栏】深入解析阿里云Kubernetes服务ACK:企业级容器编排实战
【5月更文挑战第20天】阿里云ACK是高性能的Kubernetes服务,基于开源Kubernetes并融合VPC、SLB等云资源。它提供强大的集群管理、无缝兼容Kubernetes API、弹性伸缩、安全隔离及监控日志功能。用户可通过控制台或kubectl轻松创建和部署应用,如Nginx。此外,ACK支持自动扩缩容、服务发现、负载均衡和持久化存储。多重安全保障和集成监控使其成为企业云原生环境的理想选择。
262 3
|
1月前
|
Kubernetes 应用服务中间件 API
Kubernetes关键组件解析
【6月更文挑战第12天】Kubernetes是一个用于管理容器集群的平台,由Master节点负责集群控制,而Node节点执行管理命令。
|
2月前
|
SQL Kubernetes 调度
【技术解析 | 实践】部署Kubernetes模式的Havenask集群
本次分享内容为havenask的kubernetes模式部署,由下面2个部分组成(部署Kubernetes模式Havenask集群、 Kubernetes模式相关问题排查),希望可以帮助大家更好了解和使用Havenask。
59663 9
|
2月前
|
Kubernetes 调度 异构计算
Kubernetes 调用 GPU解析
Kubernetes (K8s) 支持调用GPU以利用其统一调度和分配集群资源的能力,管理异构计算,如加速部署、提高资源使用率和保证资源独享。通过容器化和设备隔离,K8s确保GPU高效、安全地被应用使用。要调用GPU,需安装NVIDIA GPU驱动、CUDA工具包和Device Plugin,然后在Pod配置中指定GPU需求。安装步骤包括:确保GPU节点、安装GPU驱动和NVIDIA容器运行时、创建GPU资源要求的Pod并部署到集群。
|
2月前
|
Kubernetes 网络协议 应用服务中间件
K8s中Pod4中DNS解析策略
K8s中Pod4中DNS解析策略
70 1
|
2月前
|
运维 监控 Kubernetes
Kubernetes Pod深度解析:构建可靠微服务的秘密武器(下)
本文旨在全面而深入地探讨Kubernetes(K8s)中的Pod概念,为读者提供对其核心特性和应用场景的深入理解。Pod作为Kubernetes的最小部署单元,承载着容器化应用的核心功能,是构建云原生应用的重要基石。
|
2月前
|
Kubernetes Linux Docker
深度解析:Kubernetes 1.28.2集群安装过程中的关键步骤
本文旨在为读者提供一份详尽的Kubernetes 1.28.2集群安装指南,帮助您从零开始构建稳定、高效的Kubernetes集群。我们将从环境准备、软件安装、集群初始化到节点添加等各个环节进行逐步讲解,确保您能够顺利完成集群的搭建。

推荐镜像

更多