如何在kubernetes中每10秒运行一次cronjob?

如何在kubernetes中每10秒运行一次cronjob?,kubernetes,k8s-cronjobber,Kubernetes,K8s Cronjobber,“我只想每10秒在Kubernetes中运行一次cronjob。这需要什么命令?”运行时间少于1分钟不能使用cronjob Kubernetes对象。对于必须经常运行的流程,您可能使用了错误的工具 在部署上创建无限循环(对其进行守护) 您需要使用bash公式(或您最喜欢的任何编程语言,Go、Java、Python或Ruby)来进行无限循环,并在部署中每次执行时休眠10秒。下面是一个使用bash/sh的示例: apiVersion: apps/v1 kind: Deployment metadat

“我只想每10秒在Kubernetes中运行一次cronjob。这需要什么命令?”

运行时间少于1分钟不能使用cronjob Kubernetes对象。对于必须经常运行的流程,您可能使用了错误的工具

在部署上创建无限循环(对其进行守护) 您需要使用bash公式(或您最喜欢的任何编程语言,Go、Java、Python或Ruby)来进行无限循环,并在部署中每次执行时休眠10秒。下面是一个使用bash/sh的示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cronjob-deployment
  labels:
    app: cronjob
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cronjob
  template:
    metadata:
      labels:
        app: cronjob
    spec:
      containers:
      - name: cronjob
        image: busybox
        args:
        - /bin/sh
        - -c
        - while true; do echo call ./script.sh here; sleep 10; done
创建一个包含多个容器的CronJob 如果您仍然想使用CronJobs,可以在定义中使用6个容器。一个没有延迟,另一个有10、20、30、40和50秒的延迟

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: no_delay
            image: busybox
            args:
            - /bin/sh
            - -c
            - echo call ./script.sh here
          - name: 10_seconds
            image: busybox
            args:
            - /bin/sh
            - -c
            - sleep 10; echo call ./script.sh here
          - name: 20_seconds
            image: busybox
            args:
            - /bin/sh
            - -c
            - sleep 20; echo call ./script.sh here
          - name: 30_seconds
            image: busybox
            args:
            - /bin/sh
            - -c
            - sleep 30; echo call ./script.sh here
          - name: 40_seconds
            image: busybox
            args:
            - /bin/sh
            - -c
            - sleep 40; echo call ./script.sh here
          - name: 50_seconds
            image: busybox
            args:
            - /bin/sh
            - -c
            - sleep 50; echo call ./script.sh here
          restartPolicy: OnFailure

当然,您可能会遇到的问题之一是您的流程可能会重叠(同时并发运行)。这将取决于进程需要运行的秒数,以及kubernetes计划和创建容器所需的时间。

如果任务需要频繁运行,cron是工具


除了不会频繁启动作业这一事实之外,如果作业的运行时间比启动间隔长,您还可能面临一些严重问题。将任务重写为daemonize并持续运行,然后在必要时从cron启动它(同时确保如果它已经在运行,它不会重新启动)。

您可以编写一个脚本,以10秒的间隔执行6次。 并将Kubernetes cron作业设置为每分钟运行一次。 这样,脚本每分钟开始运行一次,然后每10秒执行一次任务

脚本,当cron作业在一分钟后执行时,每隔10秒运行逻辑6次

这将每隔10秒打印hello world 6次: #!/bin/bash-x a=0

直至[$a-燃气轮机5] 做 回声“你好,世界” a=
expr$a+1
睡眠10 完成

cronjob示例:

API版本:批次/v1beta1 种类:克朗乔 元数据: 姓名:你好 规格: 附表:“*/1****” 作业模板: 规格: 模板: 规格: 容器: -姓名:你好 图片: imagePullPolicy:如果不存在 命令: -/bin/sh --c -./sample.sh 重新启动策略:OnFailure ~

这样,cron作业每一分钟执行一次,然后启动srcipt,每10秒运行一次,执行business逻辑6分钟

这就是让cron作业在几秒钟内工作的想法,因为Kubernetes不能提供小于1分钟的调度值

尽管在这种方法中,您需要设置不与cron作业的下一次执行重叠的策略。 例如,如果您的业务逻辑需要15秒才能执行,并且每10秒运行一次业务逻辑,一分钟运行6次。
由于业务逻辑需要15秒,因此理想情况下,它应该在一分钟内运行4次而不是6次。因此,您需要调整脚本内部的重复。

应该提到的是,“pod”不会列为
CronJob
资源。我们可以做的是每分钟安排一个
CronJob
,并在这个
CronJob
中每10秒执行一个脚本,连续执行六次。谢谢@Turing85!用你的好主意更新答案。这或多或少类似于Daemoning。是的!它是。我将用似乎更正确的术语更新主要答案您的用例是什么?也许在您已经部署的应用程序中执行作业会更好。您已经尝试了什么?您可以制作一个在内部运行cron的无头应用程序,使用asp.net Core、Quartz和OpenShift对我来说运行良好。您可以为您的建议提供一个简单、具体的示例吗?答案已编辑,请检查。谢谢!请将bashshell脚本和yaml格式化,并用```字符括起来,好吗?