首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Kubernetes Ingress 进阶:如何基于来源 IP 实现精细化路由控制?

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

作者头像
用户8589624
发布2025-11-15 18:00:53
发布2025-11-15 18:00:53
870
举报
文章被收录于专栏:nginxnginx

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 配置如下:

代码语言:javascript
复制
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 配置:

代码语言:javascript
复制
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 精细化控制
代码语言:javascript
复制
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:

代码语言:javascript
复制
X-Real-IP: 1.2.3.4
5.2 Ingress 匹配 Header

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

代码语言:javascript
复制
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 提供了更强大的流量管理能力:

代码语言:javascript
复制
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 示例
代码语言:javascript
复制
# 通过 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 功能。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Kubernetes Ingress 进阶:如何基于来源 IP 实现精细化路由控制?
    • 引言
    • 1. Kubernetes Ingress 默认路由机制
      • 1.1 Ingress 基本概念
      • 1.2 标准 Ingress 规则
    • 2. 为什么需要基于来源 IP 的路由?
      • 2.1 典型业务场景
      • 2.2 技术挑战
    • 3. 实现方案对比
    • 4. 方案 1:Nginx Ingress 扩展
      • 4.1 使用 server-snippet 注解
      • 4.2 使用 configuration-snippet 精细化控制
    • 5. 方案 2:自定义 Header + Ingress
      • 5.1 前置代理设置 Header
      • 5.2 Ingress 匹配 Header
    • 6. 方案 3:Istio VirtualService
      • 6.1 配置 VirtualService
    • 7. 方案 4:云厂商负载均衡器规则
      • 7.1 AWS ALB 示例
      • 7.2 Volcengine CLB 规则
    • 8. 最佳实践
    • 9. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档