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

