Helm根据云服务商切换镜像仓库时helm package执行报错
报错原因
核心触发原因的主因是对Helm的文件渲染逻辑理解错误:
- values.yaml 是纯静态值文件,不会执行Go Template语法渲染:Helm加载values.yaml的动作发生在模板渲染流程之前,解析阶段只会把文件内容当标准YAML处理,你在
repository字段后写的{{ tpl ... }}会被识别成非法的Map键,直接抛出YAML转JSON失败的错误。 - 额外存在三个隐性问题:
templates/_helpers.tpl中定义的cloud_provider模板语法错误,if/else块层级不匹配,required语句位置错误,即使修复values的问题也会触发渲染失败。- 原配置将模板逻辑存放在
config/repository.config中,额外增加了文件路径依赖,且如果后续打包时漏带该文件会直接触发.Files.Get读空错误,没有必要。 - 原values.yaml中
image.repository字段缩进错误,repository应该是image的子字段,需要缩进2空格。
修复方案
1. 修正values.yaml为纯静态值
删除values.yaml中的所有模板语法,仅保留静态配置,自动匹配的逻辑全部下沉到模板层:
configuration: system: mode: cloud_provider: aws image: # 可留空由模板自动匹配,也可填写自定义地址覆盖默认逻辑 repository: "" tag: v2.8.0 pullPolicy: IfNotPresent
2. 修复_helpers.tpl的模板逻辑
修正cloud_provider模板的语法错误,同时新增镜像仓库匹配的模板,去掉对外部config文件的依赖:
{{- define "cloud_provider" -}} {{- $provider := .Values.configuration.system.mode.cloud_provider | default "disabled" -}} {{- $valid_providers := list "aws" "aliyun" -}} {{- if not $provider -}} {{- required "Cloud provider required at .Values.configuration.system.mode.cloud_provider due to Google registry unreachable in China" $provider -}} {{- end -}} {{- if not (has $provider $valid_providers) -}} {{- fail "Invalid cloud provider set. Should be aws or aliyun" -}} {{- end -}} {{- $provider -}} {{- end -}} {{- define "image.repository" -}} {{- if .Values.image.repository -}} {{- .Values.image.repository -}} {{- else -}} {{- $provider := include "cloud_provider" . | trim -}} {{- if eq $provider "aliyun" -}} registry.cn-qingdao.aliyuncs.com/x/kube-state-metrics {{- else if eq $provider "aws" -}} k8s.gcr.io/kube-state-metrics/kube-state-metrics {{- end -}} {{- end -}} {{- end -}}
如果一定要保留
config/repository.config的文件存储方式,不要在values.yaml中调用tpl读取,直接在工作负载模板中调用即可,逻辑和上面的helper模板一致。
3. 在工作负载模板中引用镜像地址
在Deployment/StatefulSet等实际使用镜像的模板文件中,通过helper模板引用镜像地址,示例:
containers: - name: kube-state-metrics image: "{{ include "image.repository" . }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }}
修复后重新执行helm package即可正常打包,模板会根据values中配置的云服务商自动匹配对应的镜像仓库地址。
内容的提问来源于stack exchange,提问作者DisplayName
相关产品推荐
相关产品推荐

