使用Terraform销毁Rancher2托管AKS集群时因子网被占用失败如何解决
Terraform结合Rancher2与AKS资源销毁失败解决方案
根因
该报错由销毁流程的异步时序差导致:rancher2_cluster资源在Terraform侧标记删除完成时,Rancher触发的AKS集群删除操作仍在Azure侧异步执行,节点关联的网卡资源未完全释放,导致Terraform提前发起的子网删除请求失败。
优化方案
方案1:替换固定等待为销毁时条件轮询(当前架构下改造成本最低的可靠方案)
无需固定时长休眠,改为在销毁流程中轮询检查子网内已无关联资源,检查通过后再执行子网销毁,适配不同规模集群的删除耗时,无不必要的等待时间。
示例代码:
注意:使用该方案需要执行Terraform的环境已安装Azure CLI并完成对应订阅的鉴权。# 原有子网资源示例 resource "azurerm_subnet" "aks_subnet" { name = "subnet_name" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.vnet.name address_prefixes = ["10.240.0.0/16"] } # 子网销毁前预检查资源 resource "null_resource" "subnet_destroy_check" { depends_on = [rancher2_cluster.aks_cluster, azurerm_subnet.aks_subnet] provisioner "local-exec" { when = destroy command = <<EOT until [ $(az network nic list --subnet ${azurerm_subnet.aks_subnet.id} --query "length([])" -o tsv) -eq 0 ]; do echo "等待子网关联网卡释放,10秒后重试..." sleep 10 done EOT } }方案2:调整AKS资源管理逻辑(从架构层面根除依赖问题)
不通过rancher2_cluster直接创建AKS集群,改为先用azurerm_kubernetes_cluster原生Terraform资源部署AKS,再通过rancher2_cluster将已有集群导入Rancher管理。该模式下Terraform会自动遵循先删除AKS集群->集群关联网卡释放->再删除子网的依赖顺序,天然避免该问题。方案3:基于Rancher API的销毁状态轮询
若不想引入Azure CLI依赖,可将方案1的检查逻辑替换为调用Rancher API轮询集群删除状态,确认集群完全移除后再进入后续销毁流程即可。
固定等待兜底方案优化
如果要继续使用固定时长等待的方案,可直接调整依赖关系简化配置,无需额外中转的null_resource:
resource "time_sleep" "wait_for_aks_delete" { depends_on = [rancher2_cluster.aks_cluster] destroy_duration = "60s" } resource "azurerm_subnet" "aks_subnet" { # 原有子网配置不变 depends_on = [time_sleep.wait_for_aks_delete] }
内容的提问来源于stack exchange,提问作者maes
相关产品推荐
相关产品推荐

