如何在NGINX Ingress Controller中基于源IP用if条件路由至对应K8s集群
基于源IP范围的内网跨K8s集群流量路由方案(Azure环境)
核心结论
单个集群的Ingress规则无法直接实现跨集群流量路由——Ingress仅负责当前集群内的流量分发,无法直接转发请求到外部集群端点。针对Azure内网场景,推荐以下几种可行方案:
方案1:Azure Front Door Premium(内部模式)
这是最适配的Azure原生方案,支持内网流量管控和源IP路由规则:
- 将Front Door Premium配置为内部模式,通过Azure Private Link关联两个K8s集群的内部端点(比如集群Ingress服务绑定的内部负载均衡器)
- 创建两条路由规则:
- 第一条规则匹配源IP范围
10.0.0.0/16,将请求转发至欧盟集群的后端池 - 第二条作为默认规则,将其他源IP的请求路由至美国集群的后端池
- 第一条规则匹配源IP范围
- 把abc.com的DNS记录指向Front Door的内部FQDN,实现内网用户的统一访问
方案2:Azure应用网关(WAF v2)+ 内部负载均衡器
若已部署应用网关,可基于现有组件扩展:
- 给两个K8s集群分别配置内部负载均衡器(ILB),暴露应用服务
- 将两个ILB添加为应用网关的后端池
- 在应用网关中配置路由规则:
- 针对源IP
10.0.0.0/16创建专属转发规则,指向欧盟集群后端池 - 设置默认规则,将其余流量转发至美国集群后端池
- 针对源IP
- 将应用网关设为内部模式,内网用户通过应用网关的内部IP访问abc.com(DNS对应该IP)
方案3:Azure Kubernetes Fleet Manager + 跨集群Ingress控制器
如果倾向于K8s原生方案:
- 用Azure Kubernetes Fleet Manager将两个集群组成联邦集群
- 部署支持跨集群路由的Ingress控制器(如NGINX Plus、Traefik联邦版)
- 在联邦Ingress资源中配置源IP路由规则,示例NGINX配置片段:
注:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cross-cluster-ingress annotations: nginx.org/server-snippets: | if ($remote_addr ~* ^10\.0\.0\..*) { proxy_pass http://eu-cluster-federated-service; } proxy_pass http://us-cluster-federated-service; spec: rules: - host: abc.com http: paths: - path: / pathType: Prefix backend: service: name: dummy-service port: number: 80eu-cluster-federated-service和us-cluster-federated-service是通过Fleet Manager配置的跨集群服务端点,需提前完成联邦服务暴露。
单个Ingress的临时折中方案(不推荐)
如果仅做临时测试,可将另一集群的服务通过Azure Private Link暴露为当前集群的内部服务,然后在Ingress注解中添加源IP判断片段:
annotations: nginx.ingress.kubernetes.io/server-snippet: | if ($remote_addr ~* ^10\.0\.0\..*) { proxy_pass http://eu-private-link-service; }
这种方式维护成本高,仅适合小规模临时场景,不建议作为长期架构。
内容的提问来源于stack exchange,提问作者Container-Man
相关产品推荐
相关产品推荐

