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

使用Terraform的helm_release部署Argo CD应用遇values.yaml问题

问题描述

我尝试用Terraform的helm_release资源部署Argo CD应用,想通过values.yaml实现自定义配置,但Argo CD应用无法按预期创建。此前用kubectl apply -f kub.yaml能成功部署该应用,现在希望通过Terraform Helm Provider达成同样效果。

可正常部署的kub.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: intern
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    namespace: default
    server: 'https://kubernetes.default.svc'
  source:
    path: Chart-test/
    repoURL: 'https://github.com/********'
    targetRevision: HEAD
    helm:
      valueFiles:
        - values.yaml
  project: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
      allowEmpty: false
    syncOptions:
      - Validate=true
      - CreateNamespace=true
      - PrunePropagationPolicy=foreground
      - PruneLast=true

对应的values.yaml

# values.yaml

applications:
  - name: intern
    namespace: argocd
    project: default
    source:
      repoURL: 'https://github.com/****'
      targetRevision: HEAD
      path: Chart-test/
    destination:
      namespace: default
      server: 'https://kubernetes.default.svc'
    syncPolicy:
      automated:
        prune: true
        selfHeal: true
        allowEmpty: false
    syncOptions:
      - Validate=true
      - CreateNamespace=true
      - PrunePropagationPolicy=foreground
      - PruneLast=true
    helm:
      valueFiles:
        - values.yaml

我的Terraform代码

resource "helm_release" "argocd" {
  name             = "argocd"
  namespace        = "argocd"
  create_namespace = true
  version          = "3.35.4"
  repository       = "https://argoproj.github.io/argo-helm"
  chart            = "argo-cd"
  values           = [file("values.yaml")]
}

问题排查

核心问题是混淆了Argo CD Application的两种创建逻辑:

  1. kubectl apply是直接创建Argo CD的Application自定义资源(CR),属于Argo CD管理应用的核心对象;
  2. 你用Terraform的helm_release部署的是Argo CD本身的Helm Chart,此时values.yaml需要适配Argo CD Chart的配置结构,而非直接复用CR的定义。

你的values.yaml格式是直接照搬CR的结构,但Argo CD Helm Chart对预定义Application有特定的字段要求,两者结构不匹配,导致Chart无法正确生成对应的Application资源。


修正方案

方案1:适配Argo CD Helm Chart的values结构

修改values.yaml,遵循Argo CD Helm Chart(3.35.4版本)的配置规范:

# 适配Argo CD Helm Chart的values格式
applications:
  - name: intern
    namespace: argocd
    project: default
    source:
      repoURL: "https://github.com/****"
      targetRevision: HEAD
      path: Chart-test/
    destination:
      namespace: default
      server: "https://kubernetes.default.svc"
    syncPolicy:
      automated:
        prune: true
        selfHeal: true
        allowEmpty: false
    syncOptions:
      - Validate=true
      - CreateNamespace=true
      - PrunePropagationPolicy=foreground
      - PruneLast=true
    helm:
      valueFiles:
        - values.yaml

Terraform代码可保持不变,建议添加原子部署参数保障稳定性:

resource "helm_release" "argocd" {
  name             = "argocd"
  namespace        = "argocd"
  create_namespace = true
  version          = "3.35.4"
  repository       = "https://argoproj.github.io/argo-helm"
  chart            = "argo-cd"
  values           = [file("values.yaml")]
  atomic           = true # 部署失败自动回滚
}

方案2:直接用Terraform创建Application CR

如果更习惯直接管理Application对象,可使用Terraform Kubernetes Provider直接创建CR,效果和kubectl apply完全一致:

resource "kubernetes_manifest" "argocd_application" {
  manifest = {
    apiVersion = "argoproj.io/v1alpha1"
    kind       = "Application"
    metadata = {
      name      = "intern"
      namespace = "argocd"
      finalizers = [
        "resources-finalizer.argocd.argoproj.io"
      ]
    }
    spec = {
      destination = {
        namespace = "default"
        server    = "https://kubernetes.default.svc"
      }
      source = {
        path           = "Chart-test/"
        repoURL        = "https://github.com/********"
        targetRevision = "HEAD"
        helm = {
          valueFiles = [
            "values.yaml"
          ]
        }
      }
      project = "default"
      syncPolicy = {
        automated = {
          prune     = true
          selfHeal  = true
          allowEmpty = false
        }
        syncOptions = [
          "Validate=true",
          "CreateNamespace=true",
          "PrunePropagationPolicy=foreground",
          "PruneLast=true"
        ]
      }
    }
  }
}

Terraform Helm Release操作values.yaml的注意事项与最佳实践
  • 严格匹配Chart的values结构:每个Helm Chart都有专属的配置schema,必须参考对应版本的官方文档或values.yaml示例,不能直接复用kubectl的CR配置。
  • 验证yaml格式:用Terraform的yamldecode函数检查values文件语法,避免格式错误:
    locals {
      argocd_values = yamldecode(file("values.yaml"))
    }
    
  • 锁定Chart版本:始终指定version字段,避免自动升级带来的兼容性问题。
  • 原子部署:添加atomic = true参数,确保部署失败时自动回滚,减少故障影响。
  • 分离敏感配置:敏感信息用Terraform变量或密钥管理工具存储,不要硬编码在values.yaml中。
  • 预览变更:部署前执行terraform plan查看资源变更,确认values的生效结果。
  • 优先使用官方参数:尽量通过Chart提供的配置参数实现需求,而非直接注入自定义资源,保障版本兼容性。

内容的提问来源于stack exchange,提问作者John Creighton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:07:25