Helm执行helm template时values.yaml转JSON失败,请求问题排查
针对你遇到的helm template报错,以下是几个常见的排查方向和解决方法:
检查values中目标字段是否存在/合法
如果.Values.containerBuilder.probes.livenessProbe未定义、值为null或者结构不完整,toYaml会输出空内容,直接插入到模板中会导致YAML语法错误。解决办法是给模板加条件判断,只在字段存在时渲染:containers: - name: app livenessProbe: {{- if .Values.containerBuilder.probes.livenessProbe }} {{- toYaml .Values.containerBuilder.probes.livenessProbe | nindent 6 }} {{- end }}同时确认
values.yaml中该字段的结构是合法YAML,比如:containerBuilder: probes: livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 30验证缩进层级匹配
nindent的数值要和模板上下文的缩进严格对应。比如模板中livenessProbe:已经缩进了6个空格(假设父级containers:是2个,- name: app是4个),那么nindent 6会给toYaml输出的每一行前面加6个空格,保证结构正确。如果上下文缩进变了,比如livenessProbe:是4个空格,那就要改成nindent 4。可以直接看helm template输出的错误行(line10),看生成的内容是否缩进错乱。清理多余空白字符
toYaml可能会输出多余的换行或空白,导致YAML解析失败。可以用trim过滤后再缩进:{{- toYaml .Values.containerBuilder.probes.livenessProbe | trim | nindent 6 }}直接调试生成的YAML
执行helm template . --debug,查看输出到line10的内容。如果该行是空的或者只有无效缩进,说明toYaml输出了空值;如果是格式错乱的内容,说明values里的字段本身有语法问题(比如用了tab而不是空格、引号不匹配)。可以用yamllint工具单独校验values.yaml的语法。
内容的提问来源于stack exchange,提问作者CJW

