排查在 Azure 中删除或修改虚拟网络或子网失败的问题

概要

尝试删除或修改 azure Microsoft中的虚拟网络或子网时,可能会收到错误。 网关、专用终结点、服务终结点、子网委派和孤立网络接口等资源可能会阻止删除或修改。 本文提供故障排除步骤,可帮助你解决这些问题。

排查虚拟网络和子网问题

虚拟网络删除

  1. 检查虚拟网络网关是否在虚拟网络中运行
  2. 检查应用程序网关是否在虚拟网络中运行
  3. 检查虚拟网络中是否存在Azure容器实例
  4. 检查是否在虚拟网络中启用了 Microsoft Entra 域服务
  5. 检查虚拟网络是否已连接到其他资源
  6. 检查虚拟机是否仍在虚拟网络中运行
  7. 检查虚拟网络是否停滞在迁移中
  8. 检查 Web 应用是否使用虚拟网络进行虚拟网络集成

子网删除

  1. 检查子网中是否存在专用终结点
  2. 检查是否在子网上配置了服务终结点
  3. 检查子网是否具有委派
  4. 检查子网上是否存在服务关联链接
  5. 检查孤立网络接口是否保留在子网中
  6. 检查子网是否被 Azure Bastion 或 Azure 防火墙使用

子网修改

  1. 调整包含活动资源的子网的大小
  2. 更改或删除子网委派
  3. 在活动子网上添加或删除服务终结点

故障排除步骤

检查虚拟网络网关是否在虚拟网络中运行

若要删除虚拟网络,请先删除虚拟网络网关。

对于经典虚拟网络,请转到 Azure 门户中经典虚拟网络的“概述”页。 在 VPN 连接 部分中,如果网关在虚拟网络中运行,则会显示网关的 IP 地址。

用于确定网关是否正在运行的经典网关的屏幕截图。

对于虚拟网络,请转到虚拟网络的 “概述 ”页。 检查虚拟网络网关的 已连接设备

Azure 门户中虚拟网络的已连接设备列表的屏幕截图。虚拟网络网关在列表中突出显示。

在删除网关之前,请删除网关中的任何 连接 对象。

检查应用程序网关是否在虚拟网络中运行

转到虚拟网络的 “概述 ”页。 检查应用程序网关的 已连接设备

Azure 门户中虚拟网络的已连接设备列表的屏幕截图。应用程序网关在列表中突出显示。

如果有应用程序网关,必须先将其删除,然后才能删除虚拟网络。

检查虚拟网络中是否存在 Azure 容器实例

注释

从 Azure 容器实例 API 版本 2021-07-01起,Azure 容器实例不再使用网络配置文件。 如果使用此 API 版本或更新的 API 版本,则门户不会创建网络配置文件。 以下指南仅适用于使用旧版 API 的旧部署。

  1. 在Azure门户中,转到资源组的 Overview 页。

  2. 在资源组资源列表的标头中,选择“ 显示隐藏类型”。 默认情况下,门户隐藏网络配置类型。

  3. 选择与容器组相关的网络配置文件。

  4. 选择 删除

    隐藏网络配置文件列表的屏幕截图。

  5. 再次删除子网或虚拟网络。

如果这些步骤无法解决问题,请使用这些 Azure CLI 命令清理资源。

检查虚拟网络中是否启用了 Microsoft Entra 域服务

如果Microsoft已启用 Entra 域服务并连接到虚拟网络,则无法删除此虚拟网络。

若要删除托管域,请参阅 “删除Microsoft Entra 域服务托管域

检查虚拟网络是否已连接到其他资源

检查线路链接、连接和虚拟网络对等互连。 这些资源中的任何一个都可能导致虚拟网络删除失败。

使用以下建议的删除顺序:

  1. 网关连接
  2. 网关
  3. IP
  4. 虚拟网络对等连接
  5. App Service Environment (ASE)

检查虚拟机是否仍在虚拟网络中运行

确保虚拟网络中没有虚拟机。

检查虚拟网络在迁移中是否停滞

如果虚拟网络停滞在迁移状态,则无法将其删除。 在 Azure PowerShell 中运行以下命令,中止迁移,然后删除虚拟网络。

Move-AzureVirtualNetwork -VirtualNetworkName "Name" -Abort

检查 Web 应用是否使用了虚拟网络进行虚拟网络集成

如果您曾将虚拟网络与 Web 应用集成,但在未断开虚拟网络集成的情况下删除了 Web 应用,请参阅 在断开虚拟网络集成之前删除应用服务计划或 Web 应用

排查子网删除失败问题

检查子网中是否存在专用终结点

如果子网具有专用终结点,则无法删除子网。 在删除子网之前,需要删除所有专用终结点。

  1. 在 Azure 门户中,转到虚拟网络并选择 “子网”。
  2. 选择要删除的子网并检查 “专用终结点 ”列。
  3. 如果专用终结点存在,请转到每个专用终结点资源并将其删除。

或者,使用 Azure CLI 标识子网中的专用终结点:

az network vnet subnet show \
    --resource-group <resource-group> \
    --vnet-name <vnet-name> \
    --name <subnet-name> \
    --query "privateEndpoints[].id" \
    --output tsv

删除每个专用终结点:

az network private-endpoint delete \
    --resource-group <resource-group> \
    --name <private-endpoint-name>

检查是否在子网上配置了服务终结点

服务终结点是子网级配置,不会阻止子网删除。 如 Azure 虚拟网络常见问题解答中所述,即使服务终结点处于打开状态,也可以删除子网。

但是,如果需要在更广泛的清理或修改过程中删除服务终结点,请使用以下步骤:

  1. 在 Azure 门户中,转到虚拟网络并选择 “子网”。
  2. 选择子网并检查 “服务终结点 ”部分。
  3. 删除任何已配置的服务终结点,然后选择“ 保存”。

使用 Azure CLI 检查和删除服务终结点:

az network vnet subnet show \
    --resource-group <resource-group> \
    --vnet-name <vnet-name> \
    --name <subnet-name> \
    --query "serviceEndpoints[].service" \
    --output tsv

通过更新子网删除服务终结点:

az network vnet subnet update \
    --resource-group <resource-group> \
    --vnet-name <vnet-name> \
    --name <subnet-name> \
    --service-endpoints '[]'

检查子网是否具有委托

子网委派将子网分配给特定的 Azure 服务,例如 Microsoft.DBforPostgreSQL/flexibleServersMicrosoft.Web/serverFarmsMicrosoft.ContainerService/managedClusters。 在删除一个委派子网之前,您必须先删除所有使用该委派子网的资源,然后删除委派关系本身。

常见的子网委派包括:

代表团 Service
Microsoft.ContainerInstance/containerGroups Azure 容器实例
Microsoft.DBforPostgreSQL/flexibleServers Azure Database for PostgreSQL - 灵活的服务器
Microsoft.DBforMySQL/flexibleServers Azure Database for MySQL - 灵活服务器
Microsoft.Web/serverFarms Azure 应用服务/Azure Functions
Microsoft.ContainerService/managedClusters Azure Kubernetes Service (AKS)
Microsoft.Sql/managedInstances Azure SQL 托管实例
Microsoft.Network/dnsResolvers Azure DNS 专用解析程序
Microsoft.Netapp/volumes Azure NetApp 文件
Microsoft.ApiManagement/service Azure API 管理

使用 Azure CLI 检查委派:

az network vnet subnet show \
    --resource-group <resource-group> \
    --vnet-name <vnet-name> \
    --name <subnet-name> \
    --query "delegations[].{name:name, service:serviceName}" \
    --output table

若要删除委派,请先删除使用委托子网的所有资源。 然后使用以下命令删除委派:

az network vnet subnet update \
    --resource-group <resource-group> \
    --vnet-name <vnet-name> \
    --name <subnet-name> \
    --remove delegations

将资源部署到子网时,Azure 容器实例、Azure 应用服务和 Azure SQL 托管实例等 Azure 服务会创建服务关联链接。 即使删除部署的资源,这些链接也会阻止删除子网。

使用 Azure CLI 检查服务关联链接:

az network vnet subnet show \
    --resource-group <resource-group> \
    --vnet-name <vnet-name> \
    --name <subnet-name> \
    --query "serviceAssociationLinks[].{link:link, linkedResourceType:linkedResourceType}" \
    --output table

如果在删除资源后仍保留服务关联链接,可能需要几分钟才能清除这些链接。 如果它们仍然存在,请尝试以下步骤:

  1. 请确认链接服务中没有资源仍部署在子网中。
  2. 等待 10-15 分钟,平台清理链接。
  3. 如果链接仍然存在,请打开引用特定 linkedResourceType项的 Azure 支持请求。

有关 Azure 容器实例的具体信息,请参阅 清理资源,以获取删除容器组和网络配置文件的 CLI 命令。

检查孤立网络接口是否保留在子网中

删除虚拟机或其他资源后留下的网络接口(NIC)可能会阻止子网删除。 必须删除子网中具有 IP 配置的每个 NIC。

使用 Azure CLI 列出子网中的 NIC:

az network vnet subnet show \
    --resource-group <resource-group> \
    --vnet-name <vnet-name> \
    --name <subnet-name> \
    --query "ipConfigurations[].id" \
    --output tsv

输出显示与子网关联的 IP 配置的资源 ID。 从资源 ID 中提取出 NIC 名称,并删除孤立无依的 NIC:

az network nic delete \
    --resource-group <resource-group> \
    --name <nic-name>

如果 NIC 仍附加到虚拟机,请先分离或删除虚拟机。

检查子网是否被 Azure Bastion 或 Azure 防火墙使用

子网AzureBastionSubnetAzureFirewallSubnet由各自的服务保留。 当关联的 Azure Bastion 或 Azure 防火墙资源存在时,无法删除这些子网。

对于 Azure Bastion:

  1. 在 Azure 门户中,搜索 Bastions 并在同一虚拟网络中查找 Bastion 资源。
  2. 删除 Azure Bastion 资源。
  3. 删除完成后,请删除AzureBastionSubnet

对于 Azure 防火墙:

  1. 在 Azure 门户中,搜索 防火墙 并查找防火墙资源。
  2. 解除分配或删除 Azure 防火墙资源。
  3. 解除分配或删除完成后,请删除AzureFirewallSubnet
  4. 使用 Azure CLI 检查连接的资源:
az network vnet subnet show \
    --resource-group <resource-group> \
    --vnet-name <vnet-name> \
    --name AzureBastionSubnet \
    --query "ipConfigurations[].id" \
    --output tsv

排查子网修改失败问题

调整包含活动资源的子网的大小

如果新地址范围仍包含所有现有 IP 地址,则可以调整具有活动资源的子网的大小。 如果新范围排除正在使用的 IP 地址,则调整大小操作将失败。

调整大小之前:

  1. 使用 Azure CLI 检查子网中已用 IP 地址的数量。

    az network vnet subnet show \
        --resource-group <resource-group> \
        --vnet-name <vnet-name> \
        --name <subnet-name> \
        --query "ipConfigurations | length(@)"
    
  2. 验证新地址前缀是否适合所有分配的地址。

  3. 更新子网。

    az network vnet subnet update \
        --resource-group <resource-group> \
        --vnet-name <vnet-name> \
        --name <subnet-name> \
        --address-prefixes <new-prefix>
    

注释

Azure 在每个子网中保留五个 IP 地址:前四个地址和最后一个地址。 调整大小时,请考虑这些保留地址和当前分配。

更改或删除子网委派

部署当前委派中的资源时,无法更改子网委派。 更改委派:

  1. 删除使用当前委派的所有资源(例如,删除灵活服务器或应用服务计划)。

  2. 使用 Azure CLI 删除现有委派。

    az network vnet subnet update \
        --resource-group <resource-group> \
        --vnet-name <vnet-name> \
        --name <subnet-name> \
        --remove delegations
    
  3. 添加新委派。

    az network vnet subnet update \
        --resource-group <resource-group> \
        --vnet-name <vnet-name> \
        --name <subnet-name> \
        --delegations <new-service-delegation>
    

在活动子网上添加或删除服务终结点

更改活动子网上的服务终结点可能会导致目标服务短暂的连接中断。 在维护时段内规划端点更改。

使用 Azure CLI 添加服务终结点。

az network vnet subnet update \
    --resource-group <resource-group> \
    --vnet-name <vnet-name> \
    --name <subnet-name> \
    --service-endpoints Microsoft.Storage Microsoft.Sql

若要删除特定的服务终结点,请仅指定要保留的终结点。

az network vnet subnet update \
    --resource-group <resource-group> \
    --vnet-name <vnet-name> \
    --name <subnet-name> \
    --service-endpoints Microsoft.Storage

警告

在资源依赖服务终结点时删除服务终结点可能会导致连接丢失。 在删除终结点之前,请验证没有活动资源依赖于该终结点。

常见错误消息

错误消息 原因 解决方案
Subnet <name> is in use and cannot be deleted. NIC、专用终结点或服务部署等资源仍在子网中。 使用 诊断命令 识别阻止的资源并删除它们。
InUseSubnetCannotBeDeleted 子网包含来自 VM、负载均衡器或其他资源的 IP 配置。 删除或将资源移到另一个子网,然后重试删除。
SubnetHasServiceEndpoints 子网中配置了服务终结点。 服务终结点本身不会阻止删除子网。 如果此错误与其他阻止资源一起发生,请先解决这些资源。 若要删除服务终结点,请参阅 检查是否在子网上配置了服务终结点
SubnetHasDelegations 子网被分配给一个服务,并从该服务中部署资源。 删除使用委派的服务资源,然后删除委派。
SubnetWithExternalResourcesCannotBeUsedByOtherResources 另一个 Azure 服务已在子网中部署了资源。 使用服务关联链接标识服务并删除已部署的资源。
InUseNetworkInterfaceCannotBeAssociatedWithSubnet 孤立的 NIC 具有与子网操作冲突的 IP 配置。 删除冗余的网络接口卡,然后重试该操作。
SubnetIsDelegatedAndCannotBeUsed 子网已委托给另一个服务。 在运行新服务之前更改或删除委派
Cannot delete virtual network <name> because it is in use by resource <id>. 资源仍附加到虚拟网络 (VNet)。 按照 虚拟网络删除 指南确定和删除资源。
NetworkProfileCannotBeDeleted Azure 容器实例使用的网络配置文件仍引用子网。 请参阅 检查虚拟网络中是否存在 Azure 容器实例 以解决该问题。

诊断命令

使用以下 Azure CLI 命令全面了解可能阻止子网删除或修改的所有资源和配置:

az network vnet subnet show \
    --resource-group <resource-group> \
    --vnet-name <vnet-name> \
    --name <subnet-name> \
    --query "{addressPrefix:addressPrefix, delegations:delegations[].serviceName, serviceEndpoints:serviceEndpoints[].service, ipConfigurations:ipConfigurations[].id, privateEndpoints:privateEndpoints[].id, serviceAssociationLinks:serviceAssociationLinks[].linkedResourceType}" \
    --output json

此命令返回:

  • addressPrefix:子网的当前地址范围。
  • 委派:将子网委托给的服务。
  • serviceEndpoints:配置的服务终结点。
  • ipConfigurations:子网中具有 IP 地址的 NIC 和其他资源。
  • privateEndpoints:与子网关联的专用终结点。
  • serviceAssociationLinks:将资源部署到子网中的服务。

如果其中任一字段包含值,则必须删除这些资源,然后才能删除或修改子网。

后续步骤