AKS内部Nginx Ingress资源访问出现连接超时问题求助
内部Nginx Ingress Controller连接超时排查
环境配置
内部Ingress Controller安装
通过Helm部署内部Nginx Ingress Controller:
helm upgrade --install internal-ingress-nginx ingress-nginx/ingress-nginx --create-namespace --namespace internal-ingress-basic --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz --set controller.replicaCount=4 --set controller.service.internalTrafficPolicy=Cluster,controller.service.externalTrafficPolicy=Local -f .\internal-ingress.yaml
配套的internal-ingress.yaml配置:
controller: ingressClassByName: true ingressClassResource: name: nginx-internal enabled: true default: false controllerValue: "k8s.io/ingress-nginx-internal" service: external: enabled: false internal: enabled: true loadBalancerIP: 10.0.46.0 annotations: service.beta.kubernetes.io/azure-load-balancer-internal: "true"
Grafana内部Ingress配置
创建关联现有Grafana服务的内部Ingress(该服务已有正常公网Ingress,本次为内部访问测试),grafana-internal.yaml配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: grafana-internal-ingress namespace: monitoring annotations: meta.helm.sh/release-name: grafana-internal-ingress meta.helm.sh/release-namespace: monitoring nginx.ingress.kubernetes.io/proxy-body-size: 8m nginx.ingress.kubernetes.io/proxy-buffer-size: 16k nginx.ingress.kubernetes.io/use-regex: 'true' # 尝试添加但无效的配置 nginx.ingress.kubernetes.io/server-snippet: | location / { proxy_pass https://www.google.com; proxy_set_header Host www.google.com; proxy_ssl_server_name on; } spec: ingressClassName: nginx-internal rules: - host: monitoring.internal.domain.com http: paths: - path: / pathType: Prefix backend: service: name: prometheus-grafana port: number: 3000
问题现象
- Ingress已成功绑定内部负载均衡IP
10.0.46.0 monitoring.internal.domain.com可正常解析到该IP- 访问时持续出现连接超时,即使通过
server-snippet配置代理到Google也无改善 - 将Ingress Controller日志级别调至
--v=5后,未发现任何错误日志
排查步骤
1. 验证内部LB与Ingress Controller连通性
- 从集群内节点(或同VPC测试机器)直接访问Ingress Controller Pod的IP+80端口,确认Pod本身可正常响应
- 用
curl -v http://10.0.46.0或telnet 10.0.46.0 80测试内部LB的80端口,验证LB是否正常转发流量到后端Pod
2. 检查Azure内部LB健康探针状态
- 在Azure门户查看内部负载均衡器的健康探针状态,确认后端池中的Ingress Controller Pod处于健康状态
- 核对探针路径是否为
/healthz,与Helm安装参数一致,同时确认Pod的/healthz端点可返回200状态码
3. 校验Ingress Controller Service配置
- 查看Service的详细配置:
确认kubectl get svc internal-ingress-nginx-controller-internal -n internal-ingress-basic -o yamlspec.loadBalancerIP为10.0.46.0,且annotations包含service.beta.kubernetes.io/azure-load-balancer-internal: "true" - 检查
externalTrafficPolicy=Local和internalTrafficPolicy=Cluster的配置是否匹配当前网络环境(若节点不在内部LB的后端池子网,可能导致流量转发失败)
4. 确认Ingress规则已被加载
- 进入Ingress Controller Pod,查看Nginx配置文件中是否生成了Grafana的Ingress规则:
若未找到对应配置,需检查kubectl exec -n internal-ingress-basic <ingress-controller-pod-name> -- cat /etc/nginx/nginx.conf | grep -A 20 "monitoring.internal.domain.com"ingressClassName是否与IngressClass资源名称nginx-internal完全匹配
5. 排查网络策略与防火墙规则
- 检查
monitoringnamespace的网络策略,确认未阻止internal-ingress-basicnamespace访问prometheus-grafana的3000端口 - 检查Azure VNet的网络安全组(NSG)规则,确保允许测试机器到内部LB 80端口的流量,以及内部LB到Ingress Controller Pod所在节点80/443端口的流量
6. 测试Pod到后端服务的连通性
- 进入Ingress Controller Pod,直接访问Grafana服务:
确认Pod可正常访问后端服务,排除服务本身或DNS解析问题kubectl exec -n internal-ingress-basic <ingress-controller-pod-name> -- curl -v http://prometheus-grafana.monitoring.svc.cluster.local:3000
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

