Terraform模块中AKS与节点池关联报错求助
问题描述
我有一个包含azurerm_kubernetes_cluster和azurerm_kubernetes_cluster_node_pool资源的Terraform模块main.tf,以及存储变量值的dev1.tfvars文件。尝试引用第一个Kubernetes集群的kubernetes_cluster_id时,配置kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.DEV-AKS-11.name出现错误:
A managed resource "azurerm_kubernetes_cluster" "aks" has not been declared in module.AKS.
相关代码如下:
main.tf
resource "azurerm_kubernetes_cluster" "AKS" { for_each = var.AKS name = each.value.name location = each.value.location resource_group_name = each.value.resourceGroupName dns_prefix = each.value.dnsprefix node_resource_group = each.value.noderesourcegroup default_node_pool { name = each.value.nodename node_count = each.value.nodecount vm_size = each.value.vmsize } identity { type = "SystemAssigned" } } resource "azurerm_kubernetes_cluster_node_pool" "nodepool" { for_each = var.nodepool name = each.value.nodepoolname kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.DEV-AKS-11.id vm_size = each.value.nodepoolvmsize node_count = each.value.nodepoolcount enable_auto_scaling = each.value.nodepoolenableautoscaling }
dev1.tfvars
AKS = { "DEV-AKS-11" = { name = "DEV-AKS-11" location = "UK South" resourceGroupName = "DEV-RG-11" dnsprefix = "devaks11" nodename = "testnode" nodecount = "1" vmsize = "Standard_D2_v2" noderesourcegroup = "DEV-RG-AKS-11" } } nodepool = { "agentpool" = { name = "agentpool" nodepoolvmsize = "Standard_D2_v2" nodepoolcount = "1" nodepoolenableautoscaling = "false" nodepoolmode = "system" } "appspool" = { name = "appspool" nodepoolvmsize = "Standard_D2_v2" nodepoolcount = "1" nodepoolenableautoscaling = "false" nodepoolmode = "user" } "minappspool" = { name = "minappspool" nodepoolvmsize = "Standard_D2_v2" nodepoolcount = "1" nodepoolenableautoscaling = "false" nodepoolmode = "user" } }
解决方案
错误原因
- 资源名称大小写不匹配:定义的Kubernetes集群资源是
azurerm_kubernetes_cluster.AKS(大写AKS),但引用时用了azurerm_kubernetes_cluster.aks(小写aks),Terraform对资源名称大小写严格敏感,因此找不到对应资源。 - for_each实例引用方式错误:当资源通过
for_each创建时,不能直接用.DEV-AKS-11的方式引用实例,必须通过键值索引["DEV-AKS-11"]访问。
修正代码
单集群场景直接修正
将azurerm_kubernetes_cluster_node_pool资源中的kubernetes_cluster_id修改为:
kubernetes_cluster_id = azurerm_kubernetes_cluster.AKS["DEV-AKS-11"].id
多集群场景灵活关联
如果未来需要扩展多集群,建议在nodepool变量中添加集群关联键,让每个节点池明确绑定对应集群:
- 修改
dev1.tfvars的nodepool变量,增加cluster_key字段:
nodepool = { "agentpool" = { name = "agentpool" cluster_key = "DEV-AKS-11" nodepoolvmsize = "Standard_D2_v2" nodepoolcount = "1" nodepoolenableautoscaling = "false" nodepoolmode = "system" } "appspool" = { name = "appspool" cluster_key = "DEV-AKS-11" nodepoolvmsize = "Standard_D2_v2" nodepoolcount = "1" nodepoolenableautoscaling = "false" nodepoolmode = "user" } "minappspool" = { name = "minappspool" cluster_key = "DEV-AKS-11" nodepoolvmsize = "Standard_D2_v2" nodepoolcount = "1" nodepoolenableautoscaling = "false" nodepoolmode = "user" } }
- 修改
main.tf中的节点池资源,通过each.value.cluster_key关联集群:
resource "azurerm_kubernetes_cluster_node_pool" "nodepool" { for_each = var.nodepool name = each.value.name kubernetes_cluster_id = azurerm_kubernetes_cluster.AKS[each.value.cluster_key].id vm_size = each.value.nodepoolvmsize node_count = each.value.nodepoolcount enable_auto_scaling = each.value.nodepoolenableautoscaling }
此修改既解决当前引用错误,又提升配置扩展性,后续添加新集群或节点池时,只需更新变量文件即可,无需修改资源定义。
内容的提问来源于stack exchange,提问作者Ashish Mishra
相关产品推荐
相关产品推荐

