You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Terraform销毁Rancher2托管AKS集群时因子网被占用失败如何解决

Terraform结合Rancher2与AKS资源销毁失败解决方案

根因

该报错由销毁流程的异步时序差导致:rancher2_cluster资源在Terraform侧标记删除完成时,Rancher触发的AKS集群删除操作仍在Azure侧异步执行,节点关联的网卡资源未完全释放,导致Terraform提前发起的子网删除请求失败。

优化方案

  • 方案1:替换固定等待为销毁时条件轮询(当前架构下改造成本最低的可靠方案)

    无需固定时长休眠,改为在销毁流程中轮询检查子网内已无关联资源,检查通过后再执行子网销毁,适配不同规模集群的删除耗时,无不必要的等待时间。
    示例代码:
    # 原有子网资源示例
    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
      }
    }
    
    注意:使用该方案需要执行Terraform的环境已安装Azure CLI并完成对应订阅的鉴权。
  • 方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:21:00