如何立即运行 kubernetes cronjob

Posted

技术标签:

【中文标题】如何立即运行 kubernetes cronjob【英文标题】:How to run kubernetes cronjob immediately 【发布时间】:2020-12-22 00:28:39 【问题描述】:

我对 kubernetes 很陌生,在这里我厌倦了一个 cronjob yaml,其中每 1 分钟创建一次 pod。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

但是 Pod 仅在 1 分钟后创建。是否可以立即运行作业,之后每 1 分钟运行一次?

【问题讨论】:

CronJob 由 Job 支持,你可以只运行一个 Job。见***.com/a/50041304 和kubernetes.io/docs/concepts/workloads/controllers/job @d4nyll .im 使用 kubectl create 命令。但它总是在指定分钟后启动 如果不清楚,您需要创建 CronJob以及从该 CronJob 派生的 Job。 【参考方案1】:

正如 cmets 中所述,CronJobJob 支持。您可以做的是同时使用相同的规范启动CronjobJob 资源。您可以使用helm chart or kustomize 方便地做到这一点。

或者,您可以将两个清单放在同一个文件中,或者将两个文件放在同一个目录中,然后使用:

kubectl apply -f <file/dir>

使用此解决方法,初始 Job 启动,然后在一段时间后启动 Cronjob。 这个解决方案的缺点是第一个 Job 是独立的,它不包含在 Cronjob 的历史记录中。另一个可能的副作用是如果Job 不能足够快地完成其任务,第一个Job 和第一个CronJob 可以并行运行。 concurrencyPolicy 不考虑 Job

来自文档:

一个 cron 作业大约每执行一次就创建一个作业对象 日程。我们说“约”是因为在某些情况下 可能会创建两个作业,也可能不会创建作业。我们试图 使这些变得罕见,但不要完全阻止它们。

因此,如果您想保持任务执行更严格,也许最好在任务执行之间使用带有 sleep 1 的 Bash 包装器脚本,或者设计一个在指定间隔后分叉子进程的应用程序,创建一个容器映像并运行它作为一个部署。

【讨论】:

以上是关于如何立即运行 kubernetes cronjob的主要内容,如果未能解决你的问题,请参考以下文章

Docker&Kubernetes ❀ Kubernetes集群Pod控制器 - Cronjob(CJ)

Docker&Kubernetes ❀ Kubernetes集群Pod控制器 - Cronjob(CJ)

19-Kubernetes-Pod控制器详解-CronJob(CJ)

Kubernetes 使用 CronJob 运行作业

云原生之kubernetes在kubernetes集群下的jobs与cronjobs管理

如何自动删除由 CronJob 创建的已完成 Kubernetes 作业?