如何用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
相关产品推荐
相关产品推荐

