Ingress-Nginx 任务
目录
前提条件最大连接数请求超时会话亲和性(粘性会话)头部修改URL 重写HSTS(HTTP 严格传输安全)限流WAF转发头控制HTTPSTLS 重新加密并验证后端证书TLS 边缘终止透传默认证书在 IngressNginx 中添加 Pod 注解保留源 IP通过 HAProxy Proxy Protocol工作原理配置方法通过 MetalLB 配合 externalTrafficPolicy=Local工作原理配置方法前提条件
最大连接数
请求超时
会话亲和性(粘性会话)
头部修改
URL 重写
HSTS(HTTP 严格传输安全)
限流
WAF
转发头控制
HTTPS
TLS 重新加密并验证后端证书
TLS 边缘终止
透传
默认证书
使用以下 yaml 部署带有默认证书的 ingress-nginx
在 IngressNginx 中添加 Pod 注解
保留源 IP
当流量经过负载均衡器或代理时,原始客户端 IP 地址可能因 NAT(网络地址转换)而丢失。保留源 IP 对以下场景非常重要:
- 访问控制和安全策略
- 准确的日志记录和分析
- 基于客户端的限流
- 基于地理位置的路由
通过 HAProxy Proxy Protocol
工作原理
PROXY protocol 是一种网络协议,用于在代理 TCP 连接时保留客户端连接信息。它通过在 TCP 连接前添加一个包含原始源 IP 和端口的头部来实现。
流量流程:
- 客户端连接到 HAProxy 负载均衡器
- HAProxy 在连接中添加带有原始客户端 IP 的 PROXY protocol 头部
- Ingress-Nginx 接收连接并解析 PROXY protocol 头部
- Ingress-Nginx 从头部提取真实客户端 IP
- 后端应用在
X-Forwarded-For和X-Real-IP头部中接收到正确的客户端 IP
优点:
- 适用于任何支持 PROXY protocol 的负载均衡器(如 HAProxy、AWS NLB 等)
- 跨多个代理层保留源 IP
- 不影响路由或节点选择
注意事项:
- 负载均衡器和 Ingress-Nginx 都必须配置使用 PROXY protocol
- 一旦启用,所有到 Ingress-Nginx 的流量必须使用 PROXY protocol(混合使用会导致连接失败)
配置方法
配置 HAProxy 负载均衡器发送 PROXY protocol 头部,然后部署启用 proxy-protocol 支持的 ingress-nginx:
更多详情请参见 PROXY protocol 文档。
注意:HAProxy 可以使用 TCP 模式转发流量,无需处理 TLS 证书。由于 PROXY protocol 在 TCP 层工作,您可以让 Ingress-Nginx 直接处理 HTTPS 终止和证书管理,无需在 HAProxy 中配置证书。
通过 MetalLB 配合 externalTrafficPolicy=Local
工作原理
使用 Kubernetes Service 类型为 LoadBalancer 时,默认行为(externalTrafficPolicy: Cluster)会执行源 NAT,将客户端 IP 替换为节点 IP。设置 externalTrafficPolicy: Local 通过以下方式保留源 IP:
- 直接路由:流量仅路由到接收流量的同一节点上的 Pod
- 无 SNAT:kube-proxy 不执行源 NAT,保留原始客户端 IP
- 健康检查:只有具有健康本地 Pod 的节点才会被包含在负载均衡池中
流量流程:
- 客户端连接到 MetalLB 虚拟 IP
- MetalLB 直接将流量路由到有 Ingress-Nginx Pod 的节点
- 流量直接到达本地 Ingress-Nginx Pod,无 SNAT
- Ingress-Nginx 获取真实客户端 IP
- 后端应用在头部中接收正确的客户端 IP
优点:
- 配置简单,无需额外协议
- Kubernetes 原生特性
- 延迟低(无额外代理跳转)
注意事项:
- 负载分布不均:流量只能到达有本地 Pod 的节点,可能导致负载不均衡
- Pod 调度:Ingress-Nginx Pod 必须调度到 MetalLB 可路由的节点(使用 nodeSelector 保证一致)
- 健康检查行为:如果所有本地 Pod 不健康,节点将完全从负载均衡中移除
配置方法
部署带有 externalTrafficPolicy: Local 的 ingress-nginx,并确保 Pod 调度与 MetalLB 配置一致:
重要:nodeSelector 必须与 MetalLB 地址池配置中的节点匹配,确保 Ingress-Nginx Pod 调度到 MetalLB 能路由到的节点。
更多详情请参见 externalTrafficPolicy 文档。