Chart.yaml中使用Helm变量设置name字段报错,寻求解决方案
问题现象
想复用同一个Helm Chart目录部署不同的REST服务,大部分YAML文件里引用{{.Values.application.name}}都正常,但把Chart.yaml的name字段设为这个模板变量时,执行helm template会报错:
Error: cannot load Chart.yaml: error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{".Values.application.name":interface {}(nil)}
helm.go:84: [debug] error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{".Values.application.name":interface {}(nil)}
cannot load Chart.yaml
原因分析
Helm不支持在Chart.yaml中使用Go模板语法。因为Chart.yaml是Helm识别Chart元数据的核心文件,它的加载和解析顺序在模板渲染流程之前,所以Helm不会处理其中的模板变量。
解决方案
方案1:用helm的--name-template参数(推荐)
Helm 3.2及以上版本支持--name-template参数,可以动态生成release名称,完全不需要修改Chart.yaml。比如:
helm upgrade --install my-service ./helm-package --set application.name=my-service --name-template {{.Values.application.name}}
这样每个服务的release名称就是你设置的application.name,能直接区分不同的部署实例,Chart.yaml保持原样即可。
方案2:预替换Chart.yaml的占位符
如果一定要修改Chart.yaml的name字段,可以用sed在执行helm命令前替换占位符:
- 先把Chart.yaml的
name设为占位符:
--- apiVersion: v2 name: SERVICE_NAME description: A Helm chart for Kubernetes
- 执行替换命令:
sed -i "s|SERVICE_NAME|$SERVICE|g" helm-package/Chart.yaml
- 再执行helm部署:
helm upgrade --install $SERVICE ./helm-package --set application.name=$SERVICE
注意:这种方式会修改本地的Chart.yaml文件,多人协作时别把修改后的文件提交到版本库,或者每次执行前恢复原始文件。
内容的提问来源于stack exchange,提问作者Kanagavelu Sugumar

