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

AKS LoadBalancer External-IP处于pending状态,且意外创建公网LB

AKS配置AGIC后出现的两个异常问题解决

一、意外创建带公网IP的LoadBalancer

原因

当使用Application Gateway Ingress Controller(AGIC)作为Ingress控制器,且将AKS的outbound_type设为userDefinedRouting时,若未明确限制出站负载均衡器的创建逻辑,AKS会自动生成公共LB用于集群出站流量;另外,集群内若存在误配置为type: LoadBalancer的Kubernetes Service,也会触发云提供商创建LB资源。

修复

  1. 修改AKS网络配置,禁用自动出站LB
    在azurerm_kubernetes_cluster的network_profile块中添加负载均衡器SKU配置,并明确不自动分配出站IP:
network_profile {
  network_plugin              = "azure"
  network_policy              = "azure"
  outbound_type               = "userDefinedRouting"
  load_balancer_sku           = "Standard" # 匹配AGIC使用的标准SKU
  load_balancer_profile {
    outbound_ip_address_ids    = [] # 空数组表示不自动创建出站IP,依赖自定义路由规则
  }
}
  1. 排查并清理非预期的LoadBalancer Service
    执行命令查看集群内所有Service:
kubectl get services --all-namespaces

如果发现不属于业务需求的LoadBalancer类型Service,将其修改为ClusterIP或直接删除。

二、LoadBalancer External-IP 长期处于Pending状态

原因

  1. AKS代理池身份的资源组查询错误:你在data "azurerm_user_assigned_identity" "aks-identity"中硬编码了MC资源组名称,而集群名称是动态生成的,导致身份查询失败,后续的权限分配根本没生效。
  2. 子网权限不足:仅给AKS代理池身份分配子网的Network Contributor权限不够,需要对整个虚拟网络拥有该权限才能创建LB相关资源。

修复

  1. 修正AKS身份查询的动态资源组名称
    MC资源组的命名格式为MC_<集群资源组名>_<集群名>_<区域>,将硬编码改为动态生成:
data "azurerm_user_assigned_identity" "aks-identity" {
  name                = "${azurerm_kubernetes_cluster.kubernetes_cluster[0].name}-agentpool"
  resource_group_name = "MC_${module.resource_group_kubernetes_cluster[0].name}_${azurerm_kubernetes_cluster.kubernetes_cluster[0].name}_${var.location}"

  depends_on          = [azurerm_kubernetes_cluster.kubernetes_cluster]  
}
  1. 添加AKS身份对虚拟网络的权限
    先定义VNet的数据资源,再分配Network Contributor权限:
data "azurerm_virtual_network" "spoke-vnet" {
  name                = "np-dat-spoke-vnet"
  resource_group_name = "ipz12-dat-np-connect-rg"
}

resource "azurerm_role_assignment" "aks_id_network_contributor_vnet" {
  scope                = data.azurerm_virtual_network.spoke-vnet.id
  role_definition_name = "Network Contributor"
  principal_id         = data.azurerm_user_assigned_identity.aks-identity.principal_id

  depends_on = [data.azurerm_user_assigned_identity.aks-identity]
}
  1. 验证权限与事件日志
  • 部署修改后的Terraform配置:
terraform plan && terraform apply
  • 查看LB Service的事件日志,定位具体错误:
kubectl describe service <你的LB服务名称>
  • 在Azure门户检查AKS代理池身份的角色分配,确认已正确应用到VNet、子网和AGW资源。

内容的提问来源于stack exchange,提问作者One Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:40:50