Terraform创建AKS额外节点池count与for_each互斥问题咨询
问题解决方案
1. 修复count与for_each互斥错误
count和for_each是Terraform互斥的元参数,不能同时声明。你不需要额外加count做开关,直接通过动态过滤for_each的遍历源,就可以同时支持0个或任意数量节点池的创建:
- 删除原代码中的
count参数 - 将
for_each参数修改为带开关判断的表达式,开关关闭时直接返回空map,for_each遍历空map不会生成任何资源,完全满足无需创建额外节点池的场景
修改后的资源块代码如下:
resource "azurerm_kubernetes_cluster_node_pool" "aksnp" { lifecycle { ignore_changes = [ node_count ] } for_each = local.additional_node_pool_required == "true" ? var.additional_node_pools : {} kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.id name = each.value.node_os == "Windows" ? substr(each.key, 0, 6) : substr(each.key, 0, 12) node_count = each.value.node_count vm_size = each.value.vm_size availability_zones = each.value.zones max_pods = each.value.max_pods os_disk_size_gb = each.value.os_disk_size_gb os_type = each.value.node_os vnet_subnet_id = var.vnet_subnet_id node_taints = each.value.taints enable_auto_scaling = each.value.cluster_auto_scaling min_count = each.value.cluster_auto_scaling_min_count max_count = each.value.cluster_auto_scaling_max_count }
优化建议:建议将
local.additional_node_pool_required改为布尔类型,避免字符串大小写、拼写错误导致的逻辑异常,修改后判断逻辑可简化为for_each = local.additional_node_pool_required ? var.additional_node_pools : {}
2. 父模块控制子模块节点池创建的方法
子模块侧配置
首先在AKS子模块的variables.tf中声明两个入参:
# 额外节点池开关 variable "additional_node_pool_enabled" { type = bool description = "是否创建额外节点池" default = false } # 额外节点池配置集合 variable "additional_node_pools" { type = map(object({ node_os = string node_count = number vm_size = string zones = list(string) max_pods = number os_disk_size_gb = number taints = list(string) cluster_auto_scaling = bool cluster_auto_scaling_min_count = number cluster_auto_scaling_max_count = number })) description = "额外节点池的配置集合" default = {} }
然后将子模块中节点池资源的for_each改为使用入参判断:for_each = var.additional_node_pool_enabled ? var.additional_node_pools : {}
父模块侧配置
父模块调用AKS子模块时,直接将本地的local_additional_pools_required赋值给子模块的开关参数即可,示例如下:
module "aks" { source = "./你的AKS子模块路径" # 其他AKS必要参数省略 additional_node_pool_enabled = local.local_additional_pools_required additional_node_pools = local.你的节点池配置变量 }
如果不需要独立开关控制,也可以直接简化逻辑,去掉开关变量,直接判断节点池配置是否为空:for_each = length(var.additional_node_pools) > 0 ? var.additional_node_pools : {},用户传入空map就自动不创建节点池。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

