如何在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读取差异化配置:
对应的ConfigMap要存好差异化的values内容:source: repoURL: <你的Helm仓库地址> targetRevision: <版本号> chart: grafana helm: releaseName: grafana valuesFrom: - configMapKeyRef: name: cluster-info key: grafana-values 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
相关产品推荐
相关产品推荐

