aks-engine无法创建内部及代理池负载均衡器,服务长期处于Pending状态
针对你遇到的两个问题(无法创建内部负载均衡器、代理池的nginx LoadBalancer服务长期Pending),结合你用现有虚拟网络通过examples/kubernetes-custom-vnet.json部署集群的场景,我整理了以下排查和解决步骤:
一、解决无法创建内部负载均衡器的问题
内部负载均衡器的创建依赖正确的配置和权限,你可以从这几个方面入手:
检查Service注解配置
要创建内部LB,必须给LoadBalancer类型的Service添加特定注解:annotations: service.beta.kubernetes.io/azure-load-balancer-internal: "true"如果你是通过
kubectl expose创建服务,记得加上--annotations "service.beta.kubernetes.io/azure-load-balancer-internal=true"参数。验证VNet和子网权限
确保aks-engine使用的服务主体(Service Principal)拥有目标VNet及子网的Contributor权限。如果权限不足,Azure无法在现有VNet中创建LB资源。检查集群配置文件的网络参数
打开你的kubernetes-custom-vnet.json,确认以下几点:agentPoolProfiles中的vnetSubnetID指向了正确的现有子网ID- 配置中没有禁用LB创建的参数(比如
enableLoadBalancer是否设为true,默认应该是开启的)
二、解决代理池nginx LoadBalancer服务Pending的问题
服务长期处于<pending>状态,且资源组只有主节点LB,大概率是agent pool的LB配置或关联问题:
检查agent pool的LB配置
查看kubernetes-custom-vnet.json里的agentPoolProfiles,确保每个需要LB的agent pool都配置了loadBalancerProfile,比如:"agentPoolProfiles": [ { "name": "agentpool", "count": 3, "vmSize": "Standard_DS2_v2", "vnetSubnetID": "/subscriptions/<sub-id>/resourceGroups/<rg>/providers/Microsoft.Network/virtualNetworks/<vnet-name>/subnets/<subnet-name>", "loadBalancerProfile": { "idleTimeoutInMinutes": 4 }, "enableLoadBalancer": true } ]如果
enableLoadBalancer设为false,agent pool将不会创建对应的LB资源。验证Service的关联目标
确认你的nginx Service的spec.selector正确匹配了代理池上的Pod标签,比如如果代理池的节点标签是agentpool=proxy,要确保Pod有对应的标签,Service的selector能正确选中这些Pod。如果selector不匹配,LB也无法正常绑定。检查Azure资源的状态
登录Azure门户,查看目标VNet的子网是否有足够的可用IP地址——如果子网IP耗尽,LB无法获取IP会导致服务Pending。同时检查资源组中是否有LB相关的失败部署记录,排查具体的错误原因。重新部署或更新集群配置
如果确认是集群配置的问题,可以用aks-engine重新生成ARM模板并更新集群:aks-engine generate kubernetes-custom-vnet.json aks-engine deploy --subscription-id <sub-id> --resource-group <rg> --location <location> --api-model kubernetes-custom-vnet.json --upgrade注意更新前备份好现有集群的重要数据。
附你提供的服务状态输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 16m nginx LoadBalancer 10.0.249.248 <pending> 80:31190/TCP 13s
内容的提问来源于stack exchange,提问作者irom

