使用 CronJob 运行自动化任务

本页演示如何使用 Kubernetes CronJob 对象运行自动化任务。

准备开始

  • 你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

创建 CronJob

CronJob 需要一个配置文件。 以下是针对一个 CronJob 的清单,该 CronJob 每分钟运行一个简单的演示任务:

application/job/cronjob.yaml 使用 CronJob 运行自动化任务 - 图1

  1. apiVersion: batch/v1
  2. kind: CronJob
  3. metadata:
  4. name: hello
  5. spec:
  6. schedule: "* * * * *"
  7. jobTemplate:
  8. spec:
  9. template:
  10. spec:
  11. containers:
  12. - name: hello
  13. image: busybox:1.28
  14. imagePullPolicy: IfNotPresent
  15. command:
  16. - /bin/sh
  17. - -c
  18. - date; echo Hello from the Kubernetes cluster
  19. restartPolicy: OnFailure

执行以下命令以运行此 CronJob 示例:

  1. kubectl create -f https://k8s.io/examples/application/job/cronjob.yaml

输出类似于:

  1. cronjob.batch/hello created

创建好 CronJob 后,使用下面的命令来获取其状态:

  1. kubectl get cronjob hello

输出类似于:

  1. NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
  2. hello */1 * * * * False 0 <none> 10s

就像你从命令返回结果看到的那样,CronJob 还没有调度或执行任何任务。大约需要一分钟任务才能创建好。

  1. kubectl get jobs --watch

输出类似于:

  1. NAME COMPLETIONS DURATION AGE
  2. hello-4111706356 0/1 0s
  3. hello-4111706356 0/1 0s 0s
  4. hello-4111706356 1/1 5s 5s

现在你已经看到了一个运行中的任务被 “hello” CronJob 调度。 你可以停止监视这个任务,然后再次查看 CronJob 就能看到它调度任务:

  1. kubectl get cronjob hello

输出类似于:

  1. NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
  2. hello */1 * * * * False 0 50s 75s

你应该能看到 hello CronJob 在 LAST SCHEDULE 声明的时间点成功地调度了一次任务。 目前有 0 个活跃的任务,这意味着任务执行完毕或者执行失败。

现在,找到最后一次调度任务创建的 Pod 并查看一个 Pod 的标准输出。

说明: Job 名称与 Pod 名称不同。

  1. # 在你的系统上将 "hello-4111706356" 替换为 Job 名称
  2. pods=$(kubectl get pods --selector=job-name=hello-4111706356 --output=jsonpath={.items..metadata.name})

查看 Pod 日志:

  1. kubectl logs $pods

输出类似于:

  1. Fri Feb 22 11:02:09 UTC 2019
  2. Hello from the Kubernetes cluster

删除 CronJob

当你不再需要 CronJob 时,可以用 kubectl delete cronjob <cronjob name> 删掉它:

  1. kubectl delete cronjob hello

删除 CronJob 会清除它创建的所有任务和 Pod,并阻止它创建额外的任务。 你可以查阅垃圾收集