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

如何在ArgoCD中通过多Values文件渲染Helm Chart配置(无需修改模板)

解决ArgoCD+Helm部署Nginx Ingress的多环境Values变量问题

为什么你之前的方法行不通?

Helm只负责渲染Chart包自带的模板文件,不会解析Values文件里的模板语法——你在common-values.yaml里写的{{ .Values.public_ip }}会被当成纯字符串传递给Chart,根本不会被替换成实际IP。

可行解决方案(仅通过Values/ArgoCD配置实现)

方案1:ArgoCD参数直接注入Terraform输出值

放弃在Values里写模板,直接用ArgoCD的参数传递环境特定IP,配合通用Values文件:

  1. 维护common-values.yaml,只放所有环境通用的配置:
    controller:
      replicaCount: 2
      service:
        internal:
          enabled: true
          # 不要在这里写模板,留空或直接去掉loadBalancerIP字段
    
  2. 在ArgoCD的Application配置里,通过helm.parameters注入Terraform输出的IP:
    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
      name: nginx-ingress
      namespace: argocd
    spec:
      destination:
        server: https://kubernetes.default.svc
        namespace: ingress-nginx
      source:
        repoURL: https://kubernetes.github.io/ingress-nginx
        chart: ingress-nginx
        targetRevision: v4.8.3 # 替换为你使用的Chart版本
        helm:
          valueFiles:
            - common-values.yaml
          parameters:
            - name: controller.service.internal.loadBalancerIP
              value: "1.2.3.4" # 直接替换为Terraform输出的internal_ip变量值
    
    如果用Terraform管理ArgoCD应用,直接把Terraform的输出变量代入这个value字段即可,完全不用维护环境特定的Values文件。

方案2:从Terraform生成的Secret/ConfigMap读取动态值

适合需要用Kubernetes资源传递动态值的场景:

  1. 用Terraform生成存储IP的Secret(或ConfigMap):
    # Terraform代码示例
    resource "kubernetes_secret" "nginx_ingress_ip" {
      metadata {
        name      = "nginx-ingress-ip"
        namespace = "argocd"
      }
      data = {
        public_ip = var.internal_ip # 引用Terraform的输出变量
      }
    }
    
  2. 在ArgoCD的Application配置里,通过valueSources引用这个Secret,自动填充到指定配置路径:
    spec:
      source:
        helm:
          valueFiles:
            - common-values.yaml
          valueSources:
            - secret:
                name: nginx-ingress-ip
                key: public_ip
                targetPath: controller.service.internal.loadBalancerIP
    
    这种方式完全由Terraform动态生成IP,不需要手动在ArgoCD里写死值,适配多环境自动化部署。

总结

方案1和方案2都是最简洁且符合要求的实现方式,不需要修改Ingress Chart,也避免了重复配置,完美适配你从Terraform获取动态值的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:37:11