首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有云提供商或LB的情况下获取实例内的客户端ip

如何在没有云提供商或LB的情况下获取实例内的客户端ip
EN

Stack Overflow用户
提问于 2019-12-26 12:37:09
回答 1查看 470关注 0票数 3

我需要在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],得到了同样的结果。

我的环境:

代码语言:javascript
复制
 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

我读过一些类似的问题[3] [4] [5],看起来答案是暗示给云提供商或LB的。

EN

回答 1

Stack Overflow用户

发布于 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-ForForwarded头。或者,考虑将服务器设计为不需要客户机IP --如果使用客户机IP对客户机进行身份验证或授权请求,则可以使用其他更多的云原生模式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59483886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档