在现代微服务架构中,Kubernetes Ingress 作为集群的入口网关,负责将外部请求路由到不同的后端服务。默认情况下,Ingress 支持基于 Host(域名) 和 Path(路径) 的路由规则,但某些业务场景(如灰度发布、IP 白名单访问、多线路流量调度)需要更精细的控制,例如 基于来源 IP(Source IP) 的路由。
本文将深入探讨:
Ingress 是 Kubernetes 提供的 API 对象,用于管理外部访问集群服务的 HTTP/HTTPS 路由规则。它通常配合 Ingress Controller(如 Nginx、Traefik、Istio)使用,由 Controller 实现具体的流量转发逻辑。
一个典型的 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 路由。Kubernetes Ingress 默认不提供 sourceIP 匹配规则,因此需要借助 Ingress Controller 扩展 或 上层代理 实现。
方案 | 适用场景 | 实现复杂度 | 依赖组件 |
|---|---|---|---|
Nginx Ingress 注解 | 简单 IP 匹配 | 低 | Nginx Ingress |
自定义 Header + Ingress | 灵活但需前置代理 | 中 | 负载均衡器 / CDN |
Istio VirtualService | 高级流量管理 | 高 | Istio |
云厂商 LB 规则 | 云环境集成 | 低 | AWS ALB / Volcengine CLB |
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。1.2.3.4,则重写到 /special-path,由 special-service 处理。configuration-snippet 精细化控制annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
if ($remote_addr = "1.2.3.4") {
set $proxy_upstream_name "default-special-service-80";
}适用场景:
如果流量经过 CDN / 负载均衡器(如 AWS ALB、Volcengine CLB),可以在该层注入自定义 Header:
X-Real-IP: 1.2.3.4部分 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: 80VirtualServiceIstio 提供了更强大的流量管理能力:
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 头(需确保代理层已设置)。# 通过 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火山引擎 CLB 支持 基于源 IP 的流量调度,可在控制台配置:
use-forwarded-headers。X-Forwarded-For 支持。本文介绍了 4 种实现 Kubernetes Ingress 基于来源 IP 路由的方案:
选择建议:
通过合理选择方案,可以实现 精细化流量控制,提升业务安全性与可用性。