4

“我只想在 Kubernetes 中每 10 秒运行一次 cronjob。对此的命令式命令是什么?”

4

3 回答 3

5

您不能使用 CronJob kubernetes 对象运行不到 1 分钟。对于必须经常运行的进程,您可能使用了错误的工具。https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/

在部署上创建一个无限循环(守护它)

您需要使用 bash 公式(或您最喜欢的任何编程语言,Go、Java、Python 或 Ruby)来进行无限循环,并在 Deployment 中每次执行时休眠 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

使用多个容器创建 1 个 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 需要调度和创建容器的时间。

于 2020-08-15T21:00:54.050 回答
4

如果您的任务需要频繁运行,那么 cron 是错误的工具。

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

于 2020-08-15T21:09:39.150 回答
1

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

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

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

直到 [ $a -gt 5 ] 做 echo "hello world" a= expr $a + 1 sleep 10 done

cronjob 示例:

apiVersion:batch/v1beta1 种类:CronJob 元数据:名称:hello 规范:计划:“*/1 * * * *” jobTemplate:规范:模板:规范:容器:-名称:hello 图像:imagePullPolicy:IfNotPresent 命令:-/bin /sh - -c - ./sample.sh restartPolicy: OnFailure ~

因此,以这种方式,您的 cron 作业每一分钟执行一次。依次启动您的 srcipt,该脚本每 10 秒运行一次,并执行 6 分钟的业务逻辑。

这是您可以在几秒钟内使 cron 作业工作的想法,因为 Kubernetes 不提供低于 1 分钟的调度值。

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

于 2021-04-11T17:04:42.687 回答