如何在GKE中正确地执行cron任务



使用应用程序引擎GAE,我们通常会有如下不同cron任务的yaml:

cron:
# Notifications Job
- description: "Remove Notifications Cron Weekly run"
url: /tasks/notifications
schedule: every monday 09:00
timezone: Australia/NSW
# Jobs job
- description: "Remove Deleted Jobs / completed"
url: /tasks/jobs/deleted_completed_drafts
schedule: every monday 09:00
timezone: Australia/NSW
# Marketplace job
- description: "Remove Deleted Products / soldout"
url: /tasks/products/deleted_soldout_drafts
schedule: every monday 09:00
timezone: Australia/NSW

我搬到了GKE,我还不知道如何从一个文件中运行上面的cron任务:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: Cron Task
spec:
schedule: "*/1 0 0 * * 0" #"*/1 * * * *"
startingDeadlineSeconds: 104444
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 1
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
containers:
- name: callout
image: gcr.io/my-site/mysite-kubernetes:v0.0.16
args:
- /bin/sh
- -ec
- curl https://www.ksite.com/tasks/notifications
restartPolicy: Never

那么,我该如何安排GKE Cron文件来容纳上述所有任务呢?我必须为每个不同的任务编写不同的代码吗?

时间表应为每周一09:00时区:澳大利亚/新南威尔士州。是时间表:"/1 0 0**0">这是正确的表述吗?

我是否必须指定映像,因为web部署脚本已经指定了映像?

我不太熟悉应用程序引擎,但

  • 所有CronJob时间表:根据文档,时间基于kube控制器管理器的时区
  • 你不需要你的应用程序图像来进行卷曲调用。卷曲的图像可能就足够了
  • 如果CronJob与应用程序在同一个集群中运行,则不需要检查负载均衡器,也可以使用类似http://service-name/tasks/notifications的服务
  • 写三个Cronjobs可能比把三个调用都塞进一个要好
kubernetes中的

CronJob使用标准Cron语法:

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │                                   7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>

因此,如果你想在每周一09:00运行你的工作,它应该如下所示:

┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of the month (1 - 31)
│ │ │ ┌───────────── month (1 - 12)
│ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
│ │ │ │ │                                   7 is also Sunday on some systems)
│ │ │ │ │
│ │ │ │ │
0 9 * * 1 <command to execute>

如果你的脚本与映像集成在一起,你就不需要使用curl来执行它。即使它不是映像的一部分,但它在你的节点上本地可用,你也可以考虑将其安装为卷,例如hostPath,这是安装位于kubernetes节点上的文件的最简单方法,这样它就可以用于你的pod。在这种情况下,您只需将脚本的完整路径作为命令:

args:
- /bin/sh
- -c
- /full/path/to/script.sh

否则,您可以使用任何包含curl的图像作为已经建议的user140547。

关于:

写三个Cronjobs可能比把所有的都塞进去要好三个电话合一。

我还强烈建议您使用3个单独的CronJobs,因为如果运行这些作业出现任何问题,这种方法要简单得多,也更容易进行故障排除。

最新更新