将流量路由到Azure Firewall后无法访问AKS集群中的Web应用
AKS关联Azure Firewall后无法通过Ingress主机名访问服务的问题排查
场景概述
原AKS集群使用Nginx Ingress Controller+公网负载均衡器,改为内部负载均衡器后,配置Azure Firewall做DNAT转发并更新公网DNS指向Firewall公网IP,但无法访问ArgoCD UI。
已完成配置
- 网络基础配置:在AKS所属VNet创建
AzureFirewallSubnet子网,部署Firewall、公网IP及路由表;路由表配置0.0.0.0/0下一跳为Firewall私有IP,并关联至AKS节点子网。 - Firewall策略:
- 启用DNS代理,使用默认Azure DNS服务器
- 应用规则(优先级500):允许所有源的http/https请求访问任意目标
- 网络规则(优先级400):允许所有源的任意协议访问所有IP,以及AzureAD/ACR/MCR服务标签
- DNAT规则(优先级100):将Firewall公网IP的443端口转发至内部LB私有IP的80端口
- Ingress Controller配置:通过values.yaml改为内部LB,服务spec已获取私有IP
LB_PRIVATE_IP,同时监听80和443端口 - ArgoCD Ingress配置:配置TLS证书,规则指向
argocd.my.dns.zone.net,后端关联argocd-server:80
可能遗漏或错误的配置点
1. DNAT规则端口映射不匹配
当前DNAT将Firewall的443端口转发至内部LB的80端口,但ArgoCD Ingress配置了TLS(依赖443端口),而内部LB的Ingress Controller 80端口未配置TLS终止逻辑,导致HTTPS请求转发到HTTP端口后无法正常处理。
- 修正方案:将DNAT规则改为Firewall 443端口转发至内部LB的443端口;或调整Ingress规则,确保80端口能处理对应请求(不推荐)
2. 内部LB的NSG访问控制缺失
检查AKS子网或内部LB关联的网络安全组(NSG),是否允许AzureFirewallSubnet子网的流量访问内部LB的80/443端口。默认NSG可能未开放该规则,需添加:
- 源:AzureFirewallSubnet的IP段
- 目标:内部LB私有IP
- 端口:80、443
- 协议:TCP
- 动作:允许
3. DNS解析及代理验证
- 确认公网DNS的A记录已生效:执行
nslookup argocd.my.dns.zone.net,检查返回IP是否为Firewall公网IP - 检查Firewall是否允许内部DNS流量:AKS依赖kube-dns做内部服务解析,需确保Firewall未阻止AKS子网到kube-dns IP的UDP 53端口流量
4. Ingress TLS配置验证
- 确认ArgoCD所在命名空间中存在
letsencrypt-prod-new-tls证书Secret,且证书未过期、域名与argocd.my.dns.zone.net匹配 - 查看Ingress Controller Pod日志,确认无TLS证书加载失败的报错信息
5. 路由表与AKS系统路由冲突
确认AKS子网关联的用户定义路由(UDR)未覆盖AKS内部服务的系统路由,比如集群内部IP段的访问路由,避免导致Ingress Controller无法解析ArgoCD服务
6. Firewall规则有效性验证
- 确认DNAT规则的目标IP为内部LB的正确私有IP,可通过
kubectl get svc <ingress-controller-svc-name>核对 - 检查Firewall是否有其他高优先级规则拦截了DNAT后的流量,确保DNAT规则(优先级100)能正常触发
内容的提问来源于stack exchange,提问作者Roy Zohar
相关产品推荐
相关产品推荐

