我需要在Kubernetes中获取客户端IP,但我只能获取Flannel内部IP 10.244.X.1 (通过$remote_addr在nginx中,$http_x_forwarded_for始终是-)。
网络拓扑为:
client browser -> k8s群集节点ip -> k8s服务(A) -> pod (需要客户端ip) ->其他服务
我在A中尝试过externalTrafficPolicy,但不起作用。它是只在云提供商上工作,还是在LB之后工作?[1]
我也尝试了ingress nginx [2],得到了同样的结果。
我的环境:
Kernel Version: 3.10.0-1062.4.1.el7.x86_64
OS Image: CentOS Linux 7 (Core)
Operating System: linux
Architecture: amd64
Container Runtime Version: docker://18.6.2
Kubelet Version: v1.16.2
Kube-Proxy Version: v1.16.2
Network Add-on: Flannel发布于 2019-12-26 13:50:51
Kubernetes服务以以下三种代理模式之一工作:用户空间、iptables和IPVS。我不熟悉IPVS,但是在用户空间和iptables模式下,NodePort和负载均衡器服务[docs]的客户端IP都会改变。
由于这种代理行为,客户端IP必然会改变,只有当客户端和服务器使用“更高层”协议,并且存在“更高层”代理时,才能保留数据,该代理可以捕获原始客户端IP并将其注入到请求中,然后再转发。如果客户端和服务器在使用HTTP,那么IaaS L7/HTTP(S)负载均衡器或nginx可以为您注入一些标准报头,但是如果您使用的是nginx-ingress,那么问题在于它位于NodePort或LoadBalancer服务之后,所以当它到达实际的nginx进程时,客户端IP已经被更改了。您需要在集群外部运行nginx才能使其正常工作。
如果你在公共云上运行,我认为大多数云的L7 LB解决方案都会为你注入这些开箱即用的X-Forwarded-For或Forwarded头。或者,考虑将服务器设计为不需要客户机IP --如果使用客户机IP对客户机进行身份验证或授权请求,则可以使用其他更多的云原生模式。
https://stackoverflow.com/questions/59483886
复制相似问题