ArgoCD单个应用部署多个Helm图表失败问题咨询
问题
我尝试在ArgoCD中通过Helm图表部署不同的Kafka服务(Kafka broker、Schema Registry、KSQLDB和Kafka UI),希望将这4个图表部署在同一个ArgoCD应用下。启用DIRECTORY RECURSE: true后无法创建应用,报错信息:
Unable to save changes: application spec is invalid: InvalidSpecError: Unable to generate manifests in kafka: rpc error: code = FailedPrecondition desc = Failed to unmarshal "configmap.yaml": failed to unmarshal manifest: json: offset 2: invalid character '{' looking for beginning of object key string
已尝试的操作:
- 使用
helm pull <chart-name>命令从Helm仓库将4个图表分别下载到本地不同目录 - 将代码推送到Git仓库
- 在ArgoCD中创建指向根目录的新应用
- 将类型设置为DIRECTORY而非HELM,并勾选DIRECTORY RECURSE
- 创建应用时出现上述报错
- 单独为每个图表创建应用(对应图表目录)可正常运行
注:每个Helm图表均包含模板文件及values.yaml文件。
疑问:
- 是否可在单个ArgoCD应用中部署多个不同Helm图表?
- 我遗漏了什么?
- 该问题是否与GitHub上的相关讨论有关?
回答
1. 能否在单个ArgoCD应用中部署多个Helm图表?
可以,但不能用DIRECTORY RECURSE模式直接处理多个独立Helm图表目录。因为DIRECTORY模式是用来解析原生Kubernetes清单文件的,而Helm图表包含带{{ ... }}占位符的模板文件,ArgoCD会把这些模板当成普通K8s清单尝试解析,自然会出现反序列化错误——模板语法不属于合法的YAML/JSON格式。
2. 你遗漏的核心操作:选择正确的多Helm图表部署方式
方案一:使用ApplicationSet(推荐)
通过ApplicationSet的Git Generator或List Generator自动生成多个子应用,每个子应用对应一个Helm图表目录,且每个子应用都用HELM模式渲染。这样既能在ArgoCD中统一管理所有服务,又能保证每个Helm图表的正常渲染。
方案二:构建Helm Umbrella Chart
把4个Kafka相关图表作为依赖添加到一个父级umbrella chart中,在父chart的Chart.yaml里声明所有子chart的版本和仓库地址,然后通过单个ArgoCD应用(HELM类型)部署这个umbrella chart。
方案三:嵌套ArgoCD应用
在Git根目录创建一个存放ArgoCD应用清单的目录,每个清单对应一个Helm图表的应用配置(指定HELM类型、图表目录、values文件等),然后用DIRECTORY模式部署这个根目录,让ArgoCD自动创建并管理这些嵌套应用。
3. 关于GitHub讨论的关联
你提到的讨论确实围绕多Helm图表在单个ArgoCD应用下的部署问题,核心结论和上述分析一致:DIRECTORY模式不支持递归处理多个Helm图表,必须通过ApplicationSet、Umbrella Chart或嵌套应用这类方式解决。
内容的提问来源于stack exchange,提问作者Azman Amin

