ArgoCD App of Apps模式下如何用不同Value文件部署多Helm实例?
你当前遇到的不是“随机生效一个valueFiles文件”,而是Helm的valueFiles机制本身是按顺序合并配置——后面的文件会覆盖前面文件中相同的配置项,最终生成一套合并后的配置来部署单个实例,并非生成多个实例。
下面是两种可行的解决方案:
方案一:手动创建多个独立子Application
为每个value文件单独创建一个子Application,每个Application需要有唯一的名称,同时指定唯一的Helm Release名称(避免同一namespace下的Release冲突)。
比如针对1.yaml的子Application:
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: example-app-1 namespace: argocd finalizers: - resources-finalizer.argocd.argoproj.io spec: project: default source: repoURL: {{ .Values.spec.source.repoURL }} path: exampleapp targetRevision: {{ .Values.spec.source.targetRevision }} helm: valueFiles: - 1.yaml releaseName: example-app-1 # 唯一Release名称 destination: server: {{ .Values.spec.destination.server }} namespace: example syncPolicy: automated: prune: true selfHeal: true syncOptions: - CreateNamespace=true
同理,针对2.yaml和3.yaml分别创建example-app-2、example-app-3的子Application,各自对应对应的value文件和唯一Release名称。将这些子Application文件都放在根Application指定的path: apps目录下,根Application同步时会自动创建所有子Application,每个对应一个独立的Helm实例。
方案二:用ApplicationSet批量生成子Application
如果需要管理大量实例,推荐用Argo CD的ApplicationSet组件来自动化生成子Application,避免手动重复编写配置。
创建如下ApplicationSet配置文件,放在根Application的path: apps目录下:
apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: example-apps-set namespace: argocd spec: generators: # 定义要遍历的value文件和对应的应用名称 - list: elements: - valueFile: 1.yaml appName: example-app-1 - valueFile: 2.yaml appName: example-app-2 - valueFile: 3.yaml appName: example-app-3 template: metadata: name: '{{appName}}' namespace: argocd finalizers: - resources-finalizer.argocd.argoproj.io spec: project: default source: repoURL: repourl path: exampleapp targetRevision: HEAD helm: valueFiles: - '{{valueFile}}' releaseName: '{{appName}}' destination: server: https://kubernetes.default.svc namespace: example syncPolicy: automated: prune: true selfHeal: true syncOptions: - CreateNamespace=true
根Application同步时会自动识别并创建这个ApplicationSet,ApplicationSet会根据定义的列表自动生成对应数量的子Application,每个实例使用指定的value文件。
关键注意点
- 每个实例必须有唯一的
metadata.name(Argo CD Application名称)和helm.releaseName(Helm Release名称),否则会出现资源冲突。 - 如果需要将实例部署到不同namespace,可以在Application的
destination.namespace字段中指定不同的值,进一步隔离实例。
内容的提问来源于stack exchange,提问作者dev1993

