Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сводка
В этой статье показано, почему вы не можете удалить Azure Load Balancer или группу ресурсов, содержащую ее.
Обычно не удается удалить Azure Load Balancer или группу ресурсов, содержащую ее по одной из следующих причин:
- Зависимые ресурсы по-прежнему ссылаться на Load Balancer, поэтому сначала их необходимо удалить. К этим ресурсам относятся служба Приватный канал Azure, сопоставление сетевой карты (NIC) с внутренним пулом, правила исходящего трафика, правила балансировки нагрузки или входящего преобразования сетевых адресов (NAT), а также проверки работоспособности.
- Запрещающее назначение блокирует удаление, поскольку балансировщик нагрузки управляется платформой (создан Azure Kubernetes Service (AKS), Контейнеры приложений Azure или другой управляемой службой) либо остался после неудачного перемещения ресурса.
- Блокировка ресурсов Azure или Политика Azure с эффектом запрета, который предотвращает удаление.
Симптомы
Вы можете столкнуться с одним или несколькими из следующих симптомов:
- При удалении балансировщика нагрузки в портале Azure, с помощью средства командной строки (CLI) или при удалении группы ресурсов возникает ошибка, и ресурс не удаляется.
- CLI возвращает ошибку, например
Cannot delete resource ... because it is in useилиInUseLoadBalancerCannotBeDeleted. - CLI возвращает сообщение
CannotDeleteLoadBalancerWithPrivateLinkService, например...since it is referenced by private link service ... Please delete private link service prior to deleting load balancer. - CLI возвращает сообщение
ScopeLocked, напримерThe scope '...' cannot perform delete operation because following scope(s) are locked. - CLI возвращает
RequestDisallowedByPolicy— имя назначения политики Azure. - CLI возвращает ошибку авторизации с указанием, что действие заблокировано из-за запрещающего назначения.
- Удаление группы ресурсов завершается сбоем, и единственный ресурс, который не будет удален, является Load Balancer.
- Load Balancer находится в группе ресурсов узла с именем
MC_*AKS или принадлежит другой управляемой службе.
Необходимые условия
Чтобы устранить эту проблему, вам потребуется следующее:
-
Необходимые разрешения:
Network Contributorроль для группы ресурсов балансировщика нагрузки, чтобы удалить зависимости и сам балансировщик нагрузки,User Access AdministratorилиOwnerразрешение на снятие блокировки ресурса или создание исключения из политики, либо доступ на чтение к журналу активности для проверки назначений запрета. - Средства: Azure CLI 2.x или агент ИИ с доступом Azure MCP или CLI
- Обязательные переменные и примеры этих переменных, как показано в следующей таблице
| Variable | Description | Example |
|---|---|---|
{SUBSCRIPTION_ID} |
Идентификатор подписки Azure | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
{RESOURCE_GROUP} |
Группа ресурсов, содержащая Load Balancer | myResourceGroup |
{RESOURCE_NAME} |
Имя ресурса балансировщика нагрузки | myLoadBalancer |
СОВЕТ: Каждый скрипт, предоставленный в следующих разделах, запрашивает необходимые значения в интерактивном режиме. Чтобы открыть Cloud Shell и ответить на запросы, нажмите кнопку "Попробовать". Значения кэшируются для этого сеанса. Поэтому вы вводите их только один раз.
Этапы диагностики
Note
Эти действия предназначены исключительно для ознакомления ("только для чтения"). Они не вносят изменения в среду.
Проблема выявляется путем запуска четырех независимых проверок в режиме только чтения в следующем порядке приоритета: блокировка ресурсов, затем Политика Azure, затем назначение запрета, затем зависимые ресурсы. Блокировщики уровня управления (например, блокировка, политика, запрет назначения) предотвращают удаление независимо от зависимостей, поэтому процесс сначала проверяет их. Попробуйте исправить первый найденный блокировщик.
Шаг 1
Проверьте точный код ошибки, возвращенный неудавшейся операцией удаления. Код ошибки — это главный признак, по которому можно понять, с каким препятствием вы столкнулись. Если у вас уже есть текст ошибки на портале Azure или предыдущем запуске CLI или Terraform, используйте его здесь. В противном случае проверка только для чтения на шаге 2-шага 5 подтверждает блокировку без повторного выполнения операции удаления.
Выполните следующие команды в Azure CLI:
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
# Read-only: confirm the Load Balancer still exists and capture its ID for later steps.
az network lb show \
--name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--query "{id:id, provisioningState:provisioningState}" \
--output json
Интерпретация результатов
| Если вы видите... | Meaning | Дальнейшие действия |
|---|---|---|
Удалите код ScopeLocked ошибки или сообщение scope(s) are locked. |
Блокировка ресурса препятствует удалению. | Выполните шаг 2. |
Удалите код ошибки RequestDisallowedByPolicy. |
Эффект deny в Политика Azure блокирует удаление. | Выполните шаг 3. |
Удалите упоминания ошибок deny assignment (например, ...does not have authorization...because of a deny assignment). |
Запрещающее назначение блокирует удаление. | Выполните шаг 4. |
Удалить ошибку, например InUseLoadBalancerCannotBeDeleted, CannotDeleteLoadBalancerWithPrivateLinkService (с сообщением ...referenced by private link service ... Please delete private link service prior to deleting load balancer) или Cannot delete resource ... in use. |
Зависимые ресурсы по-прежнему ссылались на Load Balancer | Выполните шаг 5. |
| У вас нет текста ошибки или неясно. | Выполните следующие проверки в режиме только для чтения в шаге 2- и шаге 5, чтобы выявить блокирующую проблему | Выполните шаг 2. |
ResourceNotFound |
Load Balancer уже удален. | Никаких действий не требуется. |
Note
Даже если у вас есть код ошибки из предыдущего списка, выполните соответствующие проверки в режиме только чтения на шаге 2-–шаге 5, чтобы подтвердить блокирующий фактор, прежде чем вносить какие-либо изменения.
Шаг 2
Проверьте, существует ли блокировка управления (CanNotDeleteилиReadOnly) в Load Balancer, ее группе ресурсов или наследуемой родительской области. Блокировки наследуются вниз, поэтому блокировка группы ресурсов или подписки может блокировать удаление.
Выполните следующие команды в Azure CLI:
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
echo "── Locks on the Load Balancer resource ──"
az lock list \
--resource "$RESOURCE_NAME" \
--resource-type "Microsoft.Network/loadBalancers" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--query "[].{name:name, level:level, notes:notes}" \
--output json
echo "── Locks inherited from the resource group ──"
az lock list \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--query "[].{name:name, level:level, notes:notes}" \
--output json
echo "── Locks inherited from the subscription ──"
az lock list \
--subscription "$SUBSCRIPTION" \
--query "[].{name:name, level:level, notes:notes}" \
--output json
Интерпретация результатов
| Если вы видите... | Meaning | Дальнейшие действия |
|---|---|---|
Любая блокировка с "level": "CanNotDelete" или "level": "ReadOnly" в любой из ранее перечисленных областей действия. |
Блокировка препятствует удалению. Это блокировщик. | Выполните операцию C. |
Для всех трёх списков возвращается [] (блокировки отсутствуют). |
Блокировки — не помеха. | Выполните шаг 3. |
Шаг 3
Проверьте, не блокирует ли назначение Политика Azure с эффектом deny на уровне группы ресурсов, подписки или унаследованной области группы управления операцию удаления. Политика, блокирующая операцию удаления, возвращает RequestDisallowedByPolicy и называет назначение и определение политики.
Выполните следующие команды в Azure CLI:
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
# List policy assignments that apply to this resource group, including those
# inherited from the subscription and parent management groups.
az policy assignment list \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--disable-scope-strict-match \
--query "[].{name:name, displayName:displayName, policyDefinitionId:policyDefinitionId, scope:scope}" \
--output json
Если ошибка удаления имеет вид RequestDisallowedByPolicy, текст ошибки содержит имя назначения политики и идентификатор определения политики, из-за которых удаление было заблокировано. Сопоставьте это имя с предыдущим списком. Ошибка указывает точное назначение, и этот список подтверждает ее охват.
Интерпретация результатов
| Если вы видите... | Meaning | Дальнейшие действия |
|---|---|---|
Ошибка удаления была RequestDisallowedByPolicy , а именованное назначение отображается в этом списке. |
Эффект Политика Azure deny является блокировщиком. |
Выполните Resolution D. |
Нет RequestDisallowedByPolicy ошибок и не применяется соответствующая deny политика. |
Политика Azure не является блокировщиком. | Выполните шаг 4. |
Шаг 4
Проверьте, блокирует ли запрещающее назначение удаление. Службы Azure под управлением платформы, такие как AKS и Container Apps, создают запрещающие назначения для защиты принадлежащих им ресурсов. Неудачное или частичное перемещение ресурса может оставить после себя запрет назначения. В отличие от назначений ролей, вы не можете переопределить запрещающее назначение, назначив себе роль. Необходимо удалить источник.
Выполните следующие команды в Azure CLI:
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
# Deny assignments have no dedicated 'az' command; query the ARM API directly.
az rest \
--method get \
--url "https://management.azure.com/subscriptions/$SUBSCRIPTION/resourceGroups/$RG/providers/Microsoft.Authorization/denyAssignments?api-version=2022-04-01" \
--query "value[].{name:properties.denyAssignmentName, isSystemProtected:properties.isSystemProtected, principals:properties.principals[].displayName, excludePrincipals:properties.excludePrincipals[].displayName, actions:properties.permissions[].actions}" \
--output json
Интерпретация результата
| Если вы видите... | Meaning | Дальнейшие действия |
|---|---|---|
Одна или несколько записей, где isSystemProtected имеет значение true и actions включает *, */delete или Microsoft.Network/loadBalancers/delete. |
Этим балансировщиком нагрузки владеет назначение запрета, управляемое платформой. | Выполните разрешение B. |
| Отклонение назначения, которое не называет системный субъект (скорее всего, осталось после неудачного перемещения). | Устаревшее запрещающее назначение служит препятствием. | Выполните разрешение B. |
value имеет пустое значение ([]). |
Запрет назначений не является блокировщиком. | Выполните шаг 5. |
AuthorizationFailed в самом запросе. |
У вас нет прав доступа Microsoft.Authorization/denyAssignments/read. Запросите их. |
Повторно запустите шаг после предоставления разрешений. |
Шаг 5
Проверьте, какие зависимые ресурсы по-прежнему ссылались на Load Balancer. Балансировщик нагрузки нельзя удалить, пока служба Приватный канал, правило исходящего трафика, правило балансировки нагрузки или правило NAT для входящего трафика, проверка работоспособности либо привязка NIC к внутреннему пулу по-прежнему ссылаются на него. Этот шаг перечисляет все из них, чтобы точно знать, что нужно удалить и в каком порядке.
Выполните следующие команды в Azure CLI:
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
echo "── Load Balancer rule, probe, and backend-pool inventory ──"
az network lb show \
--name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--query "{outboundRules:outboundRules[].name, loadBalancingRules:loadBalancingRules[].name, inboundNatRules:inboundNatRules[].name, probes:probes[].name, backendPools:backendAddressPools[].name, backendNicAssociations:backendAddressPools[].loadBalancerBackendAddresses[].networkInterfaceIPConfiguration.id, backendIpConfigCount:length(backendAddressPools[0].backendIPConfigurations || [])}" \
--output json
echo "── Private Link Services that front-end this Load Balancer ──"
az network private-link-service list \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--query "[?contains(to_string(loadBalancerFrontendIpConfigurations), '$RESOURCE_NAME')].{name:name, fipConfigs:loadBalancerFrontendIpConfigurations[].id}" \
--output json
Интерпретация результатов
Запишите каждый непустый список. Это зависимости, которые необходимо удалить, и порядок их устранения (сначала служба Приватный канал, а затем — Load Balancer).
| Если вы видите... | Meaning | Дальнейшие действия |
|---|---|---|
| Перечислены одна или несколько служб Приватный канал, правил, проверок или привязок NIC серверной части. | Эти зависимости блокируют операцию удаления. | Выполните вариант A. |
Все списки пусты, и backendIpConfigCount является 0, но Шаг 2-Шаг 4 ничего не нашли. |
Не определен блокировщик. Повторно выполните операцию удаления. Если это по-прежнему не удается, откройте обращение в службу поддержки Azure. | Перейдите на карту принятия решений. |
Карта принятия решений
Используйте следующую таблицу карты принятия решений, чтобы определить соответствующие действия на основе результатов диагностики. Направлять к первой подходящей строке в следующем порядке (блокирующие факторы плоскости управления перед зависимостями).
| Результат диагностики | Дальнейшие действия |
|---|---|
На шаге 2 обнаружена блокировка CanNotDelete или ReadOnly. |
Выполните операцию C. |
На шаге 3 обнаружена блокировка Политика Azure (RequestDisallowedByPolicy). |
Выполните Resolution D. |
| На шаге 4 обнаружено запрещающее назначение (защищённое системой или устаревшее). | Выполните разрешение B. |
| Шаг 5 обнаружил службу Приватный канал, правила, пробы или привязки сетевых интерфейсов серверной части. | Выполните вариант A. |
| Нет ни блокировки, ни политики, ни запрета на назначение, ни зависимости, но операция удаления всё равно завершается ошибкой. | Откройте запрос поддержка Azure. |
Разрешение A
Зависимые ресурсы по-прежнему ссылаются на балансировщик нагрузки. Azure отказывается от удаления, пока не будет удалена каждая ссылка. Удалите ссылки в следующем порядке зависимостей: служба Приватный канал > правила исходящего трафика > балансировка нагрузки > правила NAT для входящего трафика > проверки работоспособности > серверный пул (связи с сетевыми интерфейсами) > Load Balancer.
Выполните следующие команды в Azure CLI.
Повторно запустите инвентаризацию с шага 5 и запишите все Приватный канал службы, правила, пробы, серверного пула и имени связи внутреннего сетевого адаптера. Вы используете эти имена в следующих шагах. Не продолжайте работу до тех пор, пока не будете иметь полный список.
Удалите все службы Приватный канал, которые выступают в роли внешнего интерфейса для этого балансировщика нагрузки. Служба Приватный канал содержит самую сильную ссылку, поэтому сначала удалите ее.
Important
Следующие команды — это все операции записи, требующие утверждения, прежде чем их можно будет запустить. Ознакомьтесь с ними, чтобы лучше понять, что делает каждая команда. Удаление службы Приватный канал отключает все частные конечные точки, потребляющие его.
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
read -rp "Private Link Service Name (from A.1): " PLS_NAME
az network private-link-service delete \
--name "$PLS_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION"
Повторите для каждой службы Приватный канал, указанной на шаге 1.
- Удалите каждое правило для исходящего трафика.
Important
Следующие команды — это все операции записи, требующие утверждения, прежде чем их можно будет запустить.
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
read -rp "Outbound Rule Name (from A.1): " OUTBOUND_RULE_NAME
az network lb outbound-rule delete \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--name "$OUTBOUND_RULE_NAME"
Повторите для каждого правила исходящего трафика, указанного в шаге 1.
- Удалите каждое правило балансировки нагрузки и каждое правило NAT для входящего трафика.
Important
Следующие команды — это все операции записи, требующие утверждения, прежде чем их можно будет запустить.
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
read -rp "Load-balancing Rule Name (from A.1): " LB_RULE_NAME
az network lb rule delete \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--name "$LB_RULE_NAME"
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
read -rp "Inbound NAT Rule Name (from A.1): " NAT_RULE_NAME
az network lb inbound-nat-rule delete \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--name "$NAT_RULE_NAME"
Повторите каждую команду для каждого правила, указанного на шаге 1.
- Удалите каждую пробу.
Important
Следующие команды — это все операции записи, требующие утверждения, прежде чем их можно будет запустить.
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
read -rp "Probe Name (from A.1): " PROBE_NAME
az network lb probe delete \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--name "$PROBE_NAME"
Повторите для каждой пробы, указанной на шаге 1.
- Удалите все привязки сетевых интерфейсов к внутреннему пулу серверов, а затем удалите этот внутренний пул серверов. Идентификаторы привязки NIC на внутреннем сервере указываются на шаге 1 как
backendNicAssociations(или какbackendIPConfigCountдля классического пула). Каждый идентификатор имеет форму.../networkInterfaces/<nicName>/ipConfigurations/<ipConfigName>.
Important
Следующие команды — это все операции записи, требующие утверждения, прежде чем их можно будет запустить.
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
[ -z "$BACKEND_POOL_NAME" ] && read -rp "Backend Pool Name (from A.1): " BACKEND_POOL_NAME
read -rp "NIC Name (from a backend association ID): " NIC_NAME
read -rp "IP Config Name (from the same ID): " IP_CONFIG_NAME
az network nic ip-config address-pool remove \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--nic-name "$NIC_NAME" \
--ip-config-name "$IP_CONFIG_NAME" \
--lb-name "$RESOURCE_NAME" \
--address-pool "$BACKEND_POOL_NAME"
Повторите для каждого идентификатора связи сетевого адаптера из шага 1. После отсутствия членов пула удалите его:
Important
Следующие команды — это все операции записи, требующие утверждения, прежде чем их можно будет запустить.
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
[ -z "$BACKEND_POOL_NAME" ] && read -rp "Backend Pool Name (from A.1): " BACKEND_POOL_NAME
az network lb address-pool delete \
--lb-name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--name "$BACKEND_POOL_NAME"
- При каждом удалении зависимостей удалите Load Balancer.
Important
Следующие команды — это все операции записи, требующие утверждения, прежде чем их можно будет запустить.
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
az network lb delete \
--name "$RESOURCE_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION"
- Повторно выполните шаг 1. Успешная операция удаления возвращает значение
ResourceNotFoundдля балансировщика нагрузки. Если удаление по-прежнему завершается ошибкой из-за того, что объект используется, повторно выполните Step 5, так как одна из зависимостей была пропущена. Удалите его и повторите шаг 7.
Разрешение B
Запрещающее назначение владеет балансировщиком нагрузки. Такая принадлежность является обычной для балансировщика нагрузки, который создается и управляется службой платформы. Например, AKS или контейнерные приложения создают назначение, защищенное системой, чтобы клиенты не могли удалять ресурсы из него. Стек развертывания Azure с параметром denyDelete запрета denyWriteAndDelete или управляемое приложение Azure (назначение запрета защищает управляемую группу ресурсов) также владеет балансировщиком нагрузки. Устаревшее назначение запрета, оставшееся после неудачного перемещения ресурса, также может блокировать балансировщик нагрузки. Невозможно удалить Load Balancer напрямую. Необходимо удалить источник запрещающего назначения. Имя запрещающего назначения, возвращаемое на шаге 4, обычно напрямую указывает на этот источник (например, created by Deployment Stack ... или created by managed application ...).
Выполните следующие команды в Azure CLI.
- Определите источник. Проверьте субъекты назначения запрета из шага 4, а затем проверьте в журнале действий операцию, в результате которой был создан ресурс или назначение запрета.
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
az monitor activity-log list \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--offset 30d \
--query "[?contains(to_string(authorization.action), 'loadBalancers') || contains(to_string(operationName.value), 'denyAssignment')].{time:eventTimestamp, caller:caller, op:operationName.localizedValue, status:status.value}" \
--output json
Определите, какая управляемая служба владеет Load Balancer:
- Группа ресурсов узла с именем
MC_<rg>_<cluster>_<region>и идентификатор вызывающей стороны для AKS указывают на балансировщик нагрузки, управляемый AKS. - Вызывающая сторона
Microsoft.Appуказывает на балансировщик нагрузки, управляемый Container Apps. - Субъект, не являющийся субъектом-службой, с операцией перемещения
Failedуказывает на устаревшее запрещающее назначение после частичного перемещения ресурса.
- Найдите родительский управляемый ресурс, который владеет балансировщиком нагрузки. Для балансировщика нагрузки, управляемого AKS, кластер выступает владельцем, а сам балансировщик нагрузки находится в группе ресурсов узлов кластера.
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
# Find AKS clusters whose node resource group matches the LB's resource group.
[ -z "$RG" ] && read -rp "Load Balancer Resource Group: " RG
az aks list \
--subscription "$SUBSCRIPTION" \
--query "[?nodeResourceGroup=='$RG'].{cluster:name, clusterResourceGroup:resourceGroup, nodeResourceGroup:nodeResourceGroup}" \
--output json
| Если вы видите... | Meaning | Дальнейшие действия |
|---|---|---|
| Возвращается кластер. | Балансировщик нагрузки управляется AKS. Удалите кластер, а не балансировщик нагрузки. | Перейдите к шагу 3. |
Нет кластера, но шаг 4 показал Microsoft.App субъект. |
Балансировщик нагрузки управляется службой Container Apps. Удалите среду Container Apps, к которой оно относится. | Удалите среду приложений контейнеров, а затем повторно запустите шаг 1. |
Нет кластера, но имя назначения запрета в шаге 4: created by Deployment Stack ... или created by managed application .... |
Load Balancer принадлежит стеку развертывания Azure или управляемому приложению. | Выключите владельца (например az stack group delete --name <stack> --resource-group <rg> --action-on-unmanage deleteAll --yes , или az managedapp delete --name <app> --resource-group <rg>) и повторно запустите шаг 1. |
| Нет кластера, и запрет назначения устарел (неудачное перемещение). | Создайте запрос в службу поддержки Azure, чтобы удалить осиротевшее запрещающее назначение. Вы не можете удалить его самостоятельно. | Откройте запрос поддержка Azure. |
- Отмена эксплуатации кластера AKS. При удалении кластера одновременно удаляются запрещающее назначение и балансировщик нагрузки, управляемый платформой.
Important
Следующие команды — это все операции записи, требующие утверждения, прежде чем их можно будет запустить. Это действие удаляет весь кластер AKS и все рабочие нагрузки, работающие на нем. Убедитесь, что кластер является безопасным для удаления перед запуском.
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
read -rp "Cluster Resource Group (from B.2): " CLUSTER_RG
read -rp "AKS Cluster Name (from B.2): " CLUSTER_NAME
az aks delete \
--name "$CLUSTER_NAME" \
--resource-group "$CLUSTER_RG" \
--subscription "$SUBSCRIPTION" \
--yes
- Повторно выполните шаг 1. Теперь балансировщик нагрузки должен возвращать
ResourceNotFound. Если назначение запрета остается после удаления родительской службы, оно становится осиротевшим. Откройте запрос поддержка Azure, чтобы удалить его.
Резолюция C
Блокировка управления (CanNotDeleteилиReadOnly) в Load Balancer, ее группа ресурсов или унаследованная родительская область блокирует операцию удаления. Перед продолжением операции удаления необходимо удалить блокировку.
Выполните следующие команды в Azure CLI.
Подтвердите область блокировки и название в шаге 2. Обратите внимание, находится ли блокировка в Load Balancer, группе ресурсов или подписке. Его необходимо удалить в области, в которой она определена.
Удалите блокировку. Используйте область, в которой Шаг 2 обнаружил блокировку.
Important
Следующие команды — это все операции записи, требующие утверждения, прежде чем их можно будет запустить. При снятии блокировки защита также снимается со всех ресурсов в пределах этой области действия. Повторно создайте блокировку после удаления, если она еще нужна в другом месте.
Для блокировки ресурса Load Balancer:
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$RESOURCE_NAME" ] && read -rp "Load Balancer Name: " RESOURCE_NAME
[ -z "$LOCK_NAME" ] && read -rp "Lock Name (from Step 2): " LOCK_NAME
az lock delete \
--name "$LOCK_NAME" \
--resource "$RESOURCE_NAME" \
--resource-type "Microsoft.Network/loadBalancers" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION"
Для блокировки группы ресурсов:
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
[ -z "$LOCK_NAME" ] && read -rp "Lock Name (from Step 2): " LOCK_NAME
az lock delete \
--name "$LOCK_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION"
Для блокировки подписки:
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$LOCK_NAME" ] && read -rp "Lock Name (from Step 2): " LOCK_NAME
az lock delete \
--name "$LOCK_NAME" \
--subscription "$SUBSCRIPTION"
- Повторно запустите шаг 2 , чтобы подтвердить отсутствие блокировок, а затем повторите операцию удаления с шага 1. Если операция удаления завершается сбоем с другой ошибкой, вернитесь на карту принятия решений и определите лучший курс. Блокировка может маскировать зависимость, которая будет отображаться только после удаления блокировки.
Разрешение D
Назначение Политика Azure с эффектом deny (возможно, унаследованным от родительской группы управления) блокирует операцию удаления. Чтобы устранить эту проблему, добавьте исключение политики для группы ресурсов (или конкретного ресурса) или измените назначение, если вы его владеете.
Выполните следующие команды в Azure CLI.
- Подтвердите назначение блокировки на шаге 3. Вам нужен идентификатор назначения политики или полный идентификатор ресурса. Укажите это в следующих командах:
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
read -rp "Policy Assignment Name (from Step 3 / error): " POLICY_ASSIGNMENT_NAME
az policy assignment show \
--name "$POLICY_ASSIGNMENT_NAME" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION" \
--query "{id:id, scope:scope, policyDefinitionId:policyDefinitionId}" \
--output json
Если назначение ограничивается группой управления, сообщение об ошибке и scope поле отображают путь к группе управления. Укажите полный идентификатор назначения для исключения.
- Создайте исключение политики для группы ресурсов, чтобы операция удаления была разрешена. Используйте идентификатор назначения из шага 1.
Important
Следующие команды — это все операции записи, требующие утверждения, прежде чем их можно будет запустить. Освобождение Waiver отключает действие политики для освобождённой области действия. Максимально сузьте область действия (группа ресурсов, а не подписка) и удалите ее после удаления, если политика должна продолжать применяться.
# ── Collect inputs (cached if already set in this session) ──
[ -z "$SUBSCRIPTION" ] && read -rp "Subscription ID: " SUBSCRIPTION
[ -z "$RG" ] && read -rp "Resource Group: " RG
read -rp "Policy Assignment ID (from D.1): " POLICY_ASSIGNMENT_ID
[ -z "$EXEMPTION_NAME" ] && read -rp "Exemption Name: " EXEMPTION_NAME
az policy exemption create \
--name "$EXEMPTION_NAME" \
--policy-assignment "$POLICY_ASSIGNMENT_ID" \
--exemption-category "Waiver" \
--resource-group "$RG" \
--subscription "$SUBSCRIPTION"
- Повторите удаление, начиная с шага 1. Если операция удаления завершается сбоем с другой ошибкой, вернитесь на карту принятия решений и определите лучший курс. Если
RequestDisallowedByPolicyсохраняется, блокирующее назначение находится на более высоком уровне области видимости, чем ваше исключение. Повторно выполните шаг 3, определите назначение на родительском уровне (на уровне группы управления) и создайте исключение в правильной области или попросите владельца политики скорректировать это назначение.