“我只想在 Kubernetes 中每 10 秒运行一次 cronjob。对此的命令式命令是什么?”
3 回答
您不能使用 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 需要调度和创建容器的时间。
如果您的任务需要频繁运行,那么 cron 是错误的工具。
除了它根本不会频繁启动作业这一事实之外,如果作业的运行时间比启动间隔时间长,您还会面临一些严重的问题。将您的任务重写为守护进程并持续运行,然后在必要时从 cron 启动它(同时确保如果它已经在运行,它不会重新启动)。
您可以编写一个脚本,以 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 次。因此,您需要调整脚本内的重复。