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

如何用ArgoCD在不同命名空间部署同一应用的不同版本?

问题描述

我有一个包含单个应用Helm Chart的Git仓库,想通过ArgoCD实现与Kubernetes集群的自动同步。作为ArgoCD新手,我需要在不同命名空间部署同一应用的不同版本:

  • development命名空间部署x.x.x-SNAPSHOT版本
  • integration命名空间部署另一版本
  • quality和production命名空间也各自部署对应版本

我之前查过相关Issue,但场景不符(仅变更命名空间而非应用版本)。目前我写的ApplicationSet清单和仓库目录结构如下,现有方案存在大量应用代码重复,仅各环境有专属values文件,想了解该场景下ArgoCD的最佳实践。

当前ApplicationSet清单:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: my-appset
spec:
  generators:
    - list:
        elements:
          - namespace: development
          - namespace: integration
          - namespace: quality
          - namespace: production
  template:
    metadata:
      name: my-app
    spec:
      project: default
      syncPolicy:
        automated:
          selfHeal: true
      source:
        repoURL: 'my-repo-url'
        targetRevision: HEAD
        path: 'my-app-{{.namespace}}'
        helm:
          valueFiles:
            - 'values-{{.namespace}}.yaml'
      destination:
        server: 'kubernetes-url'
        namespace: 'my-app-{{.namespace}}'

当前仓库目录结构:

root/
├─ argocd/
│  ├─ appset.yaml
├─ my-app-development/
│  ├─ values-development.yaml
├─ my-app-integration/
│  ├─ values-integration.yaml
├─ my-app-quality/
│  ├─ values-quality.yaml
├─ my-app-production/
   ├─ values-production.yaml

最佳实践方案

方案1:统一Helm Chart路径,用ApplicationSet传递版本与环境参数

核心思路是复用同一个Helm Chart,通过ApplicationSet的list生成器为每个环境传递版本号和命名空间参数,用不同的values文件覆盖配置,同时通过targetRevision指定应用版本(对应Git的tag/分支)。

调整后的仓库目录结构

root/
├─ argocd/
│  ├─ appset.yaml
├─ my-app/  # 唯一的Helm Chart目录,存放通用模板和基础配置
│  ├─ Chart.yaml
│  ├─ templates/
│  ├─ values.yaml
│  ├─ values-development.yaml
│  ├─ values-integration.yaml
│  ├─ values-quality.yaml
│  ├─ values-production.yaml

优化后的ApplicationSet清单

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: my-appset
spec:
  generators:
    - list:
        elements:
          - namespace: development
            appVersion: "x.x.x-SNAPSHOT"
            targetRevision: "dev-branch"  # 对应Git分支或tag
          - namespace: integration
            appVersion: "1.2.3"
            targetRevision: "integration-tag"
          - namespace: quality
            appVersion: "1.2.3-rc1"
            targetRevision: "quality-tag"
          - namespace: production
            appVersion: "1.2.2"
            targetRevision: "prod-tag"
  template:
    metadata:
      name: my-app-{{.namespace}}  # 每个环境的Application名称唯一
    spec:
      project: default
      syncPolicy:
        automated:
          selfHeal: true
      source:
        repoURL: 'my-repo-url'
        targetRevision: '{{.targetRevision}}'  # 每个环境对应不同的Git版本
        path: 'my-app'  # 统一指向同一个Helm Chart
        helm:
          valueFiles:
            - 'values.yaml'
            - 'values-{{.namespace}}.yaml'  # 加载环境专属values
          parameters:
            - name: "image.tag"  # 如果版本对应镜像tag,直接传递参数
              value: '{{.appVersion}}'
      destination:
        server: 'kubernetes-url'
        namespace: '{{.namespace}}'

方案2:用Git分支对应环境版本

如果你的版本管理是通过Git分支实现(比如dev分支对应开发版,main对应生产版),可以用ApplicationSet的git生成器,自动从分支中识别环境,进一步简化配置。

示例ApplicationSet清单

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: my-appset
spec:
  generators:
    - git:
        repoURL: 'my-repo-url'
        revision: HEAD
        files:
          - path: "argocd/env-configs/*.yaml"  # 存放各环境配置的文件
  template:
    metadata:
      name: my-app-{{.metadata.labels.env}}
    spec:
      project: default
      syncPolicy:
        automated:
          selfHeal: true
      source:
        repoURL: 'my-repo-url'
        targetRevision: '{{.branch}}'  # 用分支作为版本来源
        path: 'my-app'
        helm:
          valueFiles:
            - 'values.yaml'
            - 'values-{{.metadata.labels.env}}.yaml'
      destination:
        server: 'kubernetes-url'
        namespace: '{{.metadata.labels.env}}'

配套的环境配置文件(argocd/env-configs/development.yaml)

metadata:
  labels:
    env: development
branch: dev

方案3:结合Helm仓库管理应用版本

如果你的Helm Chart已经推送到Helm仓库(比如ChartMuseum),可以直接在ApplicationSet中指定不同环境的Chart版本,无需在Git仓库中存放Chart代码,进一步解耦。

示例ApplicationSet清单

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: my-appset
spec:
  generators:
    - list:
        elements:
          - namespace: development
            chartVersion: "x.x.x-SNAPSHOT"
          - namespace: integration
            chartVersion: "1.2.3"
          - namespace: quality
            chartVersion: "1.2.3-rc1"
          - namespace: production
            chartVersion: "1.2.2"
  template:
    metadata:
      name: my-app-{{.namespace}}
    spec:
      project: default
      syncPolicy:
        automated:
          selfHeal: true
      source:
        repoURL: 'my-helm-repo-url'  # Helm仓库地址
        targetRevision: '{{.chartVersion}}'
        chart: 'my-app'  # Helm Chart名称
        helm:
          valueFiles:
            - 'https://my-repo-url/argocd/values-{{.namespace}}.yaml'  # 从Git加载环境values
      destination:
        server: 'kubernetes-url'
        namespace: '{{.namespace}}'

关键优化点总结
  • 复用核心Helm Chart:避免多目录重复存放Chart代码,只维护一份通用模板和基础配置。
  • 通过参数传递版本:利用ApplicationSet的生成器变量,为每个环境指定不同的targetRevision(Git分支/tag)或Helm Chart版本。
  • 环境专属配置隔离:用values-<env>.yaml覆盖基础配置,只存放环境差异项。
  • 唯一Application名称:为每个环境的Application设置唯一名称(比如my-app-development),避免冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:07:18