如何在K8s Job子Chart中读取父Chart Values.yaml的值
问题背景
执行helm upgrade -i offline-edge line-edge --version 1.0.0 -n line-edge -f values_dev.yaml时,子Chart edge-broker 的cleanup-job.yaml模板触发空指针错误:Error: UPGRADE FAILED: template: offline-edge/charts/edge-broker/templates/cleanup-job.yaml:6:20: executing "offline-edge/charts/edge-broker/templates/cleanup-job.yaml" at <$.Values.tags.mqtt>: nil pointer evaluating interface {}.mqtt。原因是直接访问嵌套的Values键时未处理上层键不存在的情况,且对Helm子Chart访问父Chart Values的机制理解有误。
核心原理
Helm 3中,子Chart模板内的$.Values指向全局Values集合,包含父Chart的Values、用户通过-f传入的配置,以及子Chart自身的Values(子Chart Values会覆盖父Chart同名键,未覆盖的顶层键可直接访问)。不存在$.Parent.Values这种内置对象,无需额外语法即可访问父Chart传递的Values。
修复方案
方案1:安全访问Values(推荐)
修改cleanup-job.yaml,使用index和default函数避免空指针,同时设置默认值:
apiVersion: batch/v1 kind: Job metadata: name: cleanup-job annotations: {{- # 安全获取tags.mqtt,默认值设为true }} {{- $mqttEnabled := default true (index $.Values.tags "mqtt" | default nil) }} {{- if and (not $mqttEnabled) .Release.IsUpgrade }} "helm.sh/hook": pre-upgrade, pre-delete {{- else }} "helm.sh/hook": pre-delete {{- end }}
方案2:修复Helper模板
若需保留Helper,调整helper.tpl确保空值场景返回默认值:
{{/* Helper to get tags.mqtt value, defaulting to true if not set */}} {{- define "values.tags.mqtt" -}} {{- $tags := default dict $.Values.tags }} {{- default true $tags.mqtt | quote }} {{- end }}
修改后的cleanup-job.yaml调用Helper:
apiVersion: batch/v1 kind: Job metadata: name: cleanup-job annotations: {{- $mqttEnabled := eq (include "values.tags.mqtt" .) "true" }} {{- if and (not $mqttEnabled) .Release.IsUpgrade }} "helm.sh/hook": pre-upgrade, pre-delete {{- else }} "helm.sh/hook": pre-delete {{- end }}
注意事项
- 禁止直接链式访问嵌套Values键(如
$.Values.tags.mqtt),必须通过index或条件判断处理上层键不存在的情况,避免空指针异常。 - 子Chart自身的Values.yaml中若定义了同名键(如
tags),会覆盖父Chart的对应配置,需确保子Chart未意外覆盖需要的父Chart Values。
内容的提问来源于stack exchange,提问作者james

