Kubernetes Ingress 进阶:如何基于来源 IP 实现精细化路由控制?

个人名片
在这里插入图片描述
🎓作者简介:java领域优质创作者
🌐个人主页码农阿豪
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[2435024119@qq.com]
📱个人微信:15279484656
🌐个人导航网站www.forff.top
💡座右铭:总有人要赢。为什么不能是我呢?

  • 专栏导航:

码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻
Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀

Kubernetes Ingress 进阶:如何基于来源 IP 实现精细化路由控制?

引言

在现代微服务架构中,Kubernetes Ingress 作为集群的入口网关,负责将外部请求路由到不同的后端服务。默认情况下,Ingress 支持基于 Host(域名) 和 Path(路径) 的路由规则,但某些业务场景(如灰度发布、IP 白名单访问、多线路流量调度)需要更精细的控制,例如 基于来源 IP(Source IP) 的路由。

本文将深入探讨:

  1. Kubernetes Ingress 默认路由机制
  2. 如何扩展 Ingress 以支持来源 IP 路由?
  3. 不同方案的实现方式及适用场景
  4. 代码示例与最佳实践

1. Kubernetes Ingress 默认路由机制

1.1 Ingress 基本概念

Ingress 是 Kubernetes 提供的 API 对象,用于管理外部访问集群服务的 HTTP/HTTPS 路由规则。它通常配合 Ingress Controller(如 Nginx、Traefik、Istio)使用,由 Controller 实现具体的流量转发逻辑。

1.2 标准 Ingress 规则

一个典型的 Ingress 配置如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: "foo.example.com"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: foo-service
            port:
              number: 80
  - host: "bar.example.com"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: bar-service
            port:
              number: 80

特点:

  • 基于 host(域名)和 path 路由。
  • 不支持直接基于来源 IP 的路由。

2. 为什么需要基于来源 IP 的路由?

2.1 典型业务场景

  1. IP 白名单访问控制:只允许特定 IP 访问管理后台。
  2. 多线路流量调度:电信用户访问服务 A,联通用户访问服务 B。
  3. 灰度发布:仅部分 IP 用户访问新版本服务。
  4. 安全防护:屏蔽恶意 IP 或 DDoS 攻击源。

2.2 技术挑战

Kubernetes Ingress 默认不提供 sourceIP 匹配规则,因此需要借助 Ingress Controller 扩展 或 上层代理 实现。


3. 实现方案对比

方案适用场景实现复杂度依赖组件
Nginx Ingress 注解简单 IP 匹配Nginx Ingress
自定义 Header + Ingress灵活但需前置代理负载均衡器 / CDN
Istio VirtualService高级流量管理Istio
云厂商 LB 规则云环境集成AWS ALB / Volcengine CLB

4. 方案 1:Nginx Ingress 扩展

4.1 使用 server-snippet 注解

Nginx Ingress 允许通过注解注入自定义 Nginx 配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ip-based-route
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
      if ($remote_addr ~ "1.2.3.4") {
        rewrite ^ /special-path break;
      }
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /special-path
        backend:
          service:
            name: special-service
            port:
              number: 80
      - path: /
        backend:
          service:
            name: default-service
            port:
              number: 80

说明:

  • $remote_addr 是客户端 IP。
  • 如果 IP 是 1.2.3.4,则重写到 /special-path,由 special-service 处理。

4.2 使用 configuration-snippet 精细化控制

annotations:
  nginx.ingress.kubernetes.io/configuration-snippet: |
    if ($remote_addr = "1.2.3.4") {
      set $proxy_upstream_name "default-special-service-80";
    }

适用场景:

  • 需要直接修改 upstream,而非重写路径。

5. 方案 2:自定义 Header + Ingress

5.1 前置代理设置 Header

如果流量经过 CDN / 负载均衡器(如 AWS ALB、Volcengine CLB),可以在该层注入自定义 Header:

X-Real-IP: 1.2.3.4

5.2 Ingress 匹配 Header

部分 Ingress Controller(如 Traefik)支持 Header 匹配:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: header-based-route
  annotations:
    traefik.ingress.kubernetes.io/request-headers: "X-Real-IP=1.2.3.4"
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        backend:
          service:
            name: special-service
            port:
              number: 80

6. 方案 3:Istio VirtualService

6.1 配置 VirtualService

Istio 提供了更强大的流量管理能力:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: route-by-ip
spec:
  hosts:
  - "example.com"
  http:
  - match:
    - headers:
        x-forwarded-for:
          exact: "1.2.3.4"
    route:
    - destination:
        host: special-service
  - route:
    - destination:
        host: default-service

说明:

  • 匹配 X-Forwarded-For 头(需确保代理层已设置)。
  • 适用于 Service Mesh 架构。

7. 方案 4:云厂商负载均衡器规则

7.1 AWS ALB 示例

# 通过 ALB Ingress 注解实现
metadata:
  annotations:
    alb.ingress.kubernetes.io/conditions.special-service: |
      [{
        "Field": "source-ip",
        "SourceIpConfig": {
          "Values": ["1.2.3.4/32"]
        }
      }]
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        backend:
          service:
            name: special-service
            port:
              number: 80

7.2 Volcengine CLB 规则

火山引擎 CLB 支持 基于源 IP 的流量调度,可在控制台配置:

  1. 创建监听规则,选择 IP 匹配。
  2. 将符合 IP 的请求转发到特定后端服务。

8. 最佳实践

  1. 优先使用 Nginx Ingress 注解(简单场景)。
  2. 云环境优先使用 LB 规则(高性能,低延迟)。
  3. Service Mesh 架构选择 Istio(高级流量管理)。
  4. 确保真实 IP 透传:
    • 在 Nginx Ingress 中启用 use-forwarded-headers
    • 在云 LB 中开启 X-Forwarded-For 支持。

9. 总结

本文介绍了 4 种实现 Kubernetes Ingress 基于来源 IP 路由的方案:

  1. Nginx Ingress 注解:适合简单 IP 匹配。
  2. Header + Ingress:需前置代理支持。
  3. Istio VirtualService:适用于 Service Mesh。
  4. 云厂商 LB 规则:云原生最佳实践。

选择建议:

  • 自建集群 → Nginx Ingress / Istio。
  • 云托管集群 → 直接使用云厂商 LB 功能。

通过合理选择方案,可以实现 精细化流量控制,提升业务安全性与可用性。

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农阿豪@新空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值