Kubernetes支持元数据标签键中的点(例如app.role
),实际上这似乎是一个常见约定。
terraform配置语言(0.12)不支持参数名称中的点,因此无法指定此形式的标签。例如,在google_container_node_pool
配置中,我要指定以下内容:
resource "google_container_node_pool" "my-node-pool" {
...
labels = {
app.role = web
}
}
有解决方法吗?
请注意:在k8s标签中,斜杠(/
)也很常见。
更新:万一有人偶然发现同一问题,我想出了问题的根源。我通过省略labels
错误地将=
参数指定为一个块。所以看起来像这样:
labels {
"app.role" = "web"
}
这产生了以下错误,向我指出了错误的方向:
Error: Invalid argument name
on main.tf line 45, in resource "google_container_node_pool" "primary_preemptible_nodes":
45: "app.role" = "web"
Argument names must not be quoted.
我注意到并修复了丢失的=
,但是我并没有将映射键的语法与参数名称的语法放在一起。
答案 0 :(得分:1)
我验证了@ydaetskcoR的建议,即将标签用引号引起来。这是定义我创建的节点池(使用Terraform v0.11.13
)的代码段:
resource "google_container_node_pool" "node_pool" {
cluster = "${google_container_cluster.cluster.name}"
zone = "${var.cluster_location}"
initial_node_count = "${var.node_count}"
autoscaling {
min_node_count = 1
max_node_count = 5
}
management {
auto_repair = true
auto_upgrade = true
}
node_config {
machine_type = "${var.machine_type}"
oauth_scopes = [
"https://www.googleapis.com/auth/logging.write",
"https://www.googleapis.com/auth/monitoring",
"https://www.googleapis.com/auth/devstorage.read_only",
]
metadata {
disable-legacy-endpoints = "true"
}
labels = {
"app.role" = "web"
}
}
}
edit:我还验证了terraform 0.12.3的效果。