共计 3450 个字符,预计需要花费 9 分钟才能阅读完成。
适用范围:腾讯云容器服务(Tencent Kubernetes Engine,TKE), 以下简称 TKE。
为什么须要获取客户端实在源 IP?
当须要能感知到服务申请起源去满足一些业务需要时,就须要后端服务能精确获取到申请客户端的实在源 IP,比方以下场景:
- 对服务申请的起源有做审计的需要,如异地登陆告警。
- 针对平安攻打或安全事件溯源需要,如 APT 攻打、DDoS 攻打等。
- 业务场景数据分析需要,如业务申请区域统计。
- 其余须要获取客户端地址的需要。
在 TKE 应用场景下如何获取客户端实在源 IP?
在 TKE 中默认的内部负载均衡器是 腾讯云负载均衡器,作为服务流量的拜访首入口,腾讯云负载均衡器会将申请流量负载转发到 Kubernetes 工作节点的 Kubernets Service(默认),此负载平衡过程会保留客户端实在源 IP(透传转发),但在 Kubernetes Service 转发场景下,无论是应用 iptbales 还是 ipvs 的负载平衡转发模式,转发时都会对数据包做 SNAT,即不会保留客户端实在源 IP,为了可能精确的获取到客户端的实在源 IP,在 TKE 应用场景下,次要有四种办法获取客户端实在源 IP,上面将一一开展介绍下。
一、通过 Service 资源的配置选项保留客户端源 IP
要启用保留客户端 IP 性能,可在 Service 资源中配置字段 Service.spec.externalTrafficPolicy
,此字段示意服务是否心愿将内部流量路由到节点本地或集群范畴的端点。有两个选项值:Cluster
(默认)和 Local
形式,如下图所示:
Cluster
示意暗藏了客户端源 IP,LoadBalancer
和 NodePort
类型服务流量可能会被转发到其余节点的 Pods;Local
示意保留客户端源 IP 并防止 LoadBalancer
和 NodePort
类型的服务流量转发到其余节点的 Pods,详情请参考 kubernets 设置内部负载均衡器阐明。相干 YAML 配置示例如下:
apiVersion: v1
kind: Service
metadata:
name: example-Service
spec:
selector:
app: example-Service
ports:
- port: 8765
targetPort: 9376
externalTrafficPolicy: Local
type: LoadBalancer
长处:只须要批改 Kubernets Service 资源配置即可。
毛病:会存在潜在的 Pods(Endpoints)流量负载不平衡危险。
二、通过 TKE 原生的 CLB 直通 Pod 转发模式获取
应用 TKE 原生反对的 CLB 直通 Pod 的转发性能(CLB 透传转发,并绕过 Kubernetes Service 流量转发),后端 Pods 收到的申请的源 IP 即是客户端实在源 IP,此形式无论是在四层还是七层服务的转发场景下都实用,转发原理如下图:
具体介绍和配置请参考文档 TKE 场景下腾讯云 CLB 直通 Pod 应用场景介绍。
长处 :TKE 原生反对的性能个性,只需在控制台依照文档配置即可。
毛病 :集群须要开启 VPC-CNI 模式网络,详情参考文档 VPC-CNI 模式阐明
三、通过 HTTP Header 获取
在七层(HTTP/HTTPS)服务转发场景下,能够通过获取 Http Header 中 X-Forwarded-For
和 X-Real-IP
字段的值来获取客户端实在源 IP,TKE 中有两种场景应用形式,原理介绍如下:
在场景一中,腾讯云负载均衡器(CLB 七层)默认会将客户端实在源 IP 放到 HTTP Header 的 X-Forwarded-For
和 X-Real-IP
字段,当服务流量在通过 Service 四层转发后会保留上述字段,后端通过 WEB 服务器代理配置或利用代码形式获取到客户端实在源 IP,详情参考请文档 负载平衡如何获取客户端实在 IP – 最佳实际 – 文档核心 – 腾讯云;
在场景二中,Nginx Ingress 服务部署须要 Nginx Ingress 能间接感知客户端实在源 IP,能够采纳保留客户端源 IP 的配置形式(详情参考 kubernets 设置内部负载均衡器阐明),或通过 CLB 直通 Pod 的形式(详情参考 TKE 场景下腾讯云 CLB 直通 Pod 应用场景介绍),当 Nginx Ingress 在转发申请时会通过 X-Forwarded-For
和 X-Real-IP
字段来记录客户端源 IP,后端能够通过此字段取得客户端实在源 IP。
上面具体介绍在 TKE 中两种场景的配置应用办法:
-
场景一:应用 TKE Ingress 获取实在源 IP
在 TKE 控制台先为工作负载创立一个主机端口拜访形式的 Service 资源,如下图:
而后在控制台为 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 内核模块加载获取实在源 IP
TOA 内核模块原理和加载形式参考 寰球利用减速 获取拜访用户实在 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
【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!