在 k8s 中每分钟运行一次 cronjob 不起作用

Ray*_*n D 1 cron amazon-web-services kubernetes


 SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   * * * * *   False     2        2m42s           5m6s
hello   * * * * *   False   3     6s    5m30s
hello   * * * * *   False   4     6s    6m30s
hello   * * * * *   False   3     46s   7m10s
hello   * * * * *   False   1     56s   7m20s
hello   * * * * *   False   2     6s    7m30s
hello   * * * * *   False   0     26s   7m50s
hello   * * * * *   False   1     7s    8m31s
hello   * * * * *   False   0     16s   8m40s
hello   * * * * *   False   1     7s    9m31s
hello   * * * * *   False   0     17s   9m41s
hello   * * * * *   False   1     7s    10m


Run Code Online (Sandbox Code Playgroud)

我运行 K8S cronjob 并使用以下命令观看它

kubectl get cronjobs --watch -n ns1

观看输出时,我注意到每分钟有两项工作

例如,见2m1s2m11s 等等......

为什么 ?我想每分钟只运行一次,我该怎么做?

hello   * * * * *   False     0        <none>          4s
hello   * * * * *   False   1     7s    61s
hello   * * * * *   False   0     17s   71s
hello   * * * * *   False   1     7s    2m1s
hello   * * * * *   False   0     17s   2m11s
hello   * * * * *   False   1     7s    3m1s
hello   * * * * *   False   0     17s   3m11s
Run Code Online (Sandbox Code Playgroud)

这是docker文件

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
  namespace: monitoring
spec:
  schedule: "* * * * *" # run every minute
  startingDeadlineSeconds: 10 # if a job hasn't starting in this many seconds, skip
  concurrencyPolicy: Forbid # either allow|forbid|replace
  successfulJobsHistoryLimit: 3 # how many completed jobs should be
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: hello
              image: busybox
              args:
                - /bin/sh
                - -c
                - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
Run Code Online (Sandbox Code Playgroud)

我还尝试更改时间表"*/1 * * * *”,但没有帮助。

更新

似乎每个cronjob都有这样的条目

NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello             */1 * * * *                 False               1              0s            7s
Run Code Online (Sandbox Code Playgroud)

10秒后我看到

hello              */1 * * * *                 False              0              1 0s           17s
Run Code Online (Sandbox Code Playgroud)

等等......一个活跃,第二个不

Cro*_*rou 5

我认为你看错了。

CronJob正在生成 a Job,因此您应该查看作业日志:

$ kubectl get jobs
NAME               DESIRED   SUCCESSFUL   AGE
hello-1558019160   1         1            2m
hello-1558019220   1         1            1m
hello-1558019280   1         1            14s
Run Code Online (Sandbox Code Playgroud)

如您所见,每分钟只生成一个。这项工作可能需要更长的时间才能完成,这是concurrencyPolicy要玩的时候:

.spec.concurrencyPolicy 字段也是可选的。它指定如何处理此 cron 作业创建的作业的并发执行。规范可能仅指定以下并发策略之一:

  • Allow (默认):cron 作业允许并发运行作业
  • Forbid:cron 作业不允许并发运行;如果是运行新作业的时间,而上一个作业运行尚未完成,则 cron 作业将跳过新作业运行
  • Replace: 如果是运行新作业的时间,而上一个作业运行尚未完成,则 cron 作业将用新作业运行替换当前运行的作业运行

请注意,并发策略仅适用于同一 cron 作业创建的作业。如果有多个 cron 作业,则始终允许它们各自的作业并发运行。

您还可以执行以下操作kubectl describe jobs hello-1558019160,您将看到事件:

Events:
  Type    Reason            Age   From            Message
  ----    ------            ----  ----            -------
  Normal  SuccessfulCreate  2m    job-controller  Created pod: hello-1558019160-fld74
Run Code Online (Sandbox Code Playgroud)

我正在运行你的.yaml,并没有看到Active工作更高1

希望这可以帮助。