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

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

4 CronJob

下面将详细讲解如何使用k8s的CronJob控制器运行定期任务的示例。会讲2种示例:

  • Python代码实现
  • yaml配置实现

4.1 Python代码实现

1 创建一个容器镜像

首先,和job一样,需要创建一个容器镜像,直接用上一个镜像吧。

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指令指定容器启动时要运行的命令。

2 创建k8s CronJob

接下来,需要创建一个k8s CronJob来运行刚刚的容器镜像。可以使用kubectl命令行工具或编写Python代码来创建CronJob。

在这里,将展示如何使用Python Kubernetes客户端API创建CronJob。

from kubernetes import client, config
# 加载k8s集群配置
config.load_kube_config()
# 创建k8s API客户端
api_client = client.BatchV1beta1Api()
# 定义CronJob对象
cron_job_name = "my-cronjob"
cron_job_namespace = "default"
cron_job = client.V1beta1CronJob()
cron_job.metadata = client.V1ObjectMeta(name=cron_job_name, namespace=cron_job_namespace)
# 定义CronJob的Pod模板
pod_template = client.V1PodTemplateSpec()
pod_template.metadata = client.V1ObjectMeta(labels={"app": cron_job_name})
container = client.V1Container(name="my-container", image="my-image:latest")
pod_template.spec = client.V1PodSpec(containers=[container])
# 定义CronJob的规范
cron_spec = client.V1beta1CronJobSpec(schedule="0 * * * *", job_template=client.V1beta1JobTemplateSpec(spec=pod_template))
cron_job.spec = cron_spec
# 创建CronJob
api_client.create_namespaced_cron_job(namespace=cron_job_namespace, body=cron_job)

在这个例子中,

  1. 加载k8s集群的配置,并创建一个BatchV1beta1Api对象来与k8s API进行交互。
  2. 定义一个V1beta1CronJob对象,设置其元数据(包括名称和命名空间)。
  3. 定义CronJob的Pod模板,其中包含一个容器,该容器将运行我们创建的容器镜像。
  4. 定义CronJob的规范,包括调度计划和作业模板规范。

在这个例子中,将CronJob调度计划设置为每小时运行一次。最后,使用API客户端创建该CronJob。

3 查看CronJob的状态

一旦CronJob被创建,k8s将按照定义的调度计划定期运行任务。可以使用kubectl命令行工具或编写Python代码来查看CronJob的状态。

kubectl命令行示例:

$ kubectl get cronjobs
NAME         SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
my-cronjob   0 * * * *   False     0        <none>          1h

Python Kubernetes客户端API示例:

from kubernetes import client, config
# 加载k8s集群配置
config.load_kube_config()
# 创建k8s API客户端
api_client = client.BatchV1beta1Api()
# 获取CronJob状态
cron_job_name = "my-cronjob"
cron_job_namespace = "default"
cron_job = api_client.read_namespaced_cron_job(name=cron_job_name, namespace=cron_job_namespace)
print(cron_job.status)

在这个例子中,使用API客户端读取CronJob的状态,并打印输出。

该状态包括:

  • 已运行的作业数
  • 最近一次运行的作业
  • 最近一次成功运行的作业

等信息。

4 小结:

上面,详细讲解了如何使用k8s的CronJob控制器运行定期任务的示例。创建了一个容器镜像,并使用Python Kubernetes客户端API创建了一个CronJob。最后,展示了如何使用kubectl命令行工具或Python Kubernetes客户端API查看CronJob的状态。

4.2 yaml配置实现

1 创建一个k8s CronJob

容器镜像就不创建了,直接用刚刚创建的那个dockerfile,接下来,讲解一下使用yaml文件来创建一个k8s CronJob,该文件将定义我们要运行的容器镜像、调度计划等参数。

apiVersion: batch/v1beta1
kind: CronJob #资源类型
metadata:
  name: my-cronjob
spec:
  schedule: "0 * * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            app: my-cronjob
        spec:
          containers:
          - name: my-container
            image: my-image:latest
            imagePullPolicy: Always
          restartPolicy: OnFailure

在这个yaml文件中,

  1. 定义了一个名为"my-cronjob"的CronJob,并设置了其调度计划为每小时运行一次
  2. 定义了作业模板,该模板包含一个Pod模板,其中包含一个容器,该容器将运行我们创建的容器镜像。
  3. 重启策略设置为"OnFailure",以便在作业失败时自动重新启动。

2 应用CronJob配置

定义好了CronJob的yaml文件,可以使用kubectl命令行工具或编写Python代码来将其应用到k8s集群中。

kubectl命令行示例:

$ kubectl apply -f my-cronjob.yaml

Python Kubernetes客户端API示例:

from kubernetes import client, config, utils
# 加载k8s集群配置
config.load_kube_config()
# 应用yaml文件
utils.create_from_yaml(client.BatchV1beta1Api(), "my-cronjob.yaml")

在这个例子中,使用Python Kubernetes客户端API将CronJob的yaml文件应用到k8s集群中。

  1. 首先加载k8s集群的配置,
  2. 然后使用create_from_yaml()方法将yaml文件的内容传递给API客户端,以创建CronJob。

3 查看CronJob的状态

CronJob被创建之后,k8s将按照定义的调度计划定期运行任务。可以:

  • 使用kubectl命令行工具
  • 编写Python代码

来查看CronJob的状态

kubectl命令行示例:

$ kubectl get cronjobs
NAME         SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
my-cronjob   0 * * * *   False     0        <none>          1m

Python Kubernetes客户端API示例:

from kubernetes import client, config
# 加载k8s集群配置
config.load_kube_config()
# 获取CronJob列表
api_instance = client.BatchV1beta1Api()
cronjobs = api_instance.list_namespaced_cron_job(namespace="default")
for cj in cronjobs.items:
    print(f"{cj.metadata.name}: {cj.status.active}")

在这个例子中,

使用Python Kubernetes客户端API来获取CronJob列表,并打印每个CronJob的名称和活动状态。

  • 如果活动状态为0,则表示该CronJob没有运行任务。
  • 否则,它将显示CronJob正在运行任务。

4 小结

这是一个简单的示例,演示了如何使用k8s的CronJob控制器在k8s集群中运行定期任务。通过定义一个容器镜像和一个k8s CronJob,可以轻松地设置和管理定期任务。

在实际应用中,可以根据需要设置更复杂的调度计划和容器镜像来运行不同类型的任务

5 总结

k8s中的Job和CronJob是两种不同的控制器类型,用于在k8s集群中运行任务。我们总结一下它们的技术总结和使用场景总结。

5.1 单次Job

Job是k8s中用于运行一次性任务的控制器类型。当需要在k8s集群中运行一次性任务时,可以使用Job来创建一个任务,例如批处理作业、数据导入等

Job控制器确保任务只运行一次,如果任务失败,则可以自动重新启动任务。

Job的使用场景:

  • 在集群中运行一次性任务,例如批处理作业、数据导入等。
  • 任务需要确保只运行一次,并且可以自动重新启动任务。

5.2 定期CronJob

CronJob是k8s中用于运行定期任务的控制器类型。当需要定期运行任务时,可以使用CronJob来创建一个计划任务,例如备份、数据清理等。CronJob控制器使用类似于Linux的cron系统的语法来定义调度计划,例如每小时、每天或每周运行任务。

CronJob的使用场景:

  • 在集群中定期运行任务,例如备份、数据清理等。
  • 任务需要按照一定的调度计划运行。

6 投票

相关实践学习
通过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

推荐镜像

更多