非Helm方式为AKS集群中Nginx Ingress绑定静态公网IP
解决AKS中Nginx Ingress绑定静态公网IP后EXTERNAL-IP处于Pending状态的问题
核心检查项与修复步骤
1. 确认静态公网IP的属性匹配要求
- 必须使用Standard SKU:AKS的Standard LoadBalancer只能绑定同SKU的静态IP,可通过以下命令确认:
az network public-ip show --resource-group MC_myResourceGroup_myAKSCluster_eastus --name myAKSPublicIP --query "sku.name" -o tsv - 必须与AKS集群处于同一区域:执行下方命令检查IP区域是否和集群一致:
az network public-ip show --resource-group MC_myResourceGroup_myAKSCluster_eastus --name myAKSPublicIP --query "location" -o tsv - 必须位于AKS的托管资源组(即
MC_myResourceGroup_myAKSCluster_eastus):若IP在其他资源组,需额外添加注解service.beta.kubernetes.io/azure-load-balancer-resource-group: <目标资源组名>到Ingress Service。
2. 修正Ingress Service的配置
- 定位Ingress Controller的Service(默认在
ingress-nginx命名空间):kubectl get service -n ingress-nginx - 编辑该Service,确保配置正确:
在kubectl edit service ingress-nginx-controller -n ingress-nginxmetadata.annotations中添加/确认以下配置:
同时确认service.beta.kubernetes.io/azure-load-balancer-ipv4: "你的静态IP地址" service.kubernetes.io/load-balancer-class: "standard"spec.type为LoadBalancer,无冲突配置项。
3. 确保AKS集群有绑定IP的权限
AKS的托管身份需要对托管资源组拥有Network Contributor权限,否则无法操作静态IP:
- 获取AKS集群的托管身份ID:
AKS_PRINCIPAL_ID=$(az aks show --resource-group myResourceGroup --name myAKSCluster --query identity.principalId -o tsv) - 为托管身份添加权限:
az role assignment create \ --assignee $AKS_PRINCIPAL_ID \ --scope /subscriptions/你的订阅ID/resourceGroups/MC_myResourceGroup_myAKSCluster_eastus \ --role "Network Contributor"
4. 触发Service重新绑定
修改配置后,删除并重新创建Ingress Service以触发IP绑定:
kubectl delete service ingress-nginx-controller -n ingress-nginx kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml
或直接应用修改后的Service配置:
kubectl apply -f <你的修改后的Service yaml文件路径>
5. 排查绑定失败原因
若仍处于Pending状态,查看Service的事件日志获取具体错误:
kubectl describe service ingress-nginx-controller -n ingress-nginx
常见错误包括IP被其他资源占用、权限不足、SKU不匹配等,可根据日志针对性修复。
内容的提问来源于stack exchange,提问作者Jens Voorpyl
相关产品推荐
相关产品推荐

