长期运行的Helmfile重新同步时触发`key "chart" already set in map`错误
长期运行的Helmfile重新同步时触发
key "chart" already set in map错误 我之前也碰到过一模一样的问题!新版本的Helmfile对YAML的键唯一性检查变得更严格了,这就是你遇到报错的核心原因。
问题根源
你的*default模板里已经定义了chart: charts/{{{{ .Release.Name }}}},而在metallb这个release中又重复声明了chart: metallb/metallb。旧版本的Helmfile会自动覆盖重复的键,但从0.153.1版本开始,它严格遵循YAML规范,不允许同一个映射(map)里出现重复的键,所以直接抛出了这个错误。
解决方案
这里有两个实用的解决方法,你可以根据自己的场景选择:
方案1:重构模板拆分通用配置(推荐长期维护)
把原来的默认模板拆分成「基础通用配置」和「带默认chart的模板」,需要自定义chart的release直接继承基础配置即可,从根源避免重复键:
templates: # 基础通用配置,不含chart字段 base: &base atomic: true cleanupOnFail: true missingFileHandler: Warn values: - charts/{{`{{ .Release.Name }}`}}/values-{{ .Environment.Name }}.yaml secrets: - charts/{{`{{ .Release.Name }}`}}/secrets-{{ .Environment.Name }}.yaml # 带默认chart的模板,继承基础配置 default-chart: &default-chart <<: *base chart: charts/{{`{{ .Release.Name }}`}} releases: # 使用默认chart的release,继承default-chart模板 - name: your-regular-app <<: *default-chart namespace: your-namespace # 需要自定义chart的release,直接继承base模板,再声明自己的chart - name: metallb <<: *base chart: metallb/metallb namespace: metallb
方案2:在release中删除继承的chart键(快速临时修改)
利用YAML的特性,在合并模板后先删除继承来的chart字段,再声明新的chart值:
releases: - name: metallb <<: *default # 先移除模板中继承的chart字段 - chart: # 再定义自定义的chart值 chart: metallb/metallb namespace: metallb
小提示
如果你的helmfile里有很多需要自定义chart的release,方案1会让配置更清晰,后续维护也更方便;如果只是个别release需要修改,方案2会更快捷。
备注:内容来源于stack exchange,提问作者ppenguin
相关产品推荐
相关产品推荐

