【问题标题】:Want to parameterize cronjob schedule on Kubernetes想要在 Kubernetes 上参数化 cronjob 调度
【发布时间】:2020-07-18 03:00:41
【问题描述】:

我有一个 yaml。我想参数化那个 kubernetes cronjob 的时间表。在环境文件中,我声明了 JobFrequencyInMinutes: "10"

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: scheduled-mongo-cronjob
spec:
  schedule: "*/$(JobFrequencyInMinutes) * * * *"
concurrencyPolicy: "Forbid"
jobTemplate:
spec:
   template:
     spec:
          containers:
          - name: scheduled-mongo-cronjob
            image: xxxx
          env:
          - name: JobFrequencyInMinutes
            valueFrom:
              configMapKeyRef:
                key: JobFrequencyInMinutes
                name: env-conf

当我应用上述 yaml 时出现错误。 CronJob“scheduled-mongo-cronjob”无效:spec.schedule:无效值:“*/$(JobFrequencyInMinutes)* * * *”:无法从$(JobFrequencyInMinutes)解析int:strconv.Atoi:解析“$( JobFrequencyInMinutes)": 无效语法

如果有其他方法可以实现这一点,请指导我。

【问题讨论】:

  • 我相信您的问题与括号有关。您能否尝试将日程表从 $(JobFrequencyInMinutes) 更改为 $JobFrequencyInMinutes 并告诉我是否可行?
  • 我得到了突出显示的错误。看起来问题在于将字符串转换为整数。但是 yaml 上的环境值强制声明为字符串。 CronJob“scheduled-mongo-cronjob”无效:spec.schedule:无效值:“*/$JobFrequencyInMinutes * * * *”:无法从 $Schedule 解析 int:strconv.Atoi:解析“$JobFrequencyInMinutes” : 无效语法
  • 看来是环境变量没有被使用,这是导致错误的原因,因为$JobFrequencyInMinutes不是一个INT...实际上似乎该值甚至没有被转换,否则你会得到“10”不是一个INT。您能否尝试运行以下命令来验证是否可以在那里使用环境变量? kubectl run hello --schedule="*/$JobFrequencyInMinutes * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"。如果它运行,你能得到结果:kubectl get cronjob hello 来验证计划吗?
  • 我现在收到了这个错误。 CronJob“hello”无效:spec.schedule:无效值:“*/ * * * *”:无法解析 int from :strconv.Atoi:解析“”:无效语法
  • 有道理,env 变量将仅在创建 CronJob 并在作业本身内部可用,但无法创建,因为变量 $JobFrequencyInMinutes 不存在于节点级别。我想说,为了实现你想要做的事情,你需要在集群 lvl 有一个环境变量,并在你想更新计划时更新它和作业。这对你有意义吗?

标签: kubernetes cron jobs schedule


【解决方案1】:

这里的问题是,环境变量仅在创建 CronJob 时可用,并且在作业本身内部可用,但无法创建,因为节点级别中不存在变量 $JobFrequencyInMinutes。

我想说,要实现您想要做的事情,您需要在集群级别拥有一个环境变量。每当您想更新您的日程安排时,您都需要为其设置一个新值,然后重新创建您的 CronJob。

虽然它的声明方式似乎不起作用(通过您的 YAML),所以您需要使用命令式方式创建:

kubectl run scheduled-mongo-cronjob --schedule="*/$JobFrequencyInMinutes * * * *" --restart=OnFailure --image=xxxx

【讨论】:

  • 感谢 Juliano 提出了一种传递变量的方法。我会在这上面多花点时间,看看是否有办法从 YAML 中做到这一点。如果我没有找到,我认为我最好的答案是你迄今为止的答案。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2021-11-08
  • 2019-09-13
  • 1970-01-01
  • 2020-12-16
  • 2020-11-20
  • 2021-07-19
  • 2020-11-06
相关资源
最近更新 更多