You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:21:25