个人名片
🎓作者简介: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) 的路由。
本文将深入探讨:
- Kubernetes Ingress 默认路由机制
- 如何扩展 Ingress 以支持来源 IP 路由?
- 不同方案的实现方式及适用场景
- 代码示例与最佳实践
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 典型业务场景
- IP 白名单访问控制:只允许特定 IP 访问管理后台。
- 多线路流量调度:电信用户访问服务 A,联通用户访问服务 B。
- 灰度发布:仅部分 IP 用户访问新版本服务。
- 安全防护:屏蔽恶意 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 的流量调度,可在控制台配置:
- 创建监听规则,选择 IP 匹配。
- 将符合 IP 的请求转发到特定后端服务。
8. 最佳实践
- 优先使用 Nginx Ingress 注解(简单场景)。
- 云环境优先使用 LB 规则(高性能,低延迟)。
- Service Mesh 架构选择 Istio(高级流量管理)。
- 确保真实 IP 透传:
- 在 Nginx Ingress 中启用
use-forwarded-headers
。 - 在云 LB 中开启
X-Forwarded-For
支持。
- 在 Nginx Ingress 中启用
9. 总结
本文介绍了 4 种实现 Kubernetes Ingress 基于来源 IP 路由的方案:
- Nginx Ingress 注解:适合简单 IP 匹配。
- Header + Ingress:需前置代理支持。
- Istio VirtualService:适用于 Service Mesh。
- 云厂商 LB 规则:云原生最佳实践。
选择建议:
- 自建集群 → Nginx Ingress / Istio。
- 云托管集群 → 直接使用云厂商 LB 功能。
通过合理选择方案,可以实现 精细化流量控制,提升业务安全性与可用性。