如何通过Helm从目录批量生成Kubernetes ConfigMap
解决方案
你的Helm模板存在几个关键问题,导致无法生成符合要求的ConfigMap,以下是修正后的模板及问题说明:
原模板的问题
- 路径大小写不匹配:你的文件实际存放在
src/Data目录,但模板中使用src/data/*.json,Helm的文件匹配是大小写敏感的,因此无法找到目标文件 - 上下文丢失:
range循环会切换当前上下文到遍历的文件对象,此时直接使用.Release.Name会无法访问到发布名称 - 文件名处理不符合要求:原模板直接将文件名转小写但保留了
.json后缀,而你需要的是去掉后缀的小写文件名(比如adminMain.json要转为adminmain) - ConfigMap的data字段结构错误:你错误地将编码后的文件内容作为key,空字符串作为值,这完全不符合ConfigMap的data格式要求
修正后的模板
方式一:文件内容Base64编码存储
{{- $releaseName := .Release.Name }} {{- $files := .Files.Glob "src/Data/*.json" }} {{- range $file := $files }} apiVersion: v1 kind: ConfigMap metadata: name: {{ $releaseName }}-{{ trimSuffix ".json" (lower $file.Base) }}-configmap namespace: user-dev data: {{ $file.Base }}: {{ .Files.Get $file.Path | b64enc | quote }} {{- end }}
方式二:直接存储原始文本(适合无特殊字符的配置)
{{- $releaseName := .Release.Name }} {{- $files := .Files.Glob "src/Data/*.json" }} {{- range $file := $files }} apiVersion: v1 kind: ConfigMap metadata: name: {{ $releaseName }}-{{ trimSuffix ".json" (lower $file.Base) }}-configmap namespace: user-dev data: {{ $file.Base }}: |- {{ .Files.Get $file.Path }} {{- end }}
关键修正说明
- 提前将
.Release.Name存入变量$releaseName,确保在range循环内部仍能访问到发布名称 - 修正文件匹配路径为
src/Data/*.json,与实际目录结构一致 - 使用
trimSuffix ".json" (lower $file.Base)处理文件名:先将文件名转为小写,再去除.json后缀,生成符合要求的ConfigMap名称部分 - 调整data字段结构:以原始文件名作为key,文件内容(编码或原始文本)作为对应的值,符合Kubernetes ConfigMap的规范
内容的提问来源于stack exchange,提问作者KNCK
相关产品推荐
相关产品推荐

