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

Terraform Helm配置OCCM Chart容忍度(tolerations)时类型不匹配问题求助

Terraform Helm配置OCCM Chart容忍度(tolerations)时类型不匹配问题求助

我最近在Terraform里用Helm provider配置OCCM Chart的容忍度(tolerations)时遇到了类型不匹配的问题,折腾了两种写法都报错,想请教下怎么用set或者set_list解决这个问题?

我一开始尝试的写法是这样的:

set {
  name = "tolerations"
  value = yamlencode([
    {
      key    = "node.kubernetes.io/test"
      value  = "true"
      effect = "NoSchedule"
    }
  ])
}

结果直接报错:

... invalid type for io.k8s.api.core.v1.PodSpec.tolerations: got "string", expected "array"

后来我换成了set_list来写:

set_list {
  name = "tolerations"
  value = [
    yamlencode({
      key    = "node.kubernetes.io/test"
      value  = "true"
      effect = "NoSchedule"
    })
  ]
}

还是踩了坑,报错信息变成了:

... invalid type for io.k8s.api.core.v1.Toleration: got "string", expected "map"

我查了相关资料但没找到用set/set_list的解决办法,想问下我哪里写错了?有没有办法用这两个指令搞定这个配置?


问题原因&解决方案

其实问题核心出在yamlencode的使用上:当你用yamlencode把数组或对象转成字符串后,Helm provider会直接把这个字符串传给Chart,但Chart期望的是原生的数组/对象类型,自然就会报类型不匹配的错误。

针对这个场景,有两种靠谱的解决方式:

方式一:用set块逐个指定容忍度属性

通过数组索引的路径来设置每个属性,不需要做任何编码,直接传递原始值即可:

set {
  name  = "tolerations[0].key"
  value = "node.kubernetes.io/test"
}

set {
  name  = "tolerations[0].value"
  value = "true"
}

set {
  name  = "tolerations[0].effect"
  value = "NoSchedule"
}

如果需要添加多个容忍度,只需要把索引改成[1]、[2]依次配置就行。

方式二:用set块配合type参数传递原生数组

如果你想一次性传递整个容忍度数组,可以用jsonencode(或者yamlencode)把数组转成字符串,然后指定type为list,告诉Helm provider这个值是数组类型,不是普通字符串:

set {
  name  = "tolerations"
  value = jsonencode([
    {
      key    = "node.kubernetes.io/test"
      value  = "true"
      effect = "NoSchedule"
    }
  ])
  type  = "list"
}

这里用jsonencode是因为Terraform对JSON的解析更稳定,换成yamlencode也能正常工作,只要指定了type参数,Helm provider就会把编码后的字符串解析回原生的数组类型。

另外要说明的是,set_list的设计初衷是用来传递字符串数组(比如["value1", "value2"]),并不适合传递对象数组,这就是你第二种写法失败的原因。

备注:内容来源于stack exchange,提问作者sctx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 14:58:10