gpt4 book ai didi

kubernetes - 将动态格式化日期时间传递给 K8s 容器配置

转载 作者:行者123 更新时间:2023-12-02 11:36:55 24 4
gpt4 key购买 nike

我有一个 CronJob,它在 Kubernetes 的容器中运行一个进程。

此过程采用由 --since--until 标志定义的时间窗口。这个时间窗口需要在容器启动时间(当 cron 被触发时)定义,并且是当前时间的函数。运行此过程的示例是:

$ my-process --since=$(date -v -1H +"%Y-%m-%dT%H:%M:%SZ") --until=$(date -v +1H +"%Y-%m-%dT%H:%M:%SZ")

所以对于上面的例子,我希望时间窗口是从 1 小时前到 future 1 小时。 Kubernetes 中有没有一种方法可以将格式化的日期时间作为命令参数传递给进程?

我正在尝试做的一个例子是以下配置:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: my-process
spec:
schedule: "*/2 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: my-process
image: my-image
args:
- my-process
- --since=$(date -v -1H +"%Y-%m-%dT%H:%M:%SZ")
- --until=$(date -v +1H +"%Y-%m-%dT%H:%M:%SZ")

执行此操作时,将传入文字字符串 "$(date -v -1H +"%Y-%m-%dT%H:%M:%SZ")"作为 --since 标志。

这样的事情可能吗?如果可以,我该怎么做?

最佳答案

请注意,在您的 CronJob你不跑bash或任何其他外壳和 command substitution是一个 shell 特性,没有它是行不通的。在您的示例中,只有一个命令 my-process在容器中启动并且由于它不是 shell,因此无法执行 command substitution .

这个:

$ my-process --since=$(date -v -1H +"%Y-%m-%dT%H:%M:%SZ") --until=$(date -v +1H +"%Y-%m-%dT%H:%M:%SZ")

将正常工作,因为它是在 shell 中启动的所以它可以利用 shell 功能,例如提到的 command substitution

一件事:date -v -1H +"%Y-%m-%dT%H:%M:%SZ"bash shell 中未正确展开默认 GNU/Linux date执行。其中-v选项无法识别,所以我猜你在 MacOSX 上使用它或某种 BSD系统。在下面的示例中,我将使用适用于 Debian 的日期版本.

所以为了在 GNU/Linux 上测试它它将是这样的:

date --date='-1 hour' +"%Y-%m-%dT%H:%M:%SZ"

出于测试目的,我尝试使用来自 this 的简单 CronJob一些修改的示例:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: debian
env:
- name: FROM
value: $(date --date="-1 hour" +"%Y-%m-%dT%H:%M:%SZ")
- name: TILL
value: $(date --date="+1 hour" +"%Y-%m-%dT%H:%M:%SZ")
args:
- /bin/sh
- -c
- date; echo from $(FROM) till $(TILL)
restartPolicy: OnFailure

它工作正常。下面你可以看到 CronJob 的结果执行:

$ kubectl logs hello-1569947100-xmglq
Tue Oct 1 16:25:11 UTC 2019
from 2019-10-01T15:25:11Z till 2019-10-01T17:25:11Z

除了使用 environment variables 的示例我用下面的代码测试了它:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: debian
args:
- /bin/sh
- -c
- date; echo from $(date --date="-1 hour" +"%Y-%m-%dT%H:%M:%SZ") till $(date --date="+1 hour" +"%Y-%m-%dT%H:%M:%SZ")
restartPolicy: OnFailure

正如你在这里看到的command substitution也能正常工作:

$ kubectl logs hello-1569949680-fk782
Tue Oct 1 17:08:09 UTC 2019
from 2019-10-01T16:08:09Z till 2019-10-01T18:08:09Z

它工作正常,因为在这两个例子中首先我们产生bash shell在我们的容器中,随后它运行其他简单的命令 echo作为其参数提供。您可以使用您的 my-process命令而不是 echo只是您需要在一行中提供它及其所有参数,如下所示:

args:
- /bin/sh
- -c
- my-process --since=$(date -v -1H +"%Y-%m-%dT%H:%M:%SZ") --until=$(date -v +1H +"%Y-%m-%dT%H:%M:%SZ")

这个例子不会工作因为没有shell涉及。 echo不是 shell 的命令将无法执行命令替换,这是 shell 的一个特性:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: debian
args:
- /bin/echo
- from $(date --date="-1 hour" +"%Y-%m-%dT%H:%M:%SZ") till $(date --date="+1 hour" +"%Y-%m-%dT%H:%M:%SZ")
restartPolicy: OnFailure

结果将是一个文字字符串:

$ kubectl logs hello-1569951180-fvghz
from $(date --date="-1 hour" +"%Y-%m-%dT%H:%M:%SZ") till $(date --date="+1 hour" +"%Y-%m-%dT%H:%M:%SZ")

这与您的命令类似,例如 echo不是 shell它无法执行 command substitution .

总结一下:解决方案是将您的命令包装为 shell 参数。在前两个例子中 echo命令与其他命令一起作为 shell 参数传递。

也许在下面的示例中使用稍微不同的语法可以更清楚地看到它:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: debian
command: ["/bin/sh","-c"]
args: ["FROM=$(date --date='-1 hour' +'%Y-%m-%dT%H:%M:%SZ'); TILL=$(date --date='+1 hour' +'%Y-%m-%dT%H:%M:%SZ') ;echo from $FROM till $TILL"]
restartPolicy: OnFailure

man bash说:

-c If the -c option is present, then commands are read from the first non-option argument command_string.

所以 command: ["/bin/sh","-c"]基本上意味着运行一个 shell 并执行以下命令 然后我们使用 args 传递给它.在 bash命令应以分号分隔 ;因此它们是独立运行的(无论执行先前命令的结果如何,都会执行后续命令)。

在以下片段中:

args: ["FROM=$(date --date='-1 hour' +'%Y-%m-%dT%H:%M:%SZ'); TILL=$(date --date='+1 hour' +'%Y-%m-%dT%H:%M:%SZ') ;echo from $FROM till $TILL"]

我们提供给/bin/sh -c三个独立的命令:

FROM=$(date --date='-1 hour' +'%Y-%m-%dT%H:%M:%SZ')

设置FROM date --date='-1 hour' +'%Y-%m-%dT%H:%M:%SZ' 执行结果的环境变量命令,

TILL=$(date --date='+1 hour' +'%Y-%m-%dT%H:%M:%SZ')

设置TILL date --date='+1 hour' +'%Y-%m-%dT%H:%M:%SZ' 执行结果的环境变量命令

最后我们运行

echo from $FROM till $TILL

它使用两个变量。

可以用任何其他命令完成完全相同的操作。

关于kubernetes - 将动态格式化日期时间传递给 K8s 容器配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58186448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com