Helm部署ConfigMap报YAML第8行未找到预期冒号错误
问题背景
- 初始部署时通过ConfigMap传入JSON格式配置,部署后运行正常,Pod内部可正常读取ConfigMap内容。
- 尝试不重启Pod更新ConfigMap时发现,仅properties格式的data字段可正常更新,传入JSON文件时更新失败。
报错信息
执行部署命令kubectl apply -f helm/templates/config-map.yaml时抛出解析错误:
error: error parsing helm/templates/config-map.yaml: error converting YAML to JSON: yaml: line 8: could not find expected ':'
涉及配置
ConfigMap Helm模板
apiVersion: v1 kind: ConfigMap metadata: name: my-schooltest-app data: config_dev.json: |- {{ .Files.Get "conf/config_dev.json" | indent 4}} config_qa.json: |- {{ .Files.Get "conf/config_qa.json" | indent 4}}
JSON配置文件示例
{ "students": [ { "name": "test1", "proffesion": "Engineer", "subjectCodes": [ "SOCIAL", "SCIENCE", "MATHS" ] }, { "name": "test2", "proffesion": "Engineer", "subjectCodes": [ "ENGLISH", "TAMIL" ] } ], "allowedSubjects": [ "SOCIAL", "SCIENCE", "MATHS", "ENGLISH", "TAMIL" ], "school": "trm", "headmaster": [ "Test5" ] }
错误原因
- 核心触发原因:直接对Helm模板源文件执行
kubectl apply。helm/templates/目录下的文件包含{{ }}形式的Helm模板语法,没有经过Helm渲染的情况下,这些模板指令会被YAML解析器当成普通文本处理,解析器读到第8行的{{ .Files.Get ... }}内容时找不到YAML要求的键值对冒号分隔符,直接抛出解析错误。 - 模板缩进函数使用不当:原模板使用
indent 4处理文件内容,indent函数不会在内容最前方添加换行,渲染后JSON内容的第一行会和|-块标记挤在同一行,就算经过Helm渲染也会生成不符合YAML规范的内容。 - 不存在JSON格式ConfigMap无法热更新的限制:之前JSON配置更新失败本质是ConfigMap资源因为YAML解析错误根本没有提交成功,和文件格式无关。
修复步骤
- 禁止直接apply templates目录下的模板源文件:使用标准Helm命令执行部署/更新,例如
helm upgrade --install my-schooltest ./helm -n <目标命名空间>,由Helm完成模板渲染后再提交资源到K8s集群。 - 修正模板的缩进处理逻辑:将
indent替换为nindent函数,该函数会自动在注入内容前添加换行,保证块标量下的内容缩进符合YAML规范,修正后的模板内容如下:
apiVersion: v1 kind: ConfigMap metadata: name: my-schooltest-app data: config_dev.json: |- {{ .Files.Get "conf/config_dev.json" | nindent 4 }} config_qa.json: |- {{ .Files.Get "conf/config_qa.json" | nindent 4 }}
- 热更新注意事项:如果ConfigMap是直接挂载到容器目录(未使用
subPath字段),ConfigMap更新后kubelet会在默认1分钟的同步周期内自动更新容器内的配置文件,不需要重启Pod;如果使用了subPath挂载单个文件,K8s不会自动同步更新,需要配合Pod滚动重启加载新配置。
内容的提问来源于stack exchange,提问作者Wiki
相关产品推荐
相关产品推荐

