如何调试 Helm 图表错误,例如“将 YAML 转换为 JSON 时出错:yaml:在此上下文中不允许映射值”?

Posted

技术标签:

【中文标题】如何调试 Helm 图表错误,例如“将 YAML 转换为 JSON 时出错:yaml:在此上下文中不允许映射值”?【英文标题】:How to debug Helm chart errors like "error converting YAML to JSON: yaml: mapping values are not allowed in this context"? 【发布时间】:2020-04-21 04:19:01 【问题描述】:

我正在使用 Helm 3 和 microk8s。当我尝试试运行时:

microk8s.helm install <...> --dry-run --debug

我看到类似

的错误
Error: YAML parse error on ./templates/deployment.yaml: error converting YAML to JSON: yaml: mapping values are not allowed in this context
helm.go:76: [debug] error converting YAML to JSON: yaml: mapping values are not allowed in this context
YAML parse error on ./templates/deployment.yaml
helm.sh/helm/v3/pkg/releaseutil.(*manifestFile).sort
    /home/circleci/helm.sh/helm/pkg/releaseutil/manifest_sorter.go:129
helm.sh/helm/v3/pkg/releaseutil.SortManifests
    /home/circleci/helm.sh/helm/pkg/releaseutil/manifest_sorter.go:98
helm.sh/helm/v3/pkg/action.(*Configuration).renderResources
    /home/circleci/helm.sh/helm/pkg/action/install.go:455
helm.sh/helm/v3/pkg/action.(*Install).Run
    /home/circleci/helm.sh/helm/pkg/action/install.go:214
main.runInstall
...

我发现几个问题都有类似的错误,但答案通常只是要求阅读图表代码。我有一个大图表,需要自己调试这个错误。并且猜测它抱怨哪一行似乎没有意义。

有没有办法知道配置中到底出了什么问题?

【问题讨论】:

我遇到了这个问题。我没有解决方案,但有建议。我通过将模板恢复到我知道它可以工作的状态来解决它,然后慢慢地引入更多模板,直到它达到崩溃的程度。通过这样做,我能够确定 10 条麻烦的线。在这些行中有一个已重命名的变量,因此未定义。 这是一个很好的问题。 Helm 的 --debug 标志似乎更针对 Helm 开发人员调试 Helm 代码,而不是用户试图找出他们的图表的问题,正如@foxyblue 所描述的那样,使用试错法会很耗时。需要一种方法来查看无法转换为 JSON 的中间 YAML.... 我正在尝试的东西:一个模板,用于检查是否设置了已知的所需变量列表,以便快速明确失败,而不是在引用未设置值时有时会发生的晦涩难懂的失败. - define "assertions" - - range $key := (list "varName1" "varName2" "etc" ) - $ERRMSG := printf "ERROR: Missing required value for: .Values.%s" $key - $nop := required $ERRMSG (index $ $key) - end - end -在每个template.yaml文件的顶部使用:- template "assertions" .Values - 这是由于你的帮助文件的缩进问题。 【参考方案1】:

试试:helm template ... --debug &gt; foo.yaml

这会将渲染的图表输出到 foo.yaml(并将 helm 错误堆栈跟踪输出到 stderr)。然后从 helm 错误中找到有问题的模板文件名,并在渲染的图表中查看类似 # Source: the-template-name.yaml 的行。 YAML 到 JSON 的转换是针对每个 YAML 对象单独完成的,因此您可能有多个相同 # Source: the-template-name.yaml 的实例。

查看每个 # Source: ... 注释下方的 n 行是否有错误,其中 n 是 Helm 渲染报告的错误的行号。

【讨论】:

我刚刚发布了一个开源工具,可以直接在浏览器中调试此类模板问题:helm-playground.com

以上是关于如何调试 Helm 图表错误,例如“将 YAML 转换为 JSON 时出错:yaml:在此上下文中不允许映射值”?的主要内容,如果未能解决你的问题,请参考以下文章

在Gitlab CI中部署Helm图表时,如何将节点主机名修复太长时间

使用其他属性更新 helm 图表

K8s:通过 Helmify 实现将 YAML 文件 转化为 Helm Charts

K8s:通过 Helmify 实现将 YAML 文件 转化为 Helm Charts

K8s:通过 Helmify 实现将 YAML 文件 转化为 Helm Charts

K8s:通过 Helmify 实现将 YAML 文件 转化为 Helm Charts