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)
在这个例子中,
- 加载k8s集群的配置,并创建一个BatchV1beta1Api对象来与k8s API进行交互。
- 定义一个V1beta1CronJob对象,设置其元数据(包括名称和命名空间)。
- 定义CronJob的Pod模板,其中包含一个容器,该容器将运行我们创建的容器镜像。
- 定义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文件中,
- 定义了一个名为"my-cronjob"的CronJob,并设置了其调度计划为每小时运行一次。
- 定义了作业模板,该模板包含一个Pod模板,其中包含一个容器,该容器将运行我们创建的容器镜像。
- 将重启策略设置为"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集群中。
- 首先加载k8s集群的配置,
- 然后使用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的使用场景:
- 在集群中定期运行任务,例如备份、数据清理等。
- 任务需要按照一定的调度计划运行。