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资源。
修复
- 修改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,依赖自定义路由规则 } }
- 排查并清理非预期的LoadBalancer Service
执行命令查看集群内所有Service:
kubectl get services --all-namespaces
如果发现不属于业务需求的LoadBalancer类型Service,将其修改为ClusterIP或直接删除。
二、LoadBalancer External-IP 长期处于Pending状态
原因
- AKS代理池身份的资源组查询错误:你在
data "azurerm_user_assigned_identity" "aks-identity"中硬编码了MC资源组名称,而集群名称是动态生成的,导致身份查询失败,后续的权限分配根本没生效。 - 子网权限不足:仅给AKS代理池身份分配子网的Network Contributor权限不够,需要对整个虚拟网络拥有该权限才能创建LB相关资源。
修复
- 修正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] }
- 添加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] }
- 验证权限与事件日志
- 部署修改后的Terraform配置:
terraform plan && terraform apply
- 查看LB Service的事件日志,定位具体错误:
kubectl describe service <你的LB服务名称>
- 在Azure门户检查AKS代理池身份的角色分配,确认已正确应用到VNet、子网和AGW资源。
内容的提问来源于stack exchange,提问作者One Developer
相关产品推荐
相关产品推荐

