这篇文章主要介绍了在Kubernetes豆荚中怎么获取客户端的真实IP,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
Kubernetes依靠kube-proxy组件实现服务的通信与负载均衡。在这个过程中,由于使用了SNAT对源地址进行了转换,导致豆荚中的服务拿不到真实的客户端IP地址信息。本篇主要解答了在Kubernetes集群中负载如何获取客户端真实IP地址这个问题。
引用>创建一个后端服务
服务选择
这里选择<代码> containous/whoami> 代码作为后端服务镜像。在Dockerhub的介绍页面,可以看到访问其80端口时,会返回客户端的相关信息。在代码中,我们可以在Http头部中拿到这些信息。
Hostname 6 e0030e67d6a:,, IP : 127.0.0.1 IP ::: 1 时间:IP 172.17.0.27 时间:IP , fe80:: 42: acff: fe11:1b GET /HTTP/1.1 主持人:0.0.0.0:32769 用户代理:/7.35.0旋度 接受:*/*集群环境
简单介绍一下集群的状况。集群有三个节点,一个主人,两个工人节点。如下图:
<李>
创建企业空间,项目
李>如下图所示,这里将企业空间和项目命名为realip
<李>
创建服务
李>这里创建无状态服务,选择<代码> containous/whoami 代码>镜像,使用默认端口。
<李>
将服务改为NodePort模式
李>编辑服务的外网访问方式,修改为NodePort模式。
<李>
访问服务
李>浏览器打开主节点的EIP + <代码>:31509 代码>时,返回如下内容:
主机名:myservice-fc55d766-9ttxt 知识产权:127.0.0.1 知识产权:10.233.70.42 RemoteAddr: 192.168.13.4:21708 GET /HTTP/1.1 主持人:dev.chenshaowen.com: 31509 用户代理:Chrome/86.0.4240.198 Safari/537.36 接受:text/html, application/xhtml + xml应用程序/xml; q=0.9,图像/avif,图像/webp图像/apng */*; q=0.8,应用程序/signed-exchange; v=b3; q=0.9 接受编码:gzip、缩小 接收语言:应用,zh型;q=0.9, en; q=0.8 饼干:lang=zh型; Dnt: 1 Upgrade-Insecure-Requests: 1可以看到RemoteAddr是主节点的IP,并不是访问客户端的真实IP地址。这里的主机指的是访问入口的地址,为了方便快速访问,我使用的是域名,并不影响测试结果。
直接通过norport访沙滩问获取真实IP
在上面的访问中,获取不到客户端真实IP的原因是SNAT使得访问SVC的源IP发生了变化。将服务的externalTrafficPolicy改为当地模式可以解决这个问题。
打开服务的配置编辑页面