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

ArgoCD Helm应用配置多值文件仅加载最后一个的问题

ArgoCD多Helm值文件仅加载最后一个的问题解决

问题原因

ArgoCD本身支持多个Helm值文件,但你的用法不符合需求:Helm的valueFiles采用合并覆盖逻辑,即按顺序加载文件,后面文件的相同配置项会覆盖前面的。而你的Chart是为单个微服务设计的,三个值文件都定义了单个实例的配置,最终只会保留最后一个文件的配置,自然只部署一个实例。

解决方案

方案1:使用ArgoCD ApplicationSet(推荐)

通过ApplicationSet批量生成独立的ArgoCD Application,每个微服务对应一个Application,单独加载自己的值文件。这样每个微服务的部署完全独立,新增/删除微服务只需添加/删除值文件即可。

示例ApplicationSet清单:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: php-microservices-develop
  namespace: argocd
spec:
  generators:
    - git:
        repoURL: 'https://user@github.org/repos/repo.git'
        revision: HEAD
        files:
          - path: "php-microservice/values/app/develop/values-*.yml"
  template:
    metadata:
      name: '{{.basenameWithoutExtension .path}}'
    spec:
      project: default
      source:
        repoURL: 'https://user@github.org/repos/repo.git'
        path: php-microservice
        targetRevision: HEAD
        helm:
          valueFiles:
            - '{{.path}}'
          parameters:
            - name: app
              value: '{{.basenameWithoutExtension .path}}'
      destination:
        server: 'https://kubernetes.default.svc'
        namespace: default
      syncPolicy:
        syncOptions:
          - CreateNamespace=true

这个配置会自动扫描php-microservice/values/app/develop/下所有values-*.yml文件,为每个文件创建一个以文件名(去掉后缀)命名的Application,每个Application单独使用对应的值文件部署微服务。

方案2:修改Helm Chart支持多实例

如果不想用ApplicationSet,可以修改Chart模板,让它支持从单个值文件的列表中生成多个微服务实例。

  1. 调整值文件结构,把多个微服务配置放到一个列表中:
# 可合并原三个值文件内容到一个文件,或用多个值文件补充这个列表
services:
  - name: app-1
    image: your-image:v1
    replicas: 2
    # app1专属配置
  - name: app-2
    image: your-image:v1
    replicas: 1
    # app2专属配置
  - name: app-3
    image: your-image:v1
    replicas: 3
    # app3专属配置
  1. 修改Chart模板(以Deployment为例),用range遍历生成多个实例:
{{- range .Values.services }}
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .name }}
spec:
  replicas: {{ .replicas }}
  selector:
    matchLabels:
      app: {{ .name }}
  template:
    metadata:
      labels:
        app: {{ .name }}
    spec:
      containers:
        - name: {{ .name }}
          image: {{ .image }}
          # 其他容器配置引用{{ .xxx }}
---
# 对应的Service等资源也需用同样的range逻辑生成
apiVersion: v1
kind: Service
metadata:
  name: {{ .name }}-svc
spec:
  selector:
    app: {{ .name }}
  ports:
    - port: 80
      targetPort: 80
{{- end }}

这种方式下,你可以通过多个值文件补充services列表(只要不覆盖整个列表),但新增微服务需要修改值文件,灵活性不如ApplicationSet。

总结

你的核心问题是混淆了Helm值文件的合并逻辑和多实例部署的需求。ArgoCD支持多个值文件,但它是用来合并配置的,不是用来生成多个实例的。要实现单个Chart部署多个微服务,优先用ApplicationSet批量创建独立的Application,或者修改Chart模板支持多实例生成。

内容的提问来源于stack exchange,提问作者KarlsMaranjs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:22:39