在Kubernetes豆荚中怎么获取客户端的真实IP

  介绍

这篇文章主要介绍了在Kubernetes豆荚中怎么获取客户端的真实IP,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

Kubernetes依靠kube-proxy组件实现服务的通信与负载均衡。在这个过程中,由于使用了SNAT对源地址进行了转换,导致豆荚中的服务拿不到真实的客户端IP地址信息。本篇主要解答了在Kubernetes集群中负载如何获取客户端真实IP地址这个问题。

创建一个后端服务

服务选择

这里选择<代码> containous/whoami>

 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旋度
  接受:*/* 

集群环境

简单介绍一下集群的状况。集群有三个节点,一个主人,两个工人节点。如下图:

在Kubernetes豆荚中怎么获取客户端的真实IP”> </p> <h4>创建服务</h4> <ul类= <李>

创建企业空间,项目

如下图所示,这里将企业空间和项目命名为realip

在Kubernetes豆荚中怎么获取客户端的真实IP”> </p> <ul类= <李>

创建服务

这里创建无状态服务,选择<代码> containous/whoami 镜像,使用默认端口。

在Kubernetes豆荚中怎么获取客户端的真实IP”> </p> <ul类= <李>

将服务改为NodePort模式

编辑服务的外网访问方式,修改为NodePort模式。

在Kubernetes豆荚中怎么获取客户端的真实IP”> </p> <p>查看访问服务的NodePort端口,发现端口为31509 . </p> <p> <img src= <李>

访问服务

浏览器打开主节点的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改为当地模式可以解决这个问题。

打开服务的配置编辑页面

在Kubernetes豆荚中怎么获取客户端的真实IP”> </p> <p>将服务的externalTrafficPolicy设置为当地模式。</p> <p> <img src=在Kubernetes豆荚中怎么获取客户端的真实IP