使用主机名无法访问AKS中Nginx Ingress对应的Azure负载均衡器
针对你遇到的私有AKS集群中Nginx Ingress配置完成但无法访问的情况,核心问题通常出在负载均衡器类型配置、节点NSG规则或LB后端健康状态上,以下是具体排查和解决步骤:
一、基础状态检查
确认Ingress Controller服务状态
首先检查Ingress Controller的Service是否为公共LoadBalancer类型,以及IP是否与Ingress资源的EXTERNAL-IP一致:kubectl get svc ingress-nginx-controller -n jananath-test如果TYPE不是
LoadBalancer,或者EXTERNAL-IP为空/不一致,说明Ingress Controller的网络配置有误。验证后端服务可用性
在集群内部测试后端服务是否正常,排除服务本身的问题:kubectl run -it --rm test-pod --image=busybox -- wget -O- http://nginx-test.jananath-test.svc.cluster.local如果能返回Nginx默认页面,说明后端服务无问题,问题出在Ingress到节点的流量路径。
检查Ingress Controller Pod状态
确保Ingress Controller的Pod正常运行,没有崩溃或重启:kubectl get pods -n jananath-test
二、Azure资源层排查
检查负载均衡器类型
登录Azure门户,找到AKS自动生成的资源组(名称以MC_开头),查看其中的负载均衡器:- 如果是内部负载均衡器,则无法从公网访问,这是私有AKS集群安装Ingress时的常见默认配置问题。
- 同时查看LB的后端池,确认AKS节点已被正确添加,且健康探针状态为正常(探针失败会导致LB停止转发流量)。
检查节点池NSG规则
私有AKS的节点池NSG默认会阻止外部流量,需要确保存在允许Azure负载均衡器访问节点80端口的入站规则:- 在Azure门户的节点NSG中,查看是否有优先级较高的规则阻止了
AzureLoadBalancer来源的80端口流量。
- 在Azure门户的节点NSG中,查看是否有优先级较高的规则阻止了
三、解决方法
1. 重新安装Ingress Controller为公共LB
如果当前Ingress Controller使用的是内部LB,执行以下命令重新安装,强制创建公共负载均衡器:
NAMESPACE=jananath-test helm upgrade --install ingress-nginx ingress-nginx \ --repo https://kubernetes.github.io/ingress-nginx \ --namespace $NAMESPACE \ --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"="false"
2. 添加节点NSG入站规则
如果节点NSG缺少允许LB流量的规则,使用Azure CLI添加:
# 替换为你的AKS资源组和集群名称 AKS_RG="your-aks-resource-group" AKS_CLUSTER="your-aks-cluster-name" # 获取节点池所在的资源组和NSG名称 NODE_RG=$(az aks show --resource-group $AKS_RG --name $AKS_CLUSTER --query nodeResourceGroup -o tsv) NODE_NSG=$(az network nsg list --resource-group $NODE_RG --query "[0].name" -o tsv) # 添加允许LB访问80端口的入站规则 az network nsg rule create \ --resource-group $NODE_RG \ --nsg-name $NODE_NSG \ --name allow-nginx-ingress-80 \ --priority 100 \ --source-address-prefixes AzureLoadBalancer \ --source-port-ranges "*" \ --destination-address-prefixes "*" \ --destination-port-ranges 80 \ --protocol Tcp \ --access Allow \ --direction Inbound
3. 修复LB健康探针
如果LB健康探针失败,检查Ingress Controller的探针配置:
kubectl describe svc ingress-nginx-controller -n jananath-test | grep -A5 "HealthCheckNodePort"
确认探针端口和路径(默认是80端口的/healthz),确保Ingress Pod的该路径能正常返回200状态码。
内容的提问来源于stack exchange,提问作者Jananath Banuka

