Azure私有网络中通过应用网关Ingress访问AKS时出现502错误
Azure私有网络中通过应用网关Ingress访问AKS时出现502错误
看起来你已经把私有网络下AKS和应用网关的基础架构搭得差不多了——AGIC部署正常,后端池也自动创建了,pod本身功能没问题,但就是访问时碰到502错误,这确实挺让人头疼的。我来帮你梳理几个常见的排查方向,你可以一步步来验证:
1. 优先检查应用网关的后端健康状态
502错误通常和后端池的健康状态直接相关,你可以先登录Azure门户,找到你的应用网关,查看后端池的健康状态:
- 如果显示“不健康”,核心问题就是应用网关无法正常访问到AKS里的pod,这时候要排查网络连通性:
- 确认VNet对等连接的路由是否生效:虽然你已经做了双向对等,但要检查两个VNet的路由表,有没有把对方的子网/pod CIDR段添加进去?比如应用网关所在VNet的路由表,是否有指向AKS pod CIDR的路由,下一跳是对等连接?
- 检查NSG规则:AKS节点所在的NSG,以及pod所在子网的NSG,有没有允许应用网关所在子网的IP段访问pod的目标端口?比如如果你的服务用的是80端口,那NSG里要加一条入站规则,允许应用网关子网的IP访问80端口。
- 可以尝试在应用网关所在的VNet里部署一个测试VM,直接ping或者telnet到pod的IP和端口,看看能不能连通——如果连测试VM都访问不了,那就是网络层面的问题。
2. 验证Ingress配置与AGIC同步情况
AGIC负责把Ingress配置同步到应用网关,有时候配置细节不对也会导致502:
- 检查Ingress的
privateIP: true配置是否正确,同时确认Ingress规则里的serviceName和servicePort是不是和你的K8s服务完全匹配?比如服务的targetPort是不是指向pod暴露的端口? - 查看AGIC的日志,看看有没有同步失败的报错:
日志里如果出现类似“无法找到后端服务”“端口不匹配”的提示,那就是配置同步出了问题。kubectl logs -n kube-system <你的AGIC pod名称>
3. 排查AKS网络策略(Network Policy)
如果你的AKS集群启用了网络策略,默认可能会限制外部流量访问pod——即使是同私有网络内的应用网关流量也可能被拦截:
- 检查是否存在针对该pod的网络策略,有没有允许应用网关所在子网的IP段访问对应的端口。如果没有,需要添加一条允许规则,比如:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-ag-traffic namespace: <你的pod所在命名空间> spec: podSelector: matchLabels: <你的pod标签> ingress: - from: - ipBlock: cidr: <应用网关所在子网的CIDR> ports: - protocol: TCP port: <你的服务端口>
4. 检查应用网关的健康探针配置
AGIC会自动为后端池创建健康探针,但如果探针的路径和你的应用健康检查路径不匹配,会导致探针失败,后端池被标记为不健康:
- 登录Azure门户,进入应用网关的健康探针,看看探针的路径是不是你的应用实际的健康检查路径?比如你的应用健康检查是
/healthz,但探针默认是/,这时候探针会返回404,导致后端池不健康。你可以手动修改探针路径,或者在Ingress里通过注解指定探针:annotations: appgw.ingress.kubernetes.io/health-probe-path: /healthz appgw.ingress.kubernetes.io/health-probe-port: "80"
5. 私有DNS解析问题(如果用了自定义域名)
如果你是通过自定义域名访问服务,要确认在私有网络里这个域名能不能正确解析到应用网关的私有IP:
- 检查你配置的私有DNS区域是否关联了应用网关和AKS所在的VNet,确保两个VNet里的资源都能解析到这个域名。
按照这个顺序排查下来,应该能找到导致502的原因。先从后端健康状态入手,这是最常见的触发点。
备注:内容来源于stack exchange,提问作者Rahul




