Terraform 抛出资源名称可能不为空错误

Jor*_*rdi 4 kubernetes terraform terraform-provider-kubernetes

我收到以下我不明白的错误消息:

Error: resource name may not be empty

  on main.tf line 48, in data "kubernetes_service" "spark_master_service":
  48: data "kubernetes_service" "spark_master_service" {
Run Code Online (Sandbox Code Playgroud)

有关的data source

data "kubernetes_service" "spark_master_service" {
    metadata {
        labels = {
            "app.kubernetes.io/component" = "master"
            "app.kubernetes.io/instance" = "spark"
            "app.kubernetes.io/name" = "spark"
        }
        namespace = var.namespace
    }
}
Run Code Online (Sandbox Code Playgroud)

data有一个名字,所以我不太明白 Terraform 告诉我什么。

yda*_*coR 6

这个令人困惑的错误是由于您无法使用元数据标签作为数据源的输入,而只能提供服务的命名空间和名称来查找它。

如果您查看数据源的来源,您会发现它仅使用namespacename字段:

func dataSourceKubernetesServiceRead(d *schema.ResourceData, meta interface{}) error {
    om := meta_v1.ObjectMeta{
        Namespace: d.Get("metadata.0.namespace").(string),
        Name:      d.Get("metadata.0.name").(string),
    }
    d.SetId(buildId(om))

    return resourceKubernetesServiceRead(d, meta)
}
Run Code Online (Sandbox Code Playgroud)

文档确实表明这是唯一应该使用的两个参数:

论据

  • name - (可选)服务的名称,必须是唯一的。无法更新。有关更多信息,请参阅 Kubernetes 参考
  • 命名空间 - (可选)命名空间定义服务名称必须唯一的空间。

不幸的是,文档指出命名空间和名称都是可选的,因为它们使用的共享模式部分与大多数 Kubernetes 提供程序相同,因此 Terraform 无法检查该字段是否已name使用,因为底层实现需要它。

我没有深入研究 Kubernetes 提供程序,但对我来说,这似乎是一个错误,如果资源或数据源在实践中具有与其他资源不同的模式,那么该模式应该与该实现相匹配。由于共享了如此多的 Kubernetes 模式,这可能会很棘手,但如果没有它,你就会失去 Terraform 的很多优点,因为它应该是强类型的,并且能够在你做某事时给你更好的错误消息错误的。