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

简介: 【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 投票

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
缓存 Kubernetes Docker
GitLab Runner 全面解析:Kubernetes 环境下的应用
GitLab Runner 是 GitLab CI/CD 的核心组件,负责执行由 `.gitlab-ci.yml` 定义的任务。它支持多种执行方式(如 Shell、Docker、Kubernetes),可在不同环境中运行作业。本文详细介绍了 GitLab Runner 的基本概念、功能特点及使用方法,重点探讨了流水线缓存(以 Python 项目为例)和构建镜像的应用,特别是在 Kubernetes 环境中的配置与优化。通过合理配置缓存和镜像构建,能够显著提升 CI/CD 流水线的效率和可靠性,助力开发团队实现持续集成与交付的目标。
|
Kubernetes API 调度
Kubernetes 架构解析:理解其核心组件
【8月更文第29天】Kubernetes(简称 K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用。它提供了一个可移植、可扩展的环境来运行分布式系统。本文将深入探讨 Kubernetes 的架构设计,包括其核心组件如何协同工作以实现这些功能。
1229 3
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Job控制器单工作队列的串行方式
Kubernetes中的Job控制器用于管理一次性任务,确保任务完成后不再重启。本文介绍了Job的工作原理、运行方式及示例,包括创建Job、查看Job和Pod信息等步骤,并附有视频讲解。
273 0
|
Kubernetes 监控 API
深入解析Kubernetes及其在生产环境中的最佳实践
深入解析Kubernetes及其在生产环境中的最佳实践
909 93
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
4350 11
|
运维 Kubernetes Cloud Native
Kubernetes云原生架构深度解析与实践指南####
本文深入探讨了Kubernetes作为领先的云原生应用编排平台,其设计理念、核心组件及高级特性。通过剖析Kubernetes的工作原理,结合具体案例分析,为读者呈现如何在实际项目中高效部署、管理和扩展容器化应用的策略与技巧。文章还涵盖了服务发现、负载均衡、配置管理、自动化伸缩等关键议题,旨在帮助开发者和运维人员掌握利用Kubernetes构建健壮、可伸缩的云原生生态系统的能力。 ####
|
Kubernetes 调度 容器
【赵渝强老师】K8s的Job控制器多工作队列的并行方式
Kubernetes Job 是一次性任务控制器,用于控制 Pod 中的容器执行特定任务。本文介绍了 Job 控制器的工作原理、运行方式及多工作队列并行执行的示例。示例中创建了 5 个作业,以 3 个队列并行执行,整个过程需 2 分钟。文中还提供了详细的 YAML 文件配置和执行命令。
437 0
|
存储 Kubernetes 调度
深度解析Kubernetes中的Pod生命周期管理
深度解析Kubernetes中的Pod生命周期管理
|
存储 Kubernetes 监控
深度解析Kubernetes在微服务架构中的应用与优化
【10月更文挑战第18天】深度解析Kubernetes在微服务架构中的应用与优化
800 0
|
8月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
701 1

热门文章

最新文章

推荐镜像

更多