我正在尝试将字符串列表传递给这样的头盔模板:
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
...
annotations:
alb.ingress.kubernetes.io/subnets: {{ .Values.alb.subnets }}
...
values.yaml
alb:
subnets:
- subnet-A
- subnet-B
主.tf
resource "helm_release" "site_ui" {
name = "site-ui"
chart = "./charts/site-ui"
values = [
file("./charts/site-ui/values.yaml")
]
reuse_values = true
set_list {
name = "alb.subnets"
value = var.data_subnet_ids
}
}
变量.tf
variable "data_subnet_ids" {
type = list(string)
default = ["subnet-A", "subnet-B"]
}
地形计划:
# helm_release.site_ui will be updated in-place
~ resource "helm_release" "site_ui" {
id = "site-ui"
...
name = "site-ui"
~ values = [
...
# (25 unchanged attributes hidden)
...
+ set_list {
+ name = "alb.subnets"
+ value = [
+ "subnet-A",
+ "subnet-B",
]
}
# (4 unchanged blocks hidden)
}
Plan: 0 to add, 1 to change, 0 to destroy.
当我尝试部署上述代码时,出现此错误:
helm_release.site_ui: Modifying... [id=site-ui]
╷
│ Error: YAML parse error on foreseer-ui/templates/ingress.yaml: error unmarshaling JSON: while decoding JSON: json: cannot unmarshal array into Go struct field .metadata.annotations of type string
│
│ with helm_release.site_ui,
│ on main.tf line 27, in resource "helm_release" "site_ui":
│ 27: resource "helm_release" "site_ui" {
│
根据文档
alb.ingress.kubernetes.io/subnets
应该是stringList
类型(请参阅https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.1/guide/ingress/annotations/)
我错过了什么?
该错误与 TF 或 Helm 无关。
metadata.annotations
的模式需要一个字符串值,因为它是反序列化的 Go 结构中指定的类型,并且 Sprig 会从 YAML 数组/HCL2 列表呈现为列表类型。您需要将多个子网指定为字符串。文档描述该字符串应该以逗号分隔,因此呈现的值应该以逗号分隔子网:
alb.ingress.kubernetes.io/subnets: {{ .Values.alb.subnets | join ", " }}
其中 Sprig
join
函数将列表加入到由 ,
分隔的子网中。