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

如何在ArgoCD中为多EKS集群的Helm Release传递动态变量?

多EKS集群差异化配置实现方案

一、App of Apps直接传递集群变量

不用维护多份values文件,直接在顶层应用里定义集群名变量,传递给Grafana子应用即可。

1. 顶层应用传递变量

假设你用一个顶层Application(比如cluster-apps)管理所有子应用,在它的values.yaml里定义集群标识:

# 顶层App of Apps的values.yaml
clusterName: eks-prod-us-west-2

apps:
  grafana:
    enabled: true

然后在Grafana的Application模板里直接引用这个变量:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: grafana
  namespace: argocd
spec:
  project: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - PrunePropagationPolicy=foreground
      - CreateNamespace=true
    retry:
      limit: 2
      backoff:
        duration: 5s
        maxDuration: 3m0s
        factor: 2
  destination:
    server: "https://kubernetes.default.svc"
    namespace: monitoring
  source:
    repoURL: <你的Helm仓库地址>
    targetRevision: <版本号>
    chart: grafana
    helm:
      releaseName: grafana
      values: |
        grafana:
          ingress:
            hosts:
              - {{ .Values.clusterName }}.grafana.example.com

每个集群只需要修改顶层values里的clusterName,就能生成专属的Grafana URL。

二、用ConfigMap存储集群差异化配置

在每个集群提前创建存集群标识的ConfigMap,让Grafana部署时读取这个配置。

1. 集群内创建集群信息ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-info
  namespace: argocd
data:
  cluster-name: eks-prod-us-west-2

2. 两种引用方式

  • 环境变量注入:如果Grafana支持用环境变量生成URL,直接把ConfigMap的值转成环境变量:
    helm:
      releaseName: grafana
      values: |
        grafana:
          envFrom:
            - configMapRef:
                name: cluster-info
          ingress:
            hosts:
              - $(CLUSTER_NAME).grafana.example.com
    
  • 直接加载values片段:用Argo CD的valuesFrom功能,从ConfigMap读取差异化配置:
    source:
      repoURL: <你的Helm仓库地址>
      targetRevision: <版本号>
      chart: grafana
      helm:
        releaseName: grafana
        valuesFrom:
          - configMapKeyRef:
              name: cluster-info
              key: grafana-values
        values: |
          # 这里放通用配置
          ...
    
    对应的ConfigMap要存好差异化的values内容:
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cluster-info
      namespace: argocd
    data:
      grafana-values: |
        grafana:
          ingress:
            hosts:
              - eks-prod-us-west-2.grafana.example.com
    

三、用ApplicationSet自动化生成集群专属应用

如果集群数量多,用ApplicationSet自动生成每个集群的Grafana应用,省心高效。

基于集群标签的ApplicationSet示例

假设你的EKS集群已经在Argo CD中注册,并且打了env: prod标签,直接创建这个ApplicationSet:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: grafana-clusters
  namespace: argocd
spec:
  generators:
    - clusters:
        selector:
          matchLabels:
            env: prod
        values:
          namespace: monitoring
  template:
    metadata:
      name: '{{name}}-grafana'
    spec:
      project: default
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
        syncOptions:
          - PrunePropagationPolicy=foreground
          - CreateNamespace=true
        retry:
          limit: 2
          backoff:
            duration: 5s
            maxDuration: 3m0s
            factor: 2
      destination:
        server: '{{server}}'
        namespace: '{{values.namespace}}'
      source:
        repoURL: <你的Helm仓库地址>
        targetRevision: <版本号>
        chart: grafana
        helm:
          releaseName: grafana
          values: |
            grafana:
              ingress:
                hosts:
                  - '{{name}}.grafana.example.com'

这里的{{name}}就是Argo CD中注册的集群名称,ApplicationSet会自动为每个匹配的集群生成带专属URL的Grafana应用,完全不用手动写每个集群的Application文件。

方案选择建议

  • 少量集群:用App of Apps传变量或ConfigMap方案,简单直接;
  • 大量集群:优先用ApplicationSet,自动化程度高,减少重复工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:39:19