我收到以下我不明白的错误消息:
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" {
相关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
}
}
我的data
有一个名字,所以我不太清楚Terraform在告诉我什么。
这个令人困惑的错误来自这样一个事实,即您无法将元数据标签用作数据源的输入,而只能提供服务的命名空间和名称来查找它。
如果您查看数据源的源,您会发现它仅使用namespace
和name
字段:
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)
}
文档确实表明,这些是唯一应该使用的两个参数:
参数
- 名称 - (可选(服务的名称必须是唯一的。无法更新。有关更多信息,请参阅 Kubernetes 参考
- 命名空间 - (可选(命名空间定义服务名称必须唯一的空间。
不幸的是,文档指出命名空间和名称都是可选的,因为它们使用的共享架构部分对于大部分 Kubernetes 提供程序都是相同的,因此 Terraform 无法检查是否使用了name
字段,因为底层实现需要它。
我没有深入研究 Kubernetes 提供程序,但对我来说这似乎是一个错误,如果资源或数据源在实践中与其他资源具有不同的架构,那么架构应该与该实现相匹配。对于共享如此多的 Kubernetes 模式来说,这可能很棘手,但如果没有它,您将失去 Terraform 的许多优点,因为它应该是非常强的类型,并且能够在您做错事时为您提供更好的错误消息。