使用同一Helm Chart部署多个CronJob出现字段缺失验证错误如何解决
问题修复方案
根因分析
报错是由两个配置错误共同导致的:
- values.yaml中CronJob配置缩进错误,单个任务的
name、schedule字段没有归属到对应序号的子级,导致Helm无法正确读取任务配置 - 模板遍历任务列表时,错误引用全局配置路径,没有使用每次循环对应的单任务属性,导致渲染出来的
name、schedule字段为空,触发Kubernetes资源校验失败
第一步:修复values.yaml缩进
调整cronjob.crons下的配置缩进,确保每个任务的属性归属正确:
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"
第二步:修复templates/cronjob.yaml模板取值逻辑
遍历任务时使用循环变量$val读取当前单任务的属性,修复后的完整模板内容如下:
{{- range $job, $val := .Values.cronjob.crons }} apiVersion: batch/v1beta1 kind: CronJob metadata: namespace: {{ $.Values.cronjob.metadata.namespace }} # 补充CronJob自身的名称配置,避免资源重名 name: {{ $val.name }} spec: concurrencyPolicy: Allow failedJobsHistoryLimit: 1 jobTemplate: metadata: creationTimestamp: {{ $.Values.cronjob.metadata.creationTimestamp }} name: {{ $val.name }} spec: template: metadata: creationTimestamp: {{ $.Values.cronjob.metadata.creationTimestamp }} spec: containers: - image: {{ $.Values.cronjob.image.repository }} imagePullPolicy: {{ $.Values.cronjob.image.pullPolicy }} name: {{ $val.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 $val.schedule }} successfulJobsHistoryLimit: 3 suspend: false status: {} --- {{- end }}
核心修改点
- 将原模板中所有
{{ $.Values.cronjob.crons.name }}替换为{{ $val.name }},读取当前循环的单任务名称 - 将原模板中
{{ quote $.Values.cronjob.crons.schedule }}替换为{{ quote $val.schedule }},读取当前循环的单任务执行周期 - 补充CronJob资源自身的
metadata.name属性,避免多个CronJob重名冲突
可选优化
如果你的Kubernetes集群版本>=1.21,建议将apiVersion: batch/v1beta1替换为apiVersion: batch/v1,batch/v1beta1版本的CronJob已经在高版本Kubernetes中废弃。
内容的提问来源于stack exchange,提问作者Shailesh Sutar
相关产品推荐
相关产品推荐

