然后在控制台为 Service 新建一个对应的 Ingress 访问入口,如下图:
待配置生效后,在后端通过获取 HTTP Header 中的 X-Forwarded-For 或 X-Real-IP 字段值得到客户端真实源 IP。后端抓包测试结果示例如下:
场景二: 使用 Nginx Ingress 获取真实源 IP
Nginx Ingress 可以通过 TKE 应用商店、自定义 YAML 配置或使用官方(helm 安装)方式安装,原理和部署方法可参考文档 在 TKE 上部署 Nginx Ingress 中的部署方案一或方案三,若选择方案一部署,则需要修改 Nginx Ingress Controller Service 的 externalTrafficPolicy 字段值为 Local 。安装完成后,会在TKE控制台自动为 Nginx Ingress Controller 服务创建一个 CLB(四层)访问入口,如下图所示:
为要转发的后端服务创建一个 Ingress 资源并配置转发规则, 可以使用以下 YAML 创建:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx # ingressClass类为"nginx" name: example namespace: default spec: rules: # 配置服务转发规则 - http: paths: - backend: serviceName: nginx servicePort: 80 path: /待配置生效后,在后端获取 Http Header 中的 X-Forwarded-For 或 X-Real-IP 字段值得到客户端真实源 IP,后端抓包测试结果示例如下:
以上介绍的两种场景都可以满足获取客户端真实源 IP 的需求,且具有以下优点和缺点:
优点:在七层(HTTP/HTTPS)流量转发场景下比较推荐,可通过WEB服务代理的配置或后端应用代码直接获取 Http Header 中的字段即可拿到客户端真实IP,非常简单高效。
缺点:仅适用于七层(HTTP/HTTPS)流量转发场景,不适用于四层转发场景,如果是四层转发场景,请使用后面介绍的其他方式。
四、通过 TOA 内核模块加载获取真实源 IPTOA 内核模块原理和加载方式参考 全球应用加速 获取访问用户真实 IP - 操作指南 - 文档中心 - 腾讯云 文档。
优点:对于 TCP 传输方式,在内核层面且仅对 TCP 连接的首包进行改造,几乎没有性能损耗。
缺点:
需要在集群工作节点上加载 TOA 内核模块,且需在服务端通过函数调用获取携带的源 IP、端口信息,配置使用比较麻烦。
对于 UDP 传输方式,会对每个数据包改造添加 option 数据(源 IP 和源端口),带来网络传输通道性能损耗。
总结本文主要介绍了在TKE使用场景下服务端如何获取客户端真实源 IP,以满足用户相关使用场景的需求,用户可通过对比上述四几种方式的优点和缺点,选择适合实际需求场景的最佳方案。
参考资料腾讯云负载均衡器获取客户端真实 IP 介绍:负载均衡 如何获取客户端真实 IP - 最佳实践 - 文档中心 - 腾讯云
腾讯云负载均衡器介绍:负载均衡CLB负载均衡器弹性流量分发 - 腾讯云
在 TKE 上部署 Nginx Ingress: 在 TKE 上部署 Nginx Ingress - 最佳实践
TKE 容器服务网络模式介绍:容器服务 GlobalRouter 附加 VPC-CNI 模式说明 - 用户指南 - 文档中心 - 腾讯云
TKE 场景下 CLB 直通 Pod 使用介绍:在 TKE 上使用负载均衡直通 Pod - 最佳实践
TOA 模块使用介绍:全球应用加速 获取访问用户真实 IP - 操作指南 - 文档中心 - 腾讯云
Kubernets 设置外部负载均衡器说明:创建外部负载均衡器 | Kubernetes
【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!