ArgoCD ApplicationSet合并生成器参数重复报错请求协助
解决ArgoCD ApplicationSet Merge生成器的重复键报错问题
问题原因
你的配置中,merge生成器指定path作为唯一合并键,但输入的参数集存在重复:
matrix生成器会将git目录(2个path)与每个匹配的集群进行组合,假设有N个集群,就会生成2*N组参数,其中每个path会对应N组不同集群的参数(仅集群标识不同,path相同)list生成器又额外生成了2组仅包含path和namespace的参数
由于mergeKeys只设置了path,系统会认为所有path相同的参数都是重复的,因此抛出Duplicate key错误。
解决方案
根据你的需求(给每个git目录对应的集群部署指定namespace),有两种简洁的解决方式:
方式一:调整合并键,包含集群唯一标识
修改mergeKeys,加入集群的唯一标识参数(比如server,由clusters生成器自动输出),确保每个合并后的参数集唯一:
generators: - merge: mergeKeys: - path - server # 添加集群唯一标识作为合并键的一部分 generators: - matrix: generators: - git: directories: - path: aws-ebs-csi-driver - path: cluster-autoscaler repoURL: >- ... revision: master - clusters: selector: matchLabels: argocd.argoproj.io/secret-type: cluster - list: elements: - path: aws-ebs-csi-driver namespace: system - path: cluster-autoscaler namespace: system
这样path+server的组合会唯一标识每个参数集,merge时会自动将list中对应path的namespace参数合并到每个集群的参数里。
方式二:直接在Git生成器中注入Namespace参数
如果需求只是给每个git目录指定固定namespace,完全可以去掉merge生成器,直接在git生成器的目录配置中添加values字段:
generators: - matrix: generators: - git: directories: - path: aws-ebs-csi-driver values: namespace: system - path: cluster-autoscaler values: namespace: system repoURL: >- ... revision: master - clusters: selector: matchLabels: argocd.argoproj.io/secret-type: cluster
这种方式更简洁,直接通过matrix组合git目录和集群,同时携带namespace参数,避免了merge的复杂逻辑。
内容的提问来源于stack exchange,提问作者sebastian
相关产品推荐
相关产品推荐

