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

长期运行的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 11:43:04