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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【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 投票

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
4月前
|
Kubernetes 安全 Cloud Native
云原生|kubernetes|pod或容器的安全上下文配置解析
云原生|kubernetes|pod或容器的安全上下文配置解析
112 0
|
4月前
|
Kubernetes Perl 容器
kubernetes 的Job 的并行执行 配置
在Kubernetes中,Job是一种用于批处理任务的Controller对象。如果你想要配置Job以支持并行执行,可以使用Job的`.spec.parallelism`字段。这个字段定义了Job中可以并行运行的Pod的最大数量。 下面是一个简单的Job定义,其中包含了`.spec.parallelism`字段: ```yaml apiVersion: batch/v1 kind: Job metadata: name: example-job spec: parallelism: 3 # 这里定义了并行运行的Pod的数量 completions: 5 # 定义了成功完成的
|
4月前
|
域名解析 Kubernetes 网络协议
k8s教程(service篇)-pod的dns域名
k8s教程(service篇)-pod的dns域名
498 0
|
4月前
|
Kubernetes Cloud Native 调度
云原生|kubernetes|CKA真题解析-------(1-5题)
云原生|kubernetes|CKA真题解析-------(1-5题)
283 0
|
1月前
|
Kubernetes Linux Docker
深度解析:Kubernetes 1.28.2集群安装过程中的关键步骤
本文旨在为读者提供一份详尽的Kubernetes 1.28.2集群安装指南,帮助您从零开始构建稳定、高效的Kubernetes集群。我们将从环境准备、软件安装、集群初始化到节点添加等各个环节进行逐步讲解,确保您能够顺利完成集群的搭建。
|
4月前
|
Kubernetes Cloud Native 安全
云原生|kubernetes|2022年底cks真题解析(11-16)
云原生|kubernetes|2022年底cks真题解析(11-16)
79 0
|
4月前
|
Kubernetes Cloud Native 安全
云原生|kubernetes|2022年底cks真题解析(1-10)
云原生|kubernetes|2022年底cks真题解析(1-10)
37 0
|
4月前
|
存储 Kubernetes Cloud Native
云原生|kubernetes|CKA真题解析-------(11-17题)
云原生|kubernetes|CKA真题解析-------(11-17题)
100 0
|
4月前
|
Kubernetes Cloud Native 固态存储
云原生|kubernetes|CKA真题解析-------(6-10题)
云原生|kubernetes|CKA真题解析-------(6-10题)
117 0
|
4月前
|
域名解析 缓存 Kubernetes
k8s教程(service篇)-Node本地DNS缓存
k8s教程(service篇)-Node本地DNS缓存
149 0
k8s教程(service篇)-Node本地DNS缓存

推荐镜像

更多