【问题标题】:setting up multiple cronjob using helm使用 helm 设置多个 cronjob
【发布时间】:2021-09-14 16:30:48
【问题描述】:

我正在尝试使用相同的掌舵图部署多个 cronjob。我在下面的 values.yaml 文件中定义了 cronjobs。

cronjob:
  crons:
    "0":
    name: one-minute-cron
    schedule: "*/1 * * * *"
    "1":
    name: five-minute-cron
    schedule: "*/5 * * * *"

  metadata:
    namespace: "{{K8S_NS}}"
    creationTimestamp: null

  restartPolicy: OnFailure

  image:
    repository: "{{CI_REGISTRY_IMAGE}}/{{CI_COMMIT_REF_SLUG}}:{{CI_COMMIT_SHA}}.{{CI_PIPELINE_IID}}"
    pullPolicy: "Always"
    imagePullSecrets: git-image-pull-secret-cron
    restartPolicy: OnFailure

  resources:
    requests:
      cpu: 1.0
      memory: "128Mi"
    limits:
      cpu: 2.0
      memory: "192Mi"

下面是我的模板文件夹中的 cronjob.yaml 文件。

{{- range $job, $val := .Values.cronjob.crons }}
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  namespace: {{ $.Values.cronjob.metadata.namespace }}
spec:
  concurrencyPolicy: Allow
  failedJobsHistoryLimit: 1
  jobTemplate:
    metadata:
      creationTimestamp: {{ $.Values.cronjob.metadata.creationTimestamp }}
      name: {{ $.Values.cronjob.crons.name }}
    spec:
      template:
        metadata:
          creationTimestamp: {{ $.Values.cronjob.metadata.creationTimestamp }}
        spec:
          containers:
          - image: {{ $.Values.cronjob.image.repository }}
            imagePullPolicy: {{ $.Values.cronjob.image.pullPolicy }}
            name: {{ $.Values.cronjob.crons.name }}
            resources:
              requests:
                memory: {{ $.Values.cronjob.resources.requests.memory }}
                cpu: {{ $.Values.cronjob.resources.requests.cpu }}
              limits:
                memory: {{ $.Values.cronjob.resources.limits.memory }}
                cpu: {{ $.Values.cronjob.resources.limits.cpu }}

          dnsPolicy: ClusterFirst
          restartPolicy: {{ $.Values.cronjob.image.restartPolicy }}
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
          imagePullSecrets:
            - name: {{ $.Values.cronjob.image.imagePullSecrets }}
  schedule: {{ quote $.Values.cronjob.crons.schedule }}
  successfulJobsHistoryLimit: 3
  suspend: false
status: {}
---
{{- end }}

当我在 CICD 管道中运行它以在 gitlab 中进行部署时,它会抛出以下错误。

Error: UPGRADE FAILED: error validating "": error validating data: [ValidationError(CronJob.spec.jobTemplate.spec.template.spec.containers[0]): missing required field "name" in io.k8s.api.core.v1.Container, ValidationError(CronJob.spec): missing required field "schedule" in io.k8s.api.batch.v1beta1.CronJobSpec]

注意:我已经从 gitlab 复制了整个存储库,除了 gitlab 机密、模板等敏感信息。我也为此检查了其他博客,但它们都没有帮助这些 crons 工作。 Github repo 链接是here

【问题讨论】:

  • 您使用的是哪个 helm 版本 (helm version --short)?
  • 我的 helm 版本低于 helm 版本。 helm version --short v3.2.0+ge11b7ce
  • 您能否更详细地解释一下 CI/CD 究竟使用了哪个 helm 命令?我试图复制你的问题,但我得到了resource name may not be empty 的错误,所以我在metadata: 下添加了name: 字段,它似乎正在工作。根本不完全正确,因为 helm 没有迭代 cron.cronjobs 并且始终使用第一个值,但它仍然与您的问题不同。
  • 我也遇到资源名可能不为空的错误。 CI/CD 正在使用 helm upgrade 命令。此外,我无法遍历值文件中定义的这些 cron。我是这个掌舵部署的新手。我可以从命令行手动部署 crons。

标签: kubernetes cron kubernetes-helm


【解决方案1】:

首先, 我认为cronjob.crons 应该是一个数组。尝试将其更改为:

cronjob:
  crons:
    - id: "0"
      name: "one-minute-cron"
      schedule: "*/1 * * * *"
    - id: "1"
      name: five-minute-cron
      schedule: "*/5 * * * *"

然后您可以通过以下方式遍历“crons”:

{{- range $cron := .Values.cronjob.crons }}

然后您可以像这样访问“cron”字段:

...
imagePullPolicy: {{ $.Values.cronjob.image.pullPolicy }}
name: {{ $cron.name }}

【讨论】:

  • 嗨@cecunami,在进行了您建议的更改后,我遇到了错误helm.go:84: [debug] template: example-cron/templates/cronjob.yaml:37:22: executing "example-cron/templates/cronjob.yaml" at <$.Values.cronjob.crons.schedule>: can't evaluate field schedule in type interface {}
  • 嗨@ShaileshSutar,您应该使用:$cron.schedule 而不是:$.Values.cronjob.crons.schedule
  • 现在我收到以下错误 --> Error: template: example-cron/templates/cronjob.yaml:8:19: executing "example-cron/templates/cronjob.yaml" at <.Release.Name>: nil pointer evaluating interface {}.Name 道歉。不想激怒你。
  • @ShaileshSutar,你最终解决了这个问题吗?
  • @mario 目前我已经通过一种解决方法解决了这个问题。我在模板文件夹中创建了 2 个 cronjob.yaml 模板。基本上我在 cronjob-five-minutes.yaml 文件和 cronjob-one-minute.yaml 文件中硬编码了特定于作业的秘密。
猜你喜欢
  • 2021-09-13
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多